[信息与通信]Verilog语言编程规范总结.doc

上传人:sccc 文档编号:4662308 上传时间:2023-05-05 格式:DOC 页数:47 大小:398.35KB
返回 下载 相关 举报
[信息与通信]Verilog语言编程规范总结.doc_第1页
第1页 / 共47页
[信息与通信]Verilog语言编程规范总结.doc_第2页
第2页 / 共47页
[信息与通信]Verilog语言编程规范总结.doc_第3页
第3页 / 共47页
[信息与通信]Verilog语言编程规范总结.doc_第4页
第4页 / 共47页
[信息与通信]Verilog语言编程规范总结.doc_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《[信息与通信]Verilog语言编程规范总结.doc》由会员分享,可在线阅读,更多相关《[信息与通信]Verilog语言编程规范总结.doc(47页珍藏版)》请在三一办公上搜索。

1、前 言IV1范围12术语13代码标准13.1命名规范13.1.1文件命名13.1.2HDL代码命名总则23.2注释43.2.1文件头43.2.2其它注释53.3编程风格73.3.1编写代码格式要整齐73.3.2使用二到四个空格符缩排73.3.3一行一条Verilog语句73.3.4一行一个端口声明73.3.5在定义端口时,按照端口类型或端口功能定义端口顺序。83.3.6保持端口顺序一致。83.3.7声明内部net83.3.8在一个段内声明所有内部net83.3.9每行长度不超过80字符83.3.10代码流中不同结构之间用一空行隔开83.4模块划分和重用103.4.1不能访问模块外部的net和v

2、ariable103.4.2不使用include编译指令103.4.3建议模块的端口信号尽可能少。103.4.4时钟产生电路单独构成一个模块103.4.5划分时钟域103.4.6物理和逻辑边界的匹配103.4.7特定应用代码要单独划分出来103.4.8关键时序逻辑划分113.4.9数据流逻辑划分113.4.10异步逻辑划分113.4.11状态机划分113.4.12控制逻辑和存储器划分113.5逻辑设计经验113.5.1时钟域要尽可能少,所用时钟尽可能加全局BUFF113.5.2异步接口信号同步化113.5.3避免寄存器的数据与时钟异步113.5.4使用无毛刺的门控时钟使能信号113.5.5直接

3、作用信号无毛刺123.5.6初始化控制存储元件123.5.7使用同步设计123.5.8避免组合反馈环123.6常用编程技巧123.6.1条件表达式的值必须是一个单bit值123.6.2总线位顺序按高到低保持一致123.6.3不要给信号赋x值123.6.4寄存器变量只能在一个always语句中赋值123.6.5对常量使用参数而不使用文本宏123.6.6不能重复定义参数123.6.7不能重复定义文本宏123.6.8保持常量之间的联系133.6.9状态编码的参数使用133.6.10define、undef配合使用133.6.11用基地址+地址偏移量生成地址133.6.12使用文本宏表示寄存器字段位置

4、和值133.6.13ifdef的嵌套限制在三层以内133.6.14操作数的位宽必须匹配143.6.15模块调用时端口要显式引用143.6.16矢量端口和net/variable声明的位宽要匹配143.6.17避免inout类型的端口143.6.18在复杂的表达式中使用括号143.7常用综合标准143.7.1always 的敏感列表要完整143.7.2一个 always 的敏感列表中只能有一个时钟153.7.3只使用可综合的结构153.7.4组合逻辑的条件需完备153.7.5循环结构中禁用disable语句153.7.6避免无界循环153.7.7端口连接禁用表达式153.7.8禁用Verilog

5、 primitive153.7.9边沿敏感结构中使用非阻塞赋值(=)153.7.10Latch使用非阻塞赋值153.7.11模块闲置的输入端不要悬空163.7.12连接模块闲置的输出端163.7.13函数中不要使用锁存器163.7.14禁用casex163.7.15多周期路径的信号使用单周期使能信号163.7.16三态元件建模163.7.17避免顶层胶合逻辑163.7.18在case语句中使用default赋值语句163.7.19full_case综合命令的使用16附录1 HDL编译器不支持的Verilog结构18附录2 Verilog和VHDL关键词列表19前 言编写本标准的目的是为了统一部

