VHDL+Verilog良好的代码编写风格

合集下载

VHDL语言编写规范

VHDL语言编写规范

VHDL语言编写规范VHDL语言编写规范目录目录 (1)1 目的 (2)2 范围 (2)3 定义 (2)4 规范内容:VHDL编码风格 (2)4.1 标识符(Identifiers)命名习惯 (2) 4.2 数据对象和类型 (4)4.3 信号和变量 (5)4.4 实体 (5)4.5 语句 (7)4.6 运算符(Operator) (10)4.7 function (10)4.8 procedure (11)4.9 类属( generics) (11)4.10 package (12)4.11 FSM(有限状态机) (12)4.12 Comments (12)4.13 TAB键间隔 (12)4.14 语句书写规范规定 (13)5 程序中的注释 (13)6 代码模块划分 (14)7 代码编写中容易出现的问题 (15)7.1 资源共享问题 (15)7.2 组合逻辑描述的多种方式 (15)7.3 考虑综合的执行时间 (16)7.4 避免使用Latch (16)7.5 多赋值语句案例:三态总线 (16)附录一VHDL保留字 (18)附录二函数书写实例 (19)附录三参数化元件实例 (20)附录四程序包书写实例 (21)1 目的编写该规范的目的是提高书写VHDL代码的可读性、可修改性、可重用性;优化代码综合和仿真结果,指导设计工程师使用VHDL 规范代码和优化电路,规范化公司的ASIC/FPGA 设计输入,从而做到:a、逻辑功能正确;b、可快速仿真;c、综合结果最优;d、可读性最好。

2 范围该规范设计VHDL编码风格、规定,编码中应注意的问题,VHDL 代码书写范例等,适用于所有的采用VHDL代码进行设计的项目。

3 定义VHDL:Very high speed IC Hardware Description Language,甚高速集成电路的硬件描述语言。

FSM:Finite Status Machine,有限状态机Simulate:仿真,通过输入激励在计算机上验证设计是否正确。

VHDL设计风格和实现

VHDL设计风格和实现

VHDL 设计风格和实现, 2000年6月10日 第 8 页
安全同步化异步输入一例 ——去抖动逻辑
延迟一个周期后才复位,确保D端输入脉冲至少 有一个周期的宽度,没有中间态
D
Q
D
Q
D
Q
同步输入
异步输入
R 异步输入的信号变化时机和宽度不确定, 有抖动(毛刺),不能直接被同步系统正确采样
系统时钟
设备外围
D CE Q D CE Q
Tcko+布线 +Tilo+布线 +Tilo + 布线 + Tilo +布线 + Tdick 布线 布线 布线 1.372+1.057+0.738+1.057+0.738+1.057+0.738+1.405+ 0.765 = 8.927ns 或者 110MHz
VHDL 设计风格和实现, 2000年6月10日 第 18 页
时延中包括时钟歪斜(Skew)
下面逻辑中,数据时延很小(最大3.6ns),如果时钟歪斜较小 ,该逻辑可以跑200MHz以上. 由于存在时钟歪斜,Flop B到Flop C的实际时延为 3.3+12.1-3.6=11.8ns,在100MHz下就不能工作. 计算速度时要考虑时钟歪斜的影响. 使用全局驱动,可以减少时钟歪斜. INPUT
1111
1000 计数器的操作为: 1000 因为MSB更快
此处的与门为电 平敏感
MSB
布线更短
flop 计数器
VHDL 设计风格和实现, 2000年6月10日 第 6 页
此处会产生毛刺,并且与 计数器的时钟无关
相应的VHDL代码

第8讲 VHDL的描述风格

第8讲 VHDL的描述风格

关于信号与变量
结构描述
VHDL 结构型描述风格是基于元件例化语句或生成 语句的应用,利用这种语句可以用不同类型的结构来完 成多层次的工程,即从简单的门到非常复杂的元件,包 括各种已完成的设计实体子模块来描述整个系统。 结构描述就是表示元件之间的互连这种描述,允许 互连元件的层次式安置像网表本身的构建一样。
ARCHITECTURE STRUCTURE OF COUNTER3 IS COMPONENT DFF PORT(CLK, DATA: IN BIT; Q: OUT BIT); END COMPONENT; COMPONENT AND2 PORT(I1, I2: IN BIT; O: OUT BIT); END COMPONENT; COMPONENT OR2 PORT(I1, I2: IN BIT; O: OUT BIT); END COMPONENT; COMPONENT NAND2 PORT(I1, I2: IN BIT; O: OUT BIT); END COMPONENT; COMPONENT XNOR2 PORT(I1, I2: IN BIT; O: OUT BIT); END COMPONENT; COMPONENT INV PORT(I: IN BIT; O: OUT BIT); END COMPONENT; SIGNAL N1, N2, N3, N4, N5, N6, N7, N8, N9: BIT;
层次化设计


