VHDL+Verilog良好的代码编写风格
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 设计风格和实现, 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的描述风格

关于信号与变量
结构描述
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代码书写规范(定稿)文件编号:编制:审核:可靠性审核:标准化:批准:文件会签页文件历史记录文件编号现行版本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语言编码风格

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语言的程序结构和描述风格

图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风格想要成为一名优秀的数字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(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采用结构化的编程风格,需要明确的体、过程和信号声明,可以更好地控制和描述系统的结构和行为。
verilog编写风格

一、较为详细的注释;
如
二、分开注释外部I/O寄存器还是内部寄存器;
目的:在于为后面的同步时序提供基础,或者说其他类似的写法,比如二段式或三段式状态机的实现。
偏于维护,修改。
如
三、计数器或者说是分频器的实现。
最好将需要分配的状态值,用参数值来说明。
便于修改,阅读。
如:
四、状态机的标准符,标准字。
用独热码实现,(主要是为以后用FPGA实现大型工程养成练好习惯),当然,对于较小型的项目,能够用CPLD实现的,一般采用二进制编码或格雷码。
原因在于:FPGA属于触发器实现的,而CPLD主要是属于组合逻辑。
如:
五、状态机的写法:最佳采用二段式和三段式,包括同步时序的写法,主要是为了解决一段式所带来的可能出现毛刺的问题。
如:
六、标准位的设定,实现;主要用于状态机中得语句判断情况。
或者说是下一个状态来到的标准位。
如:
七、对于大型的工程一般采用原理图的形式实现其顶层的构架,其包括的各个模块,一般利用verilog语言实现,生成原理图文件。
这样的好处在于:便于多人的协作或者说是可以调用以前已经完成的模块。
节省开发时间,也便于修改。
原理图给人整体的效果更加直观。
FPGA代码编写风格规范

(24) 避免冗长的逻辑和子表达式;
(25) 避免采用内部三态电路,建议用多路选择电路代替内部三态电路。
(8) 当描述多比特总线时,使用一致的定义顺序,对于verilog建议采用bus_signal[x:0]的表示;
(9) 尽量遵循业界已经习惯的一些约定。如*_r表示寄存器输出,*_a表示异步信号,*_pn表示多周期路径第n个周期使用的信号,*_nxt表示锁存前的信号,*_z表示三态信号等;
(10) 在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等;
(19) 对一些重要的always语句块定义一个有意义的标号,这样有助于调试。注意标号名不要与信号名、变量名重复;
(20) 代码编写时的数据类型只使用IEEE定义的标准类型,在VHDL语言中,设计者可以定义新的类型和子类型,但是所有这些都必须基于IEEE的标准;
(21) 在设计中不要直接使用数字,作为例外,可以使用0和1。建议采用参数定义代替直接的数字。同时,在定义常量时,如果一个常量依赖于另一个常量,建议在定义该常量时用表达式表示出这种关系;
(11) 使用适当的注释来解释所有的always进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂;
Verilog语言良好的代码编写格式

Verilog语言良好的代码编写格式Verilog 及VHDL良好的代码编写风格良好代码编写风格可以满足信、达、雅的要求。
在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。
良好代码编写风格的通则概括如下:(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代码书写规范

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_元件名’标识。
VerilogHDL代码书写规范

Revision History ﹕99-08-01
Revision 1.0 Email ﹕ M@ Company ﹕ swip Technology .Inc
Copyright(c) 1999, swip Technology Inc, All right reserved
\*
y 用连贯的缩写
1
长的名字对书写和记忆会带来不便 甚至带来错误 采用缩写时应注意同一信号在模 块中的一致性 缩写的例子如下
Addr address Pntr pointer Clk clock Rst reset
y 用最右边的字符下划线表示低电平有效 高电平有效的信号不得以下划线表示 短暂
的引擎信号建议采用高有效 如 Rst_ Trdy_, Irdy_ Idsel.
Sun Microsystems Revision 1.0
5 规范内容 5.1 Verilog 编码风格
本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级 RTL behavioral, gate_level) 也适用于出于仿真 综合或二者结合的目的而设计的模块
5.1.1 命名的习惯
FSM 有限状态机
伪路径 静态时序分析 STA 认为是时序失败 而设计者认为是正确的路径
4 引用标准和参考资料
下列标准包含的条文 通过在本标准中引用而构成本标准的条文 在标准出版时 所示版本
均为有效 所有标准都会被修订 使用本标准的各方应探讨 使用下列标准最新版本的可能性
Verilog Style and Coding Guidelines Actel HDL Coding Style Guider
Input [199:0] Vector1, Vector2;
1--VHDLVerilogHDL设计_选择VHDL还是verilog HDL?

3 VHDL/Verilog HDL设计基于VHDL/Verilog HDL 描述语言具有不同的优缺点,两者可以互为补充。
为此我们不强制规定开发人员使用的描述语言种类。
基于混合设计的趋势,建议开发人员熟悉两者描述语言,方便同事间开发设计相互借鉴和学习。
3.1编程风格(Coding Style)要求3.1.1文件(1)建议每个进程(process)或(always)一般应存在于单独的源文件中,通常源文件名与所包含实体(entity)或模块名(module)相同。
(2)整个体系结构中,同一信号用相同的名字表示;(3)参数和文本宏的常数名字用大写字母表示;端口、信号、结构体和实例名字用小写表示;(4)实例名字和模块名字必须一致;(5)多位总线描述位数顺序必须一致,eg [X..0](6)每个源文件代码不能超过1000行代码(包括注释)。
(7)每个设计文件开头应包含如下注释内容:(中文描述)●年份及公司名称。
●作者。
●文件名。
●所属项目。
●顶层模块。
●模块名称及其描述。
●修改纪录。
3.1.2大小写(1)对于VHDL系统保留字全部大写。
(2)对于Verilog HDL系统保留字全部小写。
3.1.3标识符(1)标识符采用传统C语言的命名方法,即在单词之间以“_”分开,如:max_delay、data_size等等。
(2)文件名和其他命名只能用字母、数字和下划线;名字必须以字母开头. Verilog名字区分大小写;而VHDL不区分大小写;(3)所有对象名字不能超过32个字母;(4)采用有意义的、能反映对象特征、作用和性质的单词命名标识符,以增强程序的可读性。
时钟用clk表示,复位rst表示;_n表示低电平有效;状态机变量表示如fsm_cs;锁存器变量表示in_lat;异步信号表示名字_a;三态信号表示_z;(5)Verilog/vhdl中的关键词被禁止使用;(6)为避免标识符过于冗长,对较长单词的应当采用适当的缩写形式,如用‘buff’代替‘buffer’,‘ena’代替‘enable’,‘addr’代替‘address’等。
Verilog开发代码风格积累

Verilog开发代码风格积累1、always块代码风格(1)⼀个always块内最好只对同⼀个变量进⾏赋值;(2)同⼀个信号不要在不同的always块中进⾏赋值,这样的好处是,当修改⼀个变量的赋值,不会影响其他变量,逻辑更清晰,更适⽤于代码量⼤的⼯程;当有需要时,可使⽤间接赋值的⽅法,即在⼀个always中设⼀个flag,另⼀个always中通过判断这个flag来进⾏赋值;(3)不是同⼀类的信号,最好分开在不同的always块中进⾏赋值操作,可增强代码的可维护性和可读性。
2、RTL可综合代码中尽量不⽤for循环级代码中。
每个变量独⽴占⽤寄存器资源,不能有效复⽤逻辑资源。
for循环可以⽤在描述测试激励的⽂件中,for循环不要⽤在可综合的RTL级代码中可综合电路中遇到循环算法时,通常做法是先搞清楚设计的时序要求,做⼀个reg型计数器,在每个时钟沿累加,并在每个时钟沿处判断计数器情况作出相应处理。
3、关于FPGA中乘法除法逻辑实现FPGA中,⼀般不⽤*和/实现乘法和除法,原因*乘法在FPGA综合时,⼀类是使⽤FPGA设备⾃⾝的硬件乘法实现,但是FPGA硬件乘法块个数有限,不能滥⽤;⼀类是使⽤组合逻辑以逻辑门的⽅法实现,会消耗⼤量组合逻辑资源。
可以使⽤FPGA⾃带的乘法器IP核,或者⾃⼰花费逻辑资源,使⽤硬件描述语⾔设计效率较⾼的软乘法器。
4、if条件列表中尽量少写多位宽数据if条件列表会转换成查找表(查找表是FPGA中组合逻辑实现的基本单元,查找表使⽤多了会增加组合逻辑时延),所以在if条件列表中尽量少写多位宽数据。
5、关于新旧版本的模块接⼝声明最好不⽤旧的Verilog1995版本声明输⼊输出接⼝,建议使⽤新的Verilog2001版本规范声明输⼊输出接⼝,⽐如:module fsm(input wire sclk,input wire rst_n,output reg K);6、关于变量的声明位置变量声明区域,否则可能不建议在模块内部语句的中间穿插定义/声明变量,变量的定义和声明最好都集中在紧挨接⼝下⾯的变量声明区域导致编译器编译错误。
6 Verilog hdl设计的层次与风格

26
基本时序设计例子
D-FF designs(基本D触发器)
module DFF(Q, D, CLK); output Q; input D, CLK; reg Q; always @(posedge CLK) begin Q <= D; end endmodule
27
设计一个基本的D触发器,JK触发器 用行为描述设计一个4选1选择器
10
数据流描述
数据流描述方式主要使用持续赋值语句,多用 于描述组合逻辑电路,其格式为: assign LHS_net=RHS_expression; 右边表达式中的操作数无论何时发生变化,都 会引起表达式值的重新计算, 并将重新计算后 的值赋予左边表达式的net型变量。
Verilog HDL 设计的层次与风格
1
行为描述方式
过程块
连续赋值语句 模块实例语句
模块
结构描述方式
基本原语实例语句
数据流描述方式
2
结构描述
在Verilog程序中可通过如下方式描述电路的结构
◆ 调用Verilog内置门元件(门级结构描述) ◆ 调用开关级元件(晶体管级结构描述) ◆ 用户自定义元件UDP(也在门级)
6
练习
用结构描述设计一个基本的D触发器,JK触发器 用结构描述设计一个4选1选择器
7
行为描述
就是对设计实体的数学模型的描述,其抽象程度 远高于结构描述方式。行为描述类似于高级编程 语言,当描述一个设计实体的行为时,无需知道 具体电路的结构,只需要描述清楚输入与输出信 号的行为,而不需要花费更多的精力关注设计功 能的门级实现。
3
Verilog的 内置门元件
最流行的硬件设计语言,VHDL和Verilog比较

最流行的硬件设计语言,VHDL和Verilog比较
当前最流行的硬件设计语言有两种,即VHDL 与Verilog HDL,两者各有优劣,也各有相当多的拥护者。
VHDL 语言由美国军方所推出,最早通过国际电机工程师学会(IEEE)的标准,在北美及欧洲应用非常普遍。
而Verilog HDL 语言则由Gateway 公司提出,这家公司辗转被Cadence所购并,并得到Synopsys的支持。
在得到这两大EDA 公司的支持后,也随后通过了IEEE 标准,在美国、日本及中国台湾地区使用非常普遍。
我们把这两种语言具体比较下:
1.整体结构
点评:
两者结构基本相似,并行语句的种类也类似;
VHDL语言需要进行大量说明,程序通常比较长;
Verilog HDL通常不进行说明,或只进行非常简短的说明,程序比较简短。
2.数据对象及类型
VHDL
常量信号变量 9种预定义类型各类用户定义类型
可描述各类不同的量
必须进行类型说明
运算时必须考虑类型的一致性和适用性
Verilog HDL
常量:数量,参量
变量:网络型寄存器型
类型种类少
运算时所受的约束少
3.运算符号。
电子设计自动化第6章 VHDL的描述语句与描述风格

第6章 VHDL的描述语句与描述风格 如果把该程序改写成例6-5的程序,执行的功能是一样的。
【例 6-5】
USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux4bak IS PORT( input: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
第6章 VHDL的描述语句与描述风格
6.1.1 赋值语句 在进程、子程序中的赋值语句包括变量赋值语句与信号赋
值语句两种。变量赋值与信号赋值虽然都是在顺序语句中,但 赋值的过程有不同之处。变量具有局部特征,它的赋值是立即 发生的,是一种时间延迟为零的赋值行为。信号具有全局性特 征,它不但可以作为一个设计实体内部各单元之间数据传送的 载体,而且可通过信号进行实体间通信。信号在顺序语句中的 赋值不是立即发生的,它发生在一个进程结束时或子程序调用 完成以后。信号的赋值过程总有一定的延时,它反映了硬件系 统的重要特性,综合后可以找到与信号对应的硬件结构,如一 根传输导线、一个输入/输出端口或一个D触发器等。变量赋值 与信号赋值的语法格式如下:
第6章 VHDL的描述语句与描述风格
【例6-3】 IF(a=‘1’) THEN
c<=b; ELSE
c<=d; END IF; 如果a='1'则执行c<=b;否则执行c<=d,然后执行后续语句。
第6章 VHDL的描述语句与描述风格
(3) 格式 3: IF 条件 THEN 顺序执行语句; ELSIF 条件 THEN 顺序执行语句; ELSIF 条件 THEN 顺序执行语句; ELSIF 条件 THEN 顺序执行语句;
END mux4; ARCHITECTURE be_mux4 OF mux4 IS
VHDL和VERILOG的比较——很好

VHDL 与 Verilog HDL 的对比
4.主要运算:逻辑运算 VHDL中 有常用的6种,可以对1位的逻辑量 或逻辑数组进行运算; Verilog HDL中有3类共14种,分为一般逻辑 运算,位逻辑运算,缩减逻辑运算;
(对wire类型变量) 例: assign y = a & c
assign f = x + y
VHDL 与 Verilog HDL 的对比
6.并行语句 :元件语句 VHDL 元件语句
(需在结构体中进行说明) Verilog HDL 门原语、元件例化语句
(无需说明,只需调用相应的工作库) 例:module reg8(qout,in,clk,clear)
reg8 myreg(accout,sum,clk,clear)
VHDL 与 Verilog HDL 的对比
6.并行语句 :进程语句
VHDL
Verilog HDL
process (敏感表) always @(敏感表)
begin
begin
顺序语句;
顺序语句;
end process;
end
VHDL 与 Verilog HDL 的对比
Verilog HDL ' include
VHDL 与 Verilog HDL 的对比 9. 简单模块的对比: 8位4选1MUX
VHDL 与 Verilog HDL 的对比 9. 简单模块的对比: 8位4选1MUX
VHDL 与 Verilog HDL 的对比 9. 简单模块的对比: 8位加法器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)避免采用内部三态电路,建议用多路选择电路代替内部三态电路。