6、门内部FPGAEPLD设计用verilog语言编程风格,提高Verilog设计源代码的可读性、可靠性和可重用性,减少维护成本,最终提高产品生产力;并且以此作为代码走查的标准。此标准以公司的Verilog语言编程规范为蓝本,有所增删。本规范的内容包括:本规范定义了Verilog语言的编程方面的准则。主要包括:设计命名规范、注释、编程风格、模块划分和重用、逻辑设计经验、常用编程技巧、结构化测试技术准则以及常用综合标准。本标准的附录1、附录2是资料性附录。本标准主要起草人:XX。本标准于200X年X月发布。 IIIVerilog语言编程规范1 范围本标准规定了verilog语言的编程规范。 本标准适

7、用于部门内使用verilog语言编码的所有可编程逻辑设计(FPGA/EPLD)设计。本规范自生效之日起,对以后新编写的和修改的代码有约束力。2 术语HDL:Hardware Description LanguageRTL:Register Transfer LevelPLL:Phase Locked LoopUDP :User Defined PrimitiveVC:Visual Component3 代码标准3.1 命名规范3.1.1 文件命名3.1.1.1 一个模块为一个文件。在进行逻辑设计和划分时,可以按照功能或者接口对设计进行划分,划分的模块不宜过大或者过小,以免一个文件中的代码行过多

8、降低了设计的可读性;过小会使设计的管理较为麻烦,也不易理解设计。原则上设计的文件只包含一个模块。一个文件应该为一个模块原因:便于模块的修改3.1.1.2 顶层文件的命名规范文件名构成: 有2片或2片以上的FPGA时采用: 单板名_功能_fpgan_top.v,n表示第几片FPGA 只有1片FPGA时采用 : 单板名_fpga_top.v原因:便于理解是哪块单板的FPGA。 3.1.1.3 模块文件的命名规范3.1.1.3.1 功能模块: 要求采用模块功能命名如:ul_mux.v 上行复用模块模块层次尽可能不要超过4层,低层模块的命名要求包含上层模块名如:ul_mux_reg.v 上行复用寄存器

9、模块原因:便于理解是FPGA的模块层次结构、功能,调用的CORE模块除外。3.1.1.3.2 core: RAM : ram深度x位宽 双口RAM : dpram深度x位宽 FIFO : fifo深度x位宽 移位寄存器: shiftreg深度x位宽3.1.1.3.3 接口: 接口模块的后缀为“_if”: LVDS芯片接口: lvds_芯片编号_if 光接口 :ot_芯片编号_ifcpu接口 :cpu编号_if3.1.2 HDL代码命名总则 具有一定意义的命名比写上好几行的注释要好得多,这一点在写代码时应该给予充分的重视,任何命名都应明了准确,避免模棱两可。3.1.2.1 文件名应由字母、数字及

10、下划线组成。命名只能由26个英文字母(a-z,A-Z)、数字(0-9)或者下划线( _ )组成。不允许使用破折号和连续的下划线。3.1.2.2 文件名的首字符必须是字母。第一个字符只能使用字母,不能使用下划线。原因:以下划线的命名可能会导致与一些工具的冲突。3.1.2.3 用下划线分开多个单词由多个字组成的文件名,每个字之间要用下划线分开。举例:ram_addr。原因:在保证一致性的情况下,提高了在修改、验证和调试中的可读性。3.1.2.4 信号名的拼写和命名风格要一致在整个层次设计中,net、variable的拼写和命名风格要保持一致,参见整个层次的命名规范。原因:有利于信号类型(如低电平有

11、效的信号或时钟信号)的识别及调试。3.1.2.5 Verilog文件名与相应的文档名一致说明文档中所参考的Verilog RTL的信号及模块名必须与FPGA/EPLD设计说明中命名相一致,代码和模块名字的注释也要保持一致。原因:易于文档和代码之间的交叉参考。例外:最终用户文档。3.1.2.6 常量用大写字母表示常量必须大写。包括参量名、文本宏名也要大写。原因:易于变量识别。3.1.2.7 net、variable、construct及instance以小写命名与建模电路密切相关的硬件结构,在命名时所有字母必须小写。 .net .variable .construct:如 function、ta

