VerilogHDL编程规范培训050719Word格式文档下载.docx
- 文档编号:18922004
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:11
- 大小:92.27KB
VerilogHDL编程规范培训050719Word格式文档下载.docx
《VerilogHDL编程规范培训050719Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《VerilogHDL编程规范培训050719Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
命名包含信号或变量出处、有效状态等基本含义。
1.有效而有意义的名字
有效的命名并不一定要求将功能描述出来。
如
For(I=0;
I<
1024;
I=I+1)
指针I就没有必要用loop_index作为指针名。
2.用连贯的缩写
例如:
Addraddress;
Patrpoiter;
Clkclock;
Rstreset
3.用最右边的字符下划线表示低电平有效,高电平有效的信号不得用下划线表示。
如:
Rst_,Trdy_,Irdy,Idel
4.大小写原则
名字的首字符大写,其余小写(但是parameter,integer定义的数值名要全部大写,例如parameterCYCCLE=10.),两个词之间要用下划线。
Data_in
5.全局信号的名字中应包含信号来源的一些信息。
D_addr[7:
2]中的”D”指明了地址是解码模块(Decodermodule)中的地址。
6.同一信号在不同层次上应保持一致性。
7.避免使用保留字。
in、out、x、z等不能作为变量、端口或模块名。
添加有意义的后缀,使信号更加明确。
如表1所示。
表1
4.1.2Modules
1.顶层模块应只是内部模块间的互连。
在没有被调用的(顶层)模块中,除了内部的互连和模块的调用外,尽量再做中间逻辑,如不能再出现对reg变量的赋值等。
目的是为了更有效的综合,因为顶层模块中出现了中间逻辑,Synopsys的designcompoler就不能把子模块中的逻辑综合到最优。
2.模块应在开始处注明文件名、功能描述、引用模块、设计者、设计时间及版权信息等。
/*=====================*\
:
RX_MUX.v
Author:
DongShengLiu
Description:
Calledby:
Topmodule
RevisionHistory:
2005-4-4Revision1.0
Company:
whicc
\*=====================*/
3.不要对Input进行驱动,在module内不要存在没有驱动的信号,更不能在模块端口中出现没有驱动的输出信号,避免在elaborate和compile时产生warning,干扰错误定位。
!
4.每行限制在80个字符以内。
5.用一个时钟的上升沿或下降沿采样信号,不能一会用上升沿,一会用下降沿。
如果既要用上升沿,又要用下降沿,则应分成两个模块设计。
建议在顶层模块中对Clock做一非门,在层次模块中如果要用时钟下降沿可以用非门产生的PosedgeClk_,这样做的好处使得在整个设计中采用同一种时钟沿触发,有利于综合。
6.在模块中要用明了的注释。
对信号、参量、引脚、模块、函数及进程等加以说明,便于阅读和维护。
7.Module名要大写,且应与文件名一致。
ModuleCRC(
);
8.模块输出寄存器化(如图1所示),使得输出的驱动强度和输入的延迟可以预测,从而使得模块额综合过程简单。
图1
A.输出驱动强度都等于平均的触发器驱动强度;
B.输入延迟始终等于通过触发器的路径,近于相等。
9.将关键路径逻辑和非关键路径逻辑放在不同模块。
保证DC可以对关键路径模块实现速度优化,而对非关键路径模块实施面积优化。
在同一模块DC无法实现不同的策略。
10.将相关的组合逻辑放在同一模块。
有助于DC对其进行优化,因为DC通常不能越过模块的边界来优化逻辑。
11.电路中调用的module名用TRxx标示。
4.1.3NetandRegister
1.一个reg变量只能在一个always语句中赋值。
2.对任何一个Register的赋值要加单位延迟,对异步复位可以不加。
3.向量的有效位的顺序一般是从大到小。
尽管有效位的顺序是自由的。
但不利代码的维护。
如Data[-4:
0],则LSB[-1][-2][-3][-4]MSB,或Data[0:
4],则LSB[4][3][2][1]MSB.推荐用Data[4:
0]。
4.对net和register类型的输出要做声明。
否则,Verilog将假定它是一个宽的wire变量。
4.1.4Expression
1.用括号来表示执行的优先级。
方便阅读。
2.用一个函数(function)来代替表达式的多次重复。
如果代码中发现多次使用一个特殊的表达式,那么就用一个函数来代替,这样在以后的版本升级时更便利,这种概念在行为级的代码设计时同样使用,经常使用的一组描述可以写到一个任务(task)中。
4.1.5IF语句
1.每个If语句都应有一个else语句和它对应。
没有else语句会使综合出的逻辑和RTL级的逻辑不同。
如果条件为假时,则用一条空语句。
If(a==b)begin
V1=2’b01;
V2=2’b02;
End
Else:
;
2.如果变量在If-else语句或case语句中做非完全赋值,则应该没有赋值的变量一个缺省值。
4.1.6case语句
case语句通常综合成一级多路复用器,如图2的右边部分所示,而If语句则综合成优先编码的串接的多个多路复用器,如图2的左边部分所示。
通常,使用case语句比if语句
快,优先编码的结构仅在信号的到达有先后时使用。
Case语句比if条件赋值语句快。
所有的case语句应该有一个defaultcase,允许空语句Default:
;
图2
4.1.7Writingfunctions
1.在function的最后给function赋值。
FuntionCompareVectors;
//(Vector1,Vector2,Length)
Input[199:
0]Vector1,Vector2;
Input[31:
0]Length;
//localvariables
Integeri;
RegEqual;
Begin
i=0;
Equal=1
While((i<
Length)&
&
Equal)begin
If(Vector2[i]!
==1’bx)begin
If(Vector1[i]!
==Vector2[i]);
Else;
I=i+1;
End
CompareVectos=Equal;
Endfunction
2.函数中避免使用全局变量,否则容易引起HDL行为级仿真和gate级仿真的差异。
上述程序中使用了全局变量ByteSel可能无意在别处修改了,导致错误结果,最好直接在端口加以定义。
4.1.8Assignment
Verilog支持两种赋值:
过程赋值(procedural)和连续赋值。
过程赋值用于过程代码(intial,always,taskorfunction)中给reg和integer变量赋值,而连续赋值一般给wire变量赋值。
1.always@(敏感表),敏感表要完整,否则会引起仿真和综合的结果不一致。
以上语句在行为级仿真时,e的变化将不会使仿真器进入该进程,导致仿真结果错误。
2.A.Assign/deassign仅用于仿真加速
B.Force/release仅用于debug
C.避免使用Disable
D.对任何reg赋值用非阻塞赋值代替阻塞赋值,reg的非阻塞赋值要加单位延迟,但异步复位可不加。
4.1.9CombinatorialVsSequentialLogic
1.如果一个事件持续几个时钟周期,设计时就有时序逻辑代替组合逻辑。
2.在simulationpattern或reportfile中,尽量不用内部信号,如果要用就把它们引到端口,
这样做并不增加芯片的面积。
3.内部总线不要悬空。
在defult状态,要把它上拉或下拉。
4.1.10Macros
1.为了保持代码的可读性,常用“define”做常数声明。
把“define”放在一个独立的文件中。
2.参数(parameter)必须在一个模块中定义,不要传送参数到模块,“define”可以在任何地方定义,要把所有的“define”定义在一个文件中,在编译源代码时,首先要把这个文件读入。
如果需要宏的定义域在一个模块中,就用参数代替。
4.1.11comments
1.对更新的内容要做注释;
2.在语法块的结尾要做标记;
3.每个模块都应在模块的开始做模块级的注释(参考前面标准模块头)
4.在模块端口列表中出现的端口信号,都应做简要的功能描述。
4.1.12FSM
1.VerilogHDL状态机的状态分配;
VerilogHDL描述状态机必须由parameter分配好状态。
2.组合逻辑和时序逻辑要分开用不同的进程。
组合逻辑包括状态译码和输出,时序逻辑则是状态寄存器的切换;
必须包括对所有状态都处理,不能出现无法处理的状态,使状态机失控。
3.Mealy机的状态和输入有关,而Moore机的状态转换和输入无关。
Mealy状态机的例子如下:
4.2代码编写中常出现的问题
4.2.1.在for-loop中包括不变的表达式,浪费运算时间
for-loop中的第一条语句始终不变,浪费运行时间。
4.2.2资源共享问题
4.2.3由于组合逻辑的位置的不同而引起过多的触发器综合,如下面的例子:
4.2.4谨慎使用异步逻辑。
4.2.5考虑综合的执行时间;
避免点到点的例外;
避免伪路径;
避免使用门控时钟;
避免使用内部产生的时钟;
避免使用内部的复位信号。
4.2.6testbench
3.在testbench中避免使用绝对的时间,如#10,#15等,应该在文件的前面使用
parameter定义一些常量,便于修改。
4.观测结果可以输出到波形文件.shm,或数据文件.dat。
生产文件可以用simwave观
察结果。
5.对大的设计的顶层仿真,一般不要对所有信号跟踪,因为波形文件很大,仿真时间
延长,可以有选择的观测一些信号。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VerilogHDL 编程 规范 培训 050719
![提示](https://static.bdocx.com/images/bang_tan.gif)