详细地定义设计中的模块,使多个设计 者之间并行工作 对于每个模块,便于减少错误和Debug 可对每个模块单独仿真 分阶段完成设计
层次化设计举例
LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY BCD_Disply IS PORT ( Clrn,Clk : IN STD_LOGIC; s1,s0 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0) ) ; END ; ARCHITECTURE one OF BCD_Disply IS COMPONENT cnt10 PORT(Clrn,Clk: IN STD_LOGIC; q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); Co : OUT STD_LOGIC); END COMPONENT; COMPONENT decl7s PORT ( a : IN STD_LOGIC_VECTOR(3 DOWNTO 0); Led : OUT STD_LOGIC_VECTOR(6 DOWNTO 0) ) ; END COMPONENT;

VHDL代码书写规范

VHDL代码书写规范

VHDL代码书写规范(定稿)文件编号:编制:审核:可靠性审核:标准化:批准:文件会签页文件历史记录文件编号现行版本V1.0 文件标题VHDL代码书写规范文件履历版次编制日期更改内容(条款)V1.0V1.0目录1.目的 (1)2.范围 (1)3.术语说明 (1)4.书写规范 (1)4.1命名规范 (1)R1.一个文件只包含一个模块,文件命名和实体命名必须相同。

文件名大写,其后缀小写。

(1)R2.顶层文件命名方式使用工程名、器件型号与_TOP结合。

顶层文件的元件实例化,后缀使用_module;第二层文件的元件实例化,后缀使用_block;第三层之后不做定义(若遇到常见的基本逻辑电路或子模块,如:SRAM、FIFO等,那么优先使用具有代表性的名称) (1)R3.代码编写之前,以文档的方式,根据功能分类,分别对FPGA的外部端口进行命名约定。

(2)R4.命名要有实际意义。

(2)R5.命名标识符的首字符必须是字母,包含多个单词的标志符单词之间使用下划线分开。

信号、变量等的命名最后字符也一定要求是字母,中间的可以是数字或者其他合法符号。

(2)R6.模块、信号、变量等的命名不大于64个字符 (2)R7.实体、结构名、端口信号、常量用大写标识 (2)R8.行为级、结构级和数据流级结构命名分别以“BEH_实体名”、“STR_实体名”和“RTL_实体名”区分。

如果是混合使用,或者是分不清使用了那一种结构,那么就是用“ARC_实体名”命名。

(3)R9.单口RAM模块命名以SPRAM作后缀;双口RAM模块命名以DPRAM作后缀;ROM模块命名以ROM作后缀;FIFO模块命名以FIFO_作后缀;数字时钟管理模块命名以DCM作后缀;锁相环模块命名以PLL作后缀;乘法模块命名以MULT作后缀;除法模块命名以DIV作后缀;加法模块命名以ADD作后缀;减法模块命名以SUB作后缀。

(3)R10.模块实例化时,采用‘Un_xx_元件名’标识,cell实例化时使用‘Mn_xx_元件名’标识。

verilog语言编码风格

verilog语言编码风格

2.6
状态机编码设计风格 ....................................................................................... 16
2.6.1
几种编码方式 ..................................................................................... 16
1.3.3
函数和任务............................................................................................ 5
1.3.4
变量 ......................................................................................................... 5
2.4.1
敏感表的使用 ....................................................................................... 8
2.4.2
赋值 ......................................................................................................... 9
2.4.3 if 语句.......................................................................................................... 12

论VHDL语言的程序结构和描述风格

论VHDL语言的程序结构和描述风格
图3 ‘1’个数 计数器结 构体的数 据流描述
图4结构化描述法 的VHDL程序示 例 4.3结构( st r uc t ur al ) 描述
VHDL结构描述即逻辑元器件的连接描述, 它采用 并行处理 语句描述 设计实体 内的结构 组织 和元件 互连关系 。构造体 的结构化 描述法是 数字 系统层次化设计[ 2] 中常用的一种方法,其主要特点 如下:
( Ar c hi t ec t ur e) 描述一个设计的结构或行为,建立 设计的输入与输出之间的逻辑关系;利用配置 ( Conf i gur at i on) 技术,可以选取不同的结构体,这 样就 可以对同 一设计 任务进行 多种配 置的性能 实 验, 从而 选取性 能最优 的逻辑 实现 。
I SEND
得无从下手。 硬件描述语言主要有两个方面的应用【l ~2] :用
文档 语言的 形式描 述数字 设计以 及用于 系统的 仿 真、验证和设计综合等。目前应用最广泛的主要有 两种语言:Ver i l og- HDL和VHDL。Ver i l og- HDL 是一 种专门 为复杂 数字逻 辑电路 和系统 的设计 仿 真而开发的HDL语言,也可以说Ver i l og-HDL是 在应用最广泛的C语言的基础上发展起来的一种 硬件描述语言,由Cader i ce 公司1990年公开,并成 立了OVI ( Open Ver i l ogI nt er n at i ona l ) 组织来负责 其发展。VHDI 。语言是在20世纪80年代后期由 美国国防部开发的,美国军方研制专用集成电路所 指定的硬件描述语言。这两种语言均是I EEE的 工业标准硬件描述语言,且得到众多EDA公司的 支持,在电子工程领域,已成为事实上的通用硬件 描述语言。本文主要讨论VHDL语言。

