电子说
在实际工作中,许多公司对Verilog程序编写规范都有要求。在公司内部统一Verilog程序编写规范不仅可以增强程序的可读性、可移植性,而且也有助于逻辑工程师之间交流、沟通,提升逻辑组成员之间的团队协作能力。本文就大部分公司常见的Verilog程序编写规范作一个介绍。
01 编写风格
begin/end要单独另起一行,配对的begin/end列对齐。
if/else分支中,多条语句必须使用being/end。多条语句若不加begin/end,则只有第一条语句会有效,故多条语句必须加begin/end。
书写时括号和括号间不用空格。举例:assign y = ((a==1’b1) && (b==1’b1))。
if/else语句必须配对使用,时序逻辑中else不用给自身赋值,空操作时只需要写“;”。
所有的缩进以4个空格为单位。
分号和逗号紧跟信号。
case/default配对使用。
模块内部不能使用高阻或未知结果用作对比条件。例:if(a == 1'bz) 或 if(a == 1'bx)。
02 命名风格
Verilog的保留关键字不允许作为命名字符串使用。在RTL代码中使用Verilog的关键字命名可能会导致综合或仿真出现编译错误。
命名字符集只能为[“a-z”,“A-Z”,"0-9”, “_” ],不能有其他字符。
代码中的所有信号名都必须小写。
信号命名总数不超过15个字符。
使用下划线作为命名分隔符。
不允许两个连续的下划线出现在命名字符串中。如果采用连续两个或多个下划线,不便于代码阅读和维护,而且阅读时很难区分有几个下划线。
不允许使用大小写来区分模块名称、变量、信号。
用大小写来区分模块、变量或信号不仅不方便代码阅读和理解,而且有安全隐患。因为编译器有可能不区分大小写,增加代码出错的风险。
03 设计风格
模块中经常使用的参数,或在例化时需要修改的参数使用parameter定义。
同一always块中,非阻塞赋值和阻塞赋值不能混用。在时序逻辑语句块(always)中统一采用非阻塞型赋值;在组合逻辑语句块(always和assign)中统一采用阻塞型赋值;组合时序混合电路,统一采用非阻塞赋值;不可以用反或混合使用阻塞和非阻塞赋值;
不要使用门控时钟。门控时钟的定义:组合逻辑产生的信号当其它模块的时钟称为门控时钟。门控时钟是非常危险的,极易产生毛刺,使逻辑误动作。在可编程逻辑器件中,一般使用触发器的时钟使能端,而这样,并不增加资源,只要保证建立时间,可使毛刺不起作用。
模块的内部信号统一用时钟的上升沿采样。
模块中的信号必须在复位时被赋予初始值。
不要将时钟信号作为数据信号输入,不允许使用行波计数器。行波计数器中,前级寄存器的数据输出作为后级寄存器的时钟输入。行波计数器虽然原理简单,设计方便,但级连时钟(行波时钟)最容易造成时钟偏差(△T),级数多了,很可能会影响其控制的触发器的建立/保持时间,使设计难度加大。
在条件表达式中不要使用高阻Z。在逻辑代码中,除了三态控制逻辑接口允许使用高阻Z状态进行信号赋值外,在其他信号赋值,条件表达式等逻辑中都不允许使用高阻Z状态。
向量、参数和信号的位宽在定义时要清晰的表示出来,数据位宽要匹配。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !