VerilogHDL编程规范培训050719Word格式文档下载.docx

上传人:b****5 文档编号:18922004 上传时间:2023-01-02 格式:DOCX 页数:11 大小:92.27KB
下载 相关 举报
VerilogHDL编程规范培训050719Word格式文档下载.docx_第1页
第1页 / 共11页
VerilogHDL编程规范培训050719Word格式文档下载.docx_第2页
第2页 / 共11页
VerilogHDL编程规范培训050719Word格式文档下载.docx_第3页
第3页 / 共11页
VerilogHDL编程规范培训050719Word格式文档下载.docx_第4页
第4页 / 共11页
VerilogHDL编程规范培训050719Word格式文档下载.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

VerilogHDL编程规范培训050719Word格式文档下载.docx

《VerilogHDL编程规范培训050719Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《VerilogHDL编程规范培训050719Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。

VerilogHDL编程规范培训050719Word格式文档下载.docx

命名包含信号或变量出处、有效状态等基本含义。

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.对大的设计的顶层仿真,一般不要对所有信号跟踪,因为波形文件很大,仿真时间

延长,可以有选择的观测一些信号。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1