12、sk、named block、module或 UDP .instance: 如 gate、module、UDP原因:保持设计外观及感觉的一致性。大小写的一致性可避免混淆及错误的发生。3.1.2.8 命名要唯一construct、net、variable的命名要唯一,不能用大小写来区分命名。原因:有些工具是不区分大小写的。 3.1.2.9 命名要望文生义标识符的命名必须描述其目的、应当有意义,可以达到望文生义。标识符的命名应该描述“对象做什么”而不是“过程怎么做”,要根据每个标识符做什么来命名,而不要以其如何实现来命名,这些标识符包括:net、variable、parameter、instanc

13、e名、construct 名( 如 function、module、task)。标识符必须使用英文命名。如果标识符需要多个意义独立的字符串命名,字符串之间要用下划线“_”隔开。原因:便于维护,有助于对设计的理解。举例: set_priority对net或variable SBUS_DATA_BITS对parameter ram_addr_p3任意的 pipeline stage 指示 3.1.2.10 不允许用Verilog和VHDL的关键词来命名代码中的命名不能使用Verilog和VHDL的关键词。Verilog和VHDL的关键词见附录2。3.1.2.11 后缀使用的限制本标准中的后缀列表只

14、限用于从3.1.2.12至3.1.2.18中指明的场合。原因:保持一致的命名约定,有助于对整个设计的理解。3.1.2.12 低电平有效的信号的后缀为_n 当一个信号低电平有效时,它必须用后缀_n命名,_n的含义为negative;只是低电平有效的信号才能用_n结尾(公司的规范用_b)。原因:利于设计的可读性。举例: reset_n3.1.2.13 时钟信号的后缀为_clk如果在时钟信号的命名中没有clock或clk,那么必须用后缀_clk进行命名。非时钟信号的命名不能含有clock或clk。原因:利于设计的可读性。举例:fifo_transmit_clk例外:明显指明为时钟信号(例如:syst

15、em_clock 或clk32m)。3.1.2.14 输出悬空信号的后缀为_nc 未使用的模块输出端口用带有后缀名_nc命名(nc:not connected,没有连接的)。举例:blockx blockx(.result(result15:3,result_nc2:0),);或blockx blockx(.result(result15:0),);wire result_nc2:0 = result2:0;原因:当出现有未连接信号的警告时,如果该信号以_nc命名,表示此信号为未连接,而不是错误。3.1.2.15 三态信号用后缀_z命名三态信号用后缀名_z表示。原因:利于设计的理解。举例:ra

16、m_data1_z3.1.2.16 状态机中下一状态变量的后缀为_next 。原因:利于设计的理解。举例:tx_fsm_state_next、 tx_fsm_state_ns3.1.2.17 测试信号的后缀为_test原因:利于设计的理解。举例:parallel_clk_test3.1.2.18 寄存器可以按照地址格式命名,也可以按照功能进行命名。地址命名的一般格式是:reg_xxh。采用功能命名时需要进行寄存器说明,指出其寄存器地址。例:reg_01h; protocol_reg; /register address is 0x513.1.2.19 信号名最长为32个字符信号名的长度不能超过

17、32个字符。原因:短名字提高可读性。3.1.2.20 文档中的缩略语和附加命名习惯模块中所有缩略语必须加以说明,模块中附加的需求或建议的命名习惯也必须加以说明。文档的关键词中必须包含这些缩略语词,或者文档的标题中必须包含这些术语。原因:利于模块重用。3.1.2.21 保持整个层次的一致性信号名在整个设计层次中保持一致。对于穿透多个模块的信号在各个层次中信号名要尽量保持一致。原因:提高模块的可读性,消除混淆。例外:模块多次调用、通用模块的调用及矢量分量的选取。举例:reg 7:0 status_reg;wire int_pend;int_pend = status_reg1;3.1.2.22 调

