理论教育 VerilogHDL代码编写规范总结

VerilogHDL代码编写规范总结

时间:2023-11-20 理论教育 版权反馈
【摘要】:“规范”就是约定俗成的标准,遵守代码编写规范,一方面能体现设计者足够专业,另一方面,规范编写的代码有利于开发交流,让代码的可读性大大增强,也有利于降低代码的出错率。Verilog HDL代码编写的一些规范总结如下:文件名必须体现出设计模块的功能。在设计规范中采用“_n”来表示低电平有效。

VerilogHDL代码编写规范总结

“规范”就是约定俗成的标准,遵守代码编写规范,一方面能体现设计者足够专业,另一方面(也是最重要的一方面),规范编写的代码有利于开发交流,让代码的可读性大大增强,也有利于降低代码的出错率。

如果初学开发的时候没有养成一个很好的规范编写代码的习惯,在大的项目工程中,这方面的弊端会慢慢显现,对后续的修改和维护会造成很大的影响,重新去编写又浪费很多的时间,所以,“千里之行始于足下”,学习编写代码时就应该学习代码编写规范。

Verilog HDL代码编写的一些规范总结如下:

(1)文件名必须体现出设计模块的功能。

在设计中,模块名就是文件名,这是由于软件编译的问题而被限制的,设置模块名的时候也是在决定文件名。因此,模块名的设定要体现出模块的功能,这种设定便于查找分析,对于大的工程项目设计很有用处。

(2)时钟信号及低电平有效信号的命名应统一。

时钟信号一般命名为clk。

程序中复位信号reset、rst、reset_n、rst_n四种。前两种体现该信号是高电平有效的,后两种体现该复位信号是低电平有效的。在设计规范中采用“_n”来表示低电平有效。所有低电平有效信号命名时一律加上“_n”,增强代码的可读性。

(3)参数parameter和宏定义‵define命名应用大写字母。

在定义参数和宏定义时,名字要采用大写字母进行表示,例如:

parameter DATA_WIDTH=32;

`def ine AHB_TRANS_SEQ 2'b11;

(4)有关信号、端口、模块、例化这四个方面的代码最好采用小写进行设计。

(5)命名字符长度一般不要超过32个。

(6)有关模块调用的实体名的设定,参考如下:

mux4 u_mux4_1(……);

mux4 u_mux4_2(……);

(7)位宽的描述应符合一定顺序。

在Verilog HDL中一般描述位宽采用的是[x:0]的形式;在VHDL中一般采用的是x downto 0的形式。

以上两种形式中都是高位在左、低位在右,符合人的阅读顺序习惯。

(8)begin和end、case和endcase、if和else的配对应上下对齐,语句应注意缩进,方便阅读。可添加必要的注释。

以上几点都是关于文本输入形式的,那么在原理图输入方式中有没有相关的规范问题呢?答案是肯定的。(www.daowen.com)

原理图输入方式中,设计者有时会将自己所写的文本生成一个原理图的模块,然后导入原理图设计,这时该原理图也被设置为顶层模块,有时问题就产生在这里。当有多个模块被导入原理图时,需要将这些模块连接起来,如果在连接的时候用一些分立的逻辑元件,就产生了所谓胶合逻辑的问题,因为该逻辑元件在综合时是没有加入任何一个模块的,无法进行整体的最优化综合,所以无法产生一个最优化的电路,这样的逻辑元件将两个模块“有缝”地连接起来,这样的电路在同步中就会不稳定。

所以,有文本输入和原理图输入的工程中,原理图作为顶层文件时最好是页水平的分层结构,即原理图中的模块都是采用文本输入形式生成的,这样就避免了胶合逻辑的问题,让综合器能更好地综合设计的电路。

非阻塞赋值和阻塞赋值问题,在FPGA设计中是经常需要注意的问题,这两种赋值模式产生的硬件电路是不一样的。从时间上进行分析的话,非阻塞赋值就是同时赋值;而阻塞赋值就是顺序赋值,软件综合时也会对电路进行简化。

在一个源程序中,要么都采用阻塞赋值语句,要么都采用非阻塞赋值语句,最好不要混合使用,否则可能导致逻辑关系出错。

为易于综合,建议采用非阻塞赋值语句。

在需要信号输入的模块中,如always块中“always@”后的括号内包含的就是敏感信号列表(也称敏感变量表达式),也就是说在括号内的信号都将会影响模块的工作或模块内某些信号的输出。凡是影响模块输出和工作状态的信号都是敏感信号,一般有时钟信号、复位信号、置数信号、条件信号等。

在FPGA中经常要用到“reg”,可以说,没有“reg”就没有FPGA,而reg型变量在上电后所寄存的是1还是0是不一定的,这将会造成很大的问题,如输出不确定等,所以就需要在上电的时候利用复位信号进行初始化,对reg型变量的值进行初始化,使一切都是确定的,防止不确定状态的出现。实例如下:

代码编写设计的过程中存在一些设计技巧:

①一个变量不能在多个always块中被赋值。这个问题一定要注意,否则编译不能通过。当某个变量有多个触发条件时,最好将触发条件集中放在一个always块中,并用if-else语句描述在不同触发条件下应执行的操作。

②在always块语句中,当敏感信号为两个以上的时钟边沿触发信号时,应注意不要使用多个if语句,以免因逻辑关系描述不清晰而导致编译错误。

变量enable不能被分配新的值。按以上写法,在最开始,start和reset均为0,会导致enable为不定态。

always@(posedge star t or posedge reset)

i f(reset)enab l e<=0;

e l se enab l e<=1; //正确写法

语句“else enable<=1;”隐含了reset无效且start有效的意思,因此与“else if(start)enable<=1;”效果一样。

③输出信号为总线信号时,一定要在I/O说明中指明其位宽,否则在生成逻辑符号时,输出信号会被误认为是单个信号(没有标明位宽,就不会被当成总线信号)。

④要用到计数器时,一定要根据计数最大值事先计算好所需的位宽。若位宽不够,计数器不能计到设定的最大值,则将该计数器用作分频时,输出时钟始终为0,所设计电路将不能按预定功能正常工作。

本章小结

Verilog HDL是EDA技术的重要组成部分。本章介绍Verilog HDL的语法结构,包括变量、语句、模块和不同级别的电路描述和设计。

Verilog HDL具有行为描述和结构描述功能,可以对系统级、算法级和寄存器传输级等高层次抽象级别进行电路描述和设计,也可以对门级和开关级等低层次的抽象级别进行电路描述和设计。由于Verilog HDL在数字电路设计领域具有先进性和优越性,成为IEEE标准的硬件描述语言得到了多种EDA设计平台工具软件的支持。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