verilog的代码规范和coding风格

verilog的代码规范和coding风格

verilog的代码规范和coding风格想要成为一名优秀的数字IC设计工程师需要哪些基本的专业知识呢?如下:1.半导体物理学、半导体器件物理学、基本的固体物理、半导体工艺与制造等物理学知识;2.电路分析、模拟电子线路、COMS模拟集成电路、专用集成电路基础等模拟IC知识;3.信号系统、数字信号处理、信道编码、通信原理等通信知识;4.C语言、汇编、C++、脚本(shell、tcl、perl)、Linux(我觉得如果懂kernel那就更好了)、体系结构、组成原理等计算机知识;5.各种EDA和编程调试工具的使用Modelsim、Debussy、quartus ii、Cadence、DC、vim等等(就数字方向而言用的最多的5种左右,模拟另当别论);另外虚拟机什么的总得玩得转吧!6.当然最重要的还是我们亲爱的--verilog,不会verilog(当然VHDL也是一样的)那你会别的也算不上优秀的Digital IC Engineer!verilog语法并不复杂,只是初学者容易犯一些“类C”错误,总会不经意间将verilog写成了C语言,或者是没有使用并行思想,或者就是多处赋值等等问题。

如果我们克服了之前的一些小毛病,在这些之外,我们想更近一步提升自己的写代码水平、研发水平,而不是只做一个码农的话那么我们要做的就是:第一步:提高代码规范性,每个企业、研究所可能都有自己的一套代码书写规范,但是总的来说都有一些共性,而且往往这些共性的地方还特别多,一个没有代码规范的程序员不可能写出非常漂亮和优秀的程序,当然有了规范的代码后也不一定就能写出漂亮和优秀的程序,这是两码事。

代码规范之后的一个境界我觉得是优良的编程风格,编程风格不同于代码规范,编程风格在verilog中特别指代那些逻辑上的风格,同样的功能,使用不同的编程风格,代码综合面积可能是几倍的关系,这一点我深有体会,另外,人们不经意间的编码习惯可能会导致许多冗余代码,在verilog综合之后,这些冗余就会成为实实在在多出来的不必要的电路,他们或者是寄存器或者是没用的组合逻辑,虽然往往DC一类的综合工具会对代码综合进行优化,并且会根据综合脚本进行最大化的优化计算,但是工具毕竟是工具,他不可代替人类,很多冗余电路综合工具并没有办法进行优化,因为工具并不知道你的本意,也不可完全进行语意预测,而不必要的电路意味着更多的流片成本,更低的work效率和更多的功耗消耗,这些都不是我们想看到的,所以一个好的coding风格本身对于企业来说就是非常大的价值!!!当然我认为要培养良好的coding风格并不是一件容易的事,本身 verilog design == 电路设计,透过代码看电路这个能力并不是一蹴而就的,这需要我们的长期的学习和思考总结,就像模拟设计一样,往往这是一种经验!。

VHDL与Verilog语言

VHDL与Verilog语言

VHDL与Verilog语言VHDL(VHSIC hardware description language)和Verilog是用于电子系统设计的硬件描述语言(HDL)。

这两种语言被广泛应用于数字逻辑设计和仿真,以及硬件描述、验证和综合。

1. VHDL(VHSIC hardware description language)VHDL是一种结构化的硬件描述语言,最初由美国国防部高速集成电路计划办公室(VHSIC,Very High Speed Integrated Circuits)开发。

VHDL以其强大的功能和灵活性而闻名,并被广泛用于数字系统的设计和验证。

VHDL的编写包括实体(Entity)和体(Architecture)两个主要部分。

实体部分描述了数字系统的输入输出接口、信号和组件的声明,而体部分描述了实体的内部结构、信号处理和逻辑功能。

VHDL具有丰富的数据类型、运算符和控制结构,可以方便地描述数字电路的行为和结构。

它还提供了强大的仿真和验证功能,使设计人员能够在开发和测试阶段快速迭代和调试设计。

