Verilog语言编程规范-FPGA常见问题社区-FPGA CPLD-ChipDebug

Verilog语言编程规范

在实际工作中,许多公司对Verilog程序编写规范都有要求。在公司内部统一Verilog程序编写规范不仅可以增强程序的可读性、可移植性,而且也有助于逻辑工程师之间交流、沟通,提升逻辑组成员之间的团队协作能力。本文就大部分公司常见的Verilog程序编写规范作一个介绍。

01
编写风格
  1. begin/end要单独另起一行,配对的begin/end列对齐。

  2. if/else分支中,多条语句必须使用being/end。多条语句若不加begin/end,则只有第一条语句会有效,故多条语句必须加begin/end。

  3. 书写时括号和括号间不用空格。举例:assign y = ((a==1’b1) && (b==1’b1))。

  4. if/else语句必须配对使用,时序逻辑中else不用给自身赋值,空操作时只需要写“;”。

  5. 所有的缩进以4个空格为单位。

  6. 分号和逗号紧跟信号。

  7. case/default配对使用。

  8. 模块内部不能使用高阻或未知结果用作对比条件。例:if(a == 1’bz) 或 if(a == 1’bx)。

02
命名风格
  1. Verilog的保留关键字不允许作为命名字符串使用。在RTL代码中使用Verilog的关键字命名可能会导致综合或仿真出现编译错误。

  2. 命名字符集只能为[“a-z”,“A-Z”,”0-9”, “_” ],不能有其他字符。 

  3. 代码中的所有信号名都必须小写。

  4. 信号命名总数不超过15个字符。

  5. 使用下划线作为命名分隔符。

  6. 不允许两个连续的下划线出现在命名字符串中。如果采用连续两个或多个下划线,不便于代码阅读和维护,而且阅读时很难区分有几个下划线。

  7. 不允许使用大小写来区分模块名称、变量、信号。

  8. 用大小写来区分模块、变量或信号不仅不方便代码阅读和理解,而且有安全隐患。因为编译器有可能不区分大小写,增加代码出错的风险。

03
设计风格
  1. 模块中经常使用的参数,或在例化时需要修改的参数使用parameter定义。

  2. 同一always块中,非阻塞赋值和阻塞赋值不能混用。在时序逻辑语句块(always)中统一采用非阻塞型赋值;在组合逻辑语句块(always和assign)中统一采用阻塞型赋值;组合时序混合电路,统一采用非阻塞赋值;不可以用反或混合使用阻塞和非阻塞赋值;

  3. 不要使用门控时钟。门控时钟的定义:组合逻辑产生的信号当其它模块的时钟称为门控时钟。门控时钟是非常危险的,极易产生毛刺,使逻辑误动作。在可编程逻辑器件中,一般使用触发器的时钟使能端,而这样,并不增加资源,只要保证建立时间,可使毛刺不起作用。

  4. 模块的内部信号统一用时钟的上升沿采样。

  5. 模块中的信号必须在复位时被赋予初始值。

  6. 不要将时钟信号作为数据信号输入,不允许使用行波计数器。行波计数器中,前级寄存器的数据输出作为后级寄存器的时钟输入。行波计数器虽然原理简单,设计方便,但级连时钟(行波时钟)最容易造成时钟偏差(△T),级数多了,很可能会影响其控制的触发器的建立/保持时间,使设计难度加大。

  7. 在条件表达式中不要使用高阻Z。在逻辑代码中,除了三态控制逻辑接口允许使用高阻Z状态进行信号赋值外,在其他信号赋值,条件表达式等逻辑中都不允许使用高阻Z状态。

  8. 向量、参数和信号的位宽在定义时要清晰的表示出来,数据位宽要匹配。 

请登录后发表评论

    没有回复内容