18、用模块的命名与模块名相同调用模块的命名应与该模块名匹配。同一模块内调用同一子模块时,调用名采用整数索引或采用整数多次索引。原因:增加模块的可读性,避免混淆。举例:blockx blockx_1();blockx blockx_2();blockx blockx_3();3.2 注释对HDL代码的功能进行注释是必要的,注释语句是对上下文信息的补充说明。3.2.1 文件头每个RTL和Verilog文件必须有文件头说明,如图1所示。文件头的格式必须和图中格式保持一致,利于用软件工具去分析文件头。文件头中,大写关键词用于信息类查找。图中所示的文件头描述是最少需求,附加说明将在REUSE ISSUES后

19、进行描述。此外,文件头的顶部还应该包含版权和公司保密等信息。/FILE_HEADER-/ ZTE Copyright (c)/ ZTE Company Confidential/-/ FILE NAME / DEPARTMENT / AUTHOR / AUTHORS EMAIL /-/ RELEASE HISTORY/ VERSION DATE AUTHOR DESCRIPTION/ 1.0 YYYY-MM-DD name /-/ KEYWORDS : /-/ PURPOSE : /-/ PARAMETERS / PARAM NAME RANGE :DESCRIPTION :DEFAULT :

20、UNITS/ e.g DATA_WIDTH 32,16 :width of the data :32 :/-/REUSE ISSUES :/ Reset Strategy : / Clock Domains : / Critical Timing : / Test Features : / Asynchronous I/F : / Scan Methodology : / Instaniations : / Synthesizable : / Other : / /END_HEADER-图 1 Verilog 文件头3.2.1.1 每个文件必须包含一个文件头每一个文件必须包含一个如图1所示的文

21、件头,必须包括所有项,如果无内容,用N/A表示。原因:以标准的方式提供相关设计信息3.2.1.2 使用文件边界标识符(FILE_HEADER和END_HEADER)使用标识符FILE_HEADER和END_HEADER定义文件头边界。原因:便于识别文件头信息。3.2.1.3 文件名段文件头必须包含本文件的文件名。原因:便于了解文件所包含的内容。3.2.1.4 必要的联系信息段文件头中必须包含设计部门、作者、作者联系方式等相关信息。3.2.1.5 版本信息段文件头中必须包含版本历史信息及最新版本。日期的格式必须是:YYYY-MM-DD。便于调用,但是文件的局部改动记录不必写入文件头。原因:便于跟

22、踪版本更新情况。3.2.1.6 功能描述文件头中必须对该模块的功能进行简要描述。主要说明该模块包括了哪些功能,不必说明如何实现。原因:便于了解本模块的功能。3.2.1.7 Reset策略必须说明Reset的策略,包括同步、异步复位,外部、内部上电复位以及软硬件复位,并说明该模块是否可以在调试时单独复位。原因:增加代码的可读性,这对模块调试和综合是必要的3.2.1.8 时钟域的描述所有时钟域和时钟方案必须加以说明。原因:对内部产生的时钟、分频时钟进行说明,便于理解代码及时钟方案.3.2.1.9 关键时序的说明关键时序,包括外部时序关系必须加以说明,文件头中应含关键时序的相关信息。原因:setup

23、-hold和输出时序关系突出了测试和综合所应采取的步骤。3.2.1.10 异步接口的详细说明对异步接口必须详细说明,包括时序关系和频率。原因:便于理解设计方案,还有助于决定综合时是否增加同步电路。3.2.1.11 调用说明文件头中必须包含cell、module、function调用、启动任务的详细描述。 举例:INSTANTIATIONS:mux2s cell, decode task3.2.1.12 其它文件头说明一般来说,文件头除了上述信息之外,还应包含有利于系统综合和代码理解的其它有用信息,这些内容可由设计者自行决定。原因:利于设计的理解3.2.2 其它注释为描述HDL代码及其功能,注释