2. VerilogVerilog是一种硬件描述语言,最初由Gateway Design Automation公司(现在是Cadence Design Systems的一部分)开发。

Verilog以其简洁的语法和易学易用的特性而受到广泛欢迎,并成为工业界标准。

Verilog的设计由模块(Module)组成,每个模块描述了一个黑盒子,包含输入和输出端口以及内部的逻辑功能。

模块可以进行层次化组合,从而实现较复杂的系统级设计。

Verilog的语法类似于C语言,具有类似的数据类型、运算符和控制结构。

它还提供了时序建模的能力,使设计人员能够描述数字电路的时序行为。

3. VHDL与Verilog的比较VHDL和Verilog在语法和功能上有一些区别,但它们都可以用于数字电路的设计和仿真。

以下是它们之间的一些比较:3.1 语法风格VHDL采用结构化的编程风格,需要明确的体、过程和信号声明,可以更好地控制和描述系统的结构和行为。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VHDL+Verilog良好的代码编写风格(二十五条)
田Sir 发表于: 2010-4-28 13:56 来源: 湖北师范学院电工电子实验教学示范中心良好代码编写风格可以满足信、达、雅的要求。

在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。

良好代码编写风格的通则概括如下:(1)对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写;
(2)使用有意义的信号名、端口名、函数名和参数名;
(3)信号名长度不要太长;
(4)对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk 作为时钟信号的前缀;(5)对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字;
(6)对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。

注意在同一个设计中要使用同一个小写字母表示低电平有效;
(7)对于复位信号使用rst 作为信号名,如果复位信号是低电平有效,建议使用rst_n;
(8)当描述多比特总线时,使用一致的定义顺序,对于verilog 建议采用bus_signal[x:0]的表示;
(9)尽量遵循业界已经习惯的一些约定。

如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等;
(10)在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等;(11)使用适当的注释来解释所有的always 进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。

注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂;
(12)每一行语句独立成行。

尽管VHDL 和Verilog 都允许一行可以写多个语句,当时每个语句独立成行可以增加可读性和可维护性。

同时保持每行小于或等于72 个字符,这样做都是为了提高代码得可读性;(13)建议采用缩进提高续行和嵌套语句得可读性。

缩进一般采用两个空格,如西安交通大学SOC 设计中心2 如果空格太多则在深层嵌套时限制行长。

同时缩进避免使用TAB 键,这样可以避免不同机器TAB 键得设置不同限制代码得可移植能力;
(14)在RTL 源码的设计中任何元素包括端口、信号、变量、函数、任务、模块等的命名都不能取Verilog 和VHDL 语言的关键字;
(15)在进行模块的端口申明时,每行只申明一个端口,并建议采用以下顺序:输入信号的clk、rst、enables other control signals、data and address signals。

然后再申明输出信号的clk、rst、enalbes other control signals、data signals;
(16)在例化模块时,使用名字相关的显式映射而不要采用位置相关的映射,这样可以提高代码的可读性和方便debug 连线错误;
(17)如果同一段代码需要重复多次,尽可能使用函数,如果有可能,可以将函数通用化,以使得它可以复用。

注意,内部函数的定义一般要添加注释,这样可以提高代码的可读性;
(18)尽可能使用循环语句和寄存器组来提高源代码的可读性,这样可以有效地减少代码行数;
(19)对一些重要的always 语句块定义一个有意义的标号,这样有助于调试。

注意标号名不要与信号名、变量名重复;
(20)代码编写时的数据类型只使用IEEE 定义的标准类型,在VHDL 语言中,设计者可以定义新的类型和子类型,但是所有这些都必须基于IEEE 的标准;
(21)在设计中不要直接使用数字,作为例外,可以使用0 和1。

建议采用参数定义代替直接的数字。


时,在定义常量时,如果一个常量依赖于另一个常量,建议在定义该常量时用表达式表示出这种关系;(22)不要在源代码中使用嵌入式的dc_shell 综合命令。

这是因为其他的综合工具并不认得这些隐含命令,从而导致错误的或较差的综合结果。

即使使用Design Compiler,当综合策略改变时,嵌入式的综合命令也不如放到批处理综合文件中易于维护。

这个规则有一个例外的综合命令,即编译开关的打开和关闭可以嵌入到代码中;
(23)在设计中避免实例化具体的门级电路。

门级电路可读性差,且难于理解和维护,如果使用特定工艺的门电路,设计将变得不可移植。

如果必须实例化门电路,我们建议采用独立于工艺库的门电路,如SYNOPSYS 公司提供的GTECH 库包含了高质量的常用的门级电路;
(24)避免冗长的逻辑和子表达式;
(25)避免采用内部三态电路,建议用多路选择电路代替内部三态电路。

相关文档
最新文档