VerilogHDL 编程规范培训050719

上传人:206****923 文档编号:91267457 上传时间:2019-06-27 格式:DOC 页数:12 大小:5.16MB
返回 下载 相关 举报
VerilogHDL 编程规范培训050719_第1页
第1页 / 共12页
VerilogHDL 编程规范培训050719_第2页
第2页 / 共12页
VerilogHDL 编程规范培训050719_第3页
第3页 / 共12页
VerilogHDL 编程规范培训050719_第4页
第4页 / 共12页
VerilogHDL 编程规范培训050719_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《VerilogHDL 编程规范培训050719》由会员分享,可在线阅读,更多相关《VerilogHDL 编程规范培训050719(12页珍藏版)》请在金锄头文库上搜索。

1、VerilogHDL 编程规范1. 目的本规范的目的是提高书写代码的可读性、可修改性、可重复性,优化代码综合和仿真的结果,规范化公司的ASIC设计输入。从而做到:逻辑功能正确,可快速仿真,综合结果最优,可读性较好。2. 范围本规范涉及VerilogHDL编码风格,编码中应注意的问题,Testbench的编码等。本规范适用于Verilog model的任何一级(RTL,behavioral,gate_level),也适用于出于仿真、综合或二者结合的目的而设计的模块。3. 定义FSM: 有限状态机伪路径:静态时序分析(STA)认为是时序失败,而设计者认为是正确的路径。4. 规范内容4.1 Veri

2、logHDL编码风格本规范适用于Verilog model的任何一级(RTL,behavioral,gate_level),也适用于出于仿真、综合或二者结合的目的而设计的模块。4.1.1 命名的习惯 命名包含信号或变量出处、有效状态等基本含义。1. 有效而有意义的名字有效的命名并不一定要求将功能描述出来。如For (I=0;I1024;I=I+1)指针I就没有必要用loop_index作为指针名。2. 用连贯的缩写例如: Addr address;Patr poiter;Clk clock ; Rst reset3. 用最右边的字符下划线表示低电平有效,高电平有效的信号不得用下划线表示。如:R

3、st_, Trdy_, Irdy, Idel4. 大小写原则名字的首字符大写,其余小写(但是parameter, integer 定义的数值名要全部大写,例如 parameter CYCCLE=10.),两个词之间要用下划线。例如:Data_in5. 全局信号的名字中应包含信号来源的一些信息。如:D_addr7:2中的”D”指明了地址是解码模块(Decoder module)中的地址。6. 同一信号在不同层次上应保持一致性。7. 避免使用保留字。如:in、out、x、z等不能作为变量、端口或模块名。添加有意义的后缀,使信号更加明确。如表1所示。表 1 4.1.2 Modules1 .顶层模块应

4、只是内部模块间的互连。 在没有被调用的(顶层)模块中,除了内部的互连和模块的调用外,尽量再做中间逻辑,如不能再出现对reg变量的赋值等。目的是为了更有效的综合,因为顶层模块中出现了中间逻辑,Synopsys的design compoler 就不能把子模块中的逻辑综合到最优。2. 模块应在开始处注明文件名、功能描述、引用模块、设计者、设计时间及版权信息等。例如:/*= = = = = = = = = = = = = = = = = = = = = * Filename: RX_MUX.v Author : DongSheng Liu Description: Called by: Top mod

5、ule Revision History : 2005-4-4 Revision 1.0 Company : whicc*= = = = = = = = = = = = = = = = = = = = = */3.不要对Input进行驱动,在module内不要存在没有驱动的信号,更不能在模块端口中出现没有驱动的输出信号,避免在elaborate 和 compile时产生warning,干扰错误定位。!4. 每行限制在80个字符以内。5. 用一个时钟的上升沿或下降沿采样信号,不能一会用上升沿,一会用下降沿。如果既要用上升沿,又要用下降沿,则应分成两个模块设计。建议在顶层模块中对Clock做一非门

6、,在层次模块中如果要用时钟下降沿可以用非门产生的Posedge Clk_,这样做的好处使得在整个设计中采用同一种时钟沿触发,有利于综合。6. 在模块中要用明了的注释。对信号、参量、引脚、模块、函数及进程等加以说明,便于阅读和维护。7. Module 名要大写,且应与文件名一致。如:Module CRC( );8. 模块输出寄存器化(如图1所示),使得输出的驱动强度和输入的延迟可以预测,从而使得模块额综合过程简单。图 1 A. 输出驱动强度都等于平均的触发器驱动强度;B. 输入延迟始终等于通过触发器的路径,近于相等。9. 将关键路径逻辑和非关键路径逻辑放在不同模块。保证DC可以对关键路径模块实现

7、速度优化,而对非关键路径模块实施面积优化。在同一模块DC无法实现不同的策略。10. 将相关的组合逻辑放在同一模块。有助于DC对其进行优化,因为DC通常不能越过模块的边界来优化逻辑。11. 电路中调用的module名用TRxx标示。4.1.3 Net and Register1. 一个reg变量只能在一个always语句中赋值。2. 对任何一个Register的赋值要加单位延迟,对异步复位可以不加。3. 向量的有效位的顺序一般是从大到小。尽管有效位的顺序是自由的。但不利代码的维护。如Data -4:0,则LSB-1-2-3-4MSB,或Data0:4,则LSB4321MSB.推荐用Data4:0

