Verilog程序编写规范

电子说

1.2w人已加入

描述

在实际工作中,许多公司对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状态。

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

审核编辑:汤梓红

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分