24、说明是必要的,这有助于其它设计者理解和维护程序代码。3.2.2.1 功能块注释对代码的每个功能块必须加以注释说明,说明其目的及功能。原因:便于代码理解。3.2.2.2 对不常用或不易理解的关键代码行进行注释说明对不常用或不容易理解的代码及其使用限制要进行注释,说明其功能、作用和其它特征信息。原因:提高代码的可读性3.2.2.3 使用单行注释代码行使用单行注释“/”,不使用多行“/*.*/”注释。代码行注释跟在注释代码之后,处于同一行。代码行注释应简明扼要,控制注释长度避免使单行内容过长。如注释过长且难以简略,可以分行注释。注意放在下一行的注释应从前行注释左侧对齐,注意分行的注释内容要独占一行,

25、该行不能有其它的代码。若代码本身较长,难以在同一行加以注释,可以在代码的前一行放置注释内容。注意这行注释要独占一行。原因:改进代码的可读性,且分析方便。3.2.2.4 无关联信号捆绑的说明当希望将无关联的信号归拢为一组时,要有详细的说明。原因:易于模块的理解。举例:含有无关联信号的特殊用途的控制总线。3.2.2.5 删除旧代码旧的或无用的代码必须删除。原因:易于代码的理解。3.2.2.6 FPGA自有功能模块的调用说明对需要调用的BUFG、BUFGP、DLL、PLL等FPGA自有功能模块的调用原因要进行注释说明。原因:自有功能模块的调用技术上限制了设计的可移植性。3.2.2.7 端口信号定义要

26、进行注释。每个端口声明必须有注释说明,和端口声明处在同一行。输入端口注释出来自哪个模块,输出端口注释出输出给到哪个模块。原因:提高可读性。3.2.2.8 其它类型(信号或变量)的声明要注释。其它声明如net、variable等也必须加以注释说明,和声明处在同一行。原因:增加程序的可读性。例: reg 11:0 fifo_en; / enabling signal of 12 fifos wire 7:0 dout ; / the output of branch(fifo);3.2.2.9 变更的代码行要加以注释。代码文件修改之后,每行有变更的代码都必须进行注释。注释中体现修改的内容、更改目的

27、、更改时间和更改人员信息。注意:变更注释主要针对版本的更新而言。对于设计过程中的代码改动,可根据实际情况进行注释。3.2.2.10 注释可以简明扼要、重点突出。3.2.2.11 注释应逻辑清晰、用语准确,应完整体现设计的目的、关键代码块的功能和重要信号的特征。3.2.2.12 显式的门控时钟使用说明代码中,不是工具产生的门控时钟要加以注释说明。原因:易于HDL的理解。3.2.2.13 SR Latch使用说明代码中,SR Latch的使用要加以注释说明。原因:易于HDL的理解。3.2.2.14 综合directive说明所有综合专用的directive都要加以注释说明,指明使用的原因、工具以及

28、使用的指令等。原因:指明专门为综合工具所写的代码,或者为希望得到基于综合工具的某些结果所写的代码。举例:The black_box directive is needed to ensure that it is not optimized away during synthesis.rom256x10 rom256x10 ( .addr ( encode_in ), .clk ( tx125m_clk ), .dout ( encode_out_reg ) ) ; / synthesis black_box3.2.2.15 编译directive说明对编译directive语句ifdef、i

29、fndef、else等使用时必须予以注释,说明其用途。原因:改进对代码的理解和代码的移植性。举例:ifdef test_messages /enable messages for simulation debugelse /normal operation, no messagesendif /end test_messages3.2.2.16 END语句说明对于有嵌套结构复杂和带有case语句中的END语句要加以注释,说明模块结束。原因:改进代码的可读性,易于识别模块边界。举例:always()begin:end /或case () /endcase /3.2.2.17 充分使用注释说明整个