8、。4. 对net和register类型的输出要做声明。否则,Verilog将假定它是一个宽的wire变量。4.1.4 Expression1. 用括号来表示执行的优先级。方便阅读。2. 用一个函数(function)来代替表达式的多次重复。如果代码中发现多次使用一个特殊的表达式,那么就用一个函数来代替,这样在以后的版本升级时更便利,这种概念在行为级的代码设计时同样使用,经常使用的一组描述可以写到一个任务(task)中。4.1.5 IF语句1. 每个If语句都应有一个else语句和它对应。没有else语句会使综合出的逻辑和RTL级的逻辑不同。如果条件为假时,则用一条空语句。例如:If (ab)b

9、egin V1=2b01; V2=2b02;EndElse :;2. 如果变量在If-else语句或case语句中做非完全赋值,则应该没有赋值的变量一个缺省值。4.1.6 case语句 case语句通常综合成一级多路复用器,如图2的右边部分所示,而If语句则综合成优先编码的串接的多个多路复用器,如图2的左边部分所示。通常,使用case语句比if语句快,优先编码的结构仅在信号的到达有先后时使用。Case语句比if条件赋值语句快。 所有的case语句应该有一个default case,允许空语句 Default :; 图 2 4.1.7 Writing functions1. 在function的

10、最后给function赋值。 Funtion CompareVectors; / (Vector1, Vector2,Length) Input 199:0 Vector1, Vector2; Input 31:0 Length; /local variables Integer i; Reg Equal;Begin i=0; Equal=1 While(iLength) & Equal) begin If(Vector2i!=1bx) begin If (Vector1i!= Vector2i); Else;EndI=i+1;End CompareVectos=Equal;Endfuncti

11、on2. 函数中避免使用全局变量,否则容易引起HDL行为级仿真和gate级仿真的差异。如: 上述程序中使用了全局变量ByteSel可能无意在别处修改了,导致错误结果,最好直接在端口加以定义。4.1.8 Assignment Verilog支持两种赋值:过程赋值(procedural)和连续赋值。过程赋值用于过程代码(intial,always,task or function)中给reg 和integer变量赋值,而连续赋值一般给wire变量赋值。1. always (敏感表),敏感表要完整,否则会引起仿真和综合的结果不一致。 以上语句在行为级仿真时,e的变化将不会使仿真器进入该进程,导致仿真

12、结果错误。2. A. Assign/deassign仅用于仿真加速B. Force/release 仅用于debugC. 避免使用DisableD. 对任何reg赋值用非阻塞赋值代替阻塞赋值,reg的非阻塞赋值要加单位延迟,但异步复位可不加。4.1.9 Combinatorial Vs Sequential Logic1. 如果一个事件持续几个时钟周期,设计时就有时序逻辑代替组合逻辑。如:2. 在simulation pattern 或report file中,尽量不用内部信号,如果要用就把它们引到端口,这样做并不增加芯片的面积。3. 内部总线不要悬空。在defult状态,要把它上拉或下拉。4

13、.1.10 Macros1. 为了保持代码的可读性,常用“define”做常数声明。把“define”放在一个独立的文件中。2. 参数(parameter)必须在一个模块中定义,不要传送参数到模块,“define”可以在任何地方定义,要把所有的“define”定义在一个文件中,在编译源代码时,首先要把这个文件读入。如果需要宏的定义域在一个模块中,就用参数代替。4.1.11 comments1. 对更新的内容要做注释;2. 在语法块的结尾要做标记;3. 每个模块都应在模块的开始做模块级的注释(参考前面标准模块头)4. 在模块端口列表中出现的端口信号,都应做简要的功能描述。4.1.12 FSM1.

14、 VerilogHDL状态机的状态分配;VerilogHDL描述状态机必须由parameter分配好状态。2. 组合逻辑和时序逻辑要分开用不同的进程。组合逻辑包括状态译码和输出,时序逻辑则是状态寄存器的切换;必须包括对所有状态都处理,不能出现无法处理的状态,使状态机失控。3. Mealy机的状态和输入有关,而Moore机的状态转换和输入无关。Mealy状态机的例子如下:4.2 代码编写中常出现的问题4.2.1.在for-loop中包括不变的表达式,浪费运算时间 for-loop中的第一条语句始终不变,浪费运行时间。4.2.2 资源共享问题4.2.3 由于组合逻辑的位置的不同而引起过多的触发器综合,如下面的例子:4.2.4 谨慎使用异步逻辑。4.2.5 考虑综合的执行时间;避免点到点的例外;避免伪路径;避免使用门控时钟;避免使用内部产生的时钟;避免使用内部的复位信号。4.2.6 testbench3. 在testbench中避免使用绝对的时间,如10,15等,应该在文件的前面使用parameter定义一些常量,便于修改。4. 观测结果可以输出到波形文件.shm,或数据文件.dat。生产文件可以用simwave观察结果。!5. 对大的设计的顶层仿真,一般不要对所有信号跟踪,因为波形文件很大,仿真时间延长,可以有选择的观测一些信号。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号