30、代码要充分使用注释,以描述代码的功能、作用、设计过程以及特殊处理等,避免一些显而易见的注释(例如:a=b; /save b into a)。原因:改进对程序的理解。3.3 编程风格3.3.1 编写代码格式要整齐代码缩排的格式要一致(即相同类型的代码语句要对准)。原因:增加代码的可读性。在编写一个代码块时(如begin、case、if语句等),首先要定好框架,把end和begin对准。3.3.2 使用二到四个空格符缩排使用二到四个空格符,作用是缩排,用于代码对齐。不要使用Tab 键,使用空格和空行来增加代码的可读性。建议使用四个空格键。原因:增加程序的可读性。由于Tab键的表示随系统不同而不同,

31、所以不用。3.3.3 一行一条Verilog语句每行只写一条语句。原因:增加程序的可读性,便于用设计工具进行代码的语法分析。举例:使用: upper_en = (p5type & xadr10) ; lower_en = (p5type & !xadr10);不用: upper_en = (p5type & xadr10); lower_en = (p5type & !xadr10);例外:允许注释和Verilog语句在同一行上时。3.3.4 一行一个端口声明端口定义应该是独立的,每行只写一个端口声明语句。原因:增加代码的可读性,便于代码理解,便于用脚本文件分析代码语法。举例:使用:input

32、 a; /port a descriptioninput b; /port b description 不用:input a, b;input a, b;3.3.5 在定义端口时,按照端口类型或端口功能定义端口顺序。将端口进行分类进行定义,便于理解和调用。注:可以按照信号的方向按输入、输出、双向来定义。也可以按照端口功能来定义端口顺序。建议按照输入、输出、双向来定义。原因:增加代码可读性。3.3.6 保持端口顺序一致。端口声明顺序应与模块声明中端口的顺序一致。原因:增加代码可读性。3.3.7 声明内部net所有内部net必须声明,不能隐含。原因:Verilog可隐含定义内部net,但内部net

33、必须声明,以避免混淆。3.3.8 在一个段内声明所有内部net内部net的声明要跟在模块的I/O端口声明之后。原因:易于代码的理解。例外:自动生成的代码。3.3.9 代码流中不同结构之间用一空行隔开说明:文件头、功能块注释与代码之间应空行。实体之间、实体与代码之间应空行。相对独立的代码块之间应空行。信号的定义与代码之间应空行。关键代码与其它代码之间应空行。空行主要是为了提高代码的可读性。下面是一个良好的verilog代码格式的例子:/FILE_HEADER-/ ZTE Copyright (c)/ ZTE Company Confidential/-/ FILE NAME : dl_ot_16

34、36_if_counter.v/ DEPARTMENT : sz3g/ AUTHOR : dongchangcheng/ AUTHORS EMAIL : dong.changcheng/-/ RELEASE HISTORY/ VERSION DATE AUTHOR DESCRIPTION/ 1.0 2004-09-27 N/A N/A/-/ KEYWORDS :dl_ot_1636_if_counter/-/ PURPOSE :implement dl_ot_1636_if receive timing signal /-/ PARAMETERS / PARAM NAME RANGE :DES

35、CRIPTION :DEFAULT :UNITS/ e.g DATA_WIDTH 32,16 :width of the data :32 :/-/ REUSE ISSUES : N/A/ Reset Strategy : N/A/ Clock Domains : N/A/ Critical Timing : N/A/ Test Features : N/A/ Asynchronous I/F : N/A/ Scan Methodology : N/A/ Instaniations : N/A/ Synthesizable : N/A/ Other : N/A/END_HEADER-timescale 1ns/100psmodule dl_ot_1636_if_counter( / input port chipx16_clk , / input from pin reset_n , / input from pin / output port byte_flag / output to module1 ) ;/ -/ input port/ -input chipx16_clk ;input reset_n ;/ -/ output port/ -output byte_flag

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号