Verilog HDL代码书写规范

来源:互联网 发布:梦想小镇mac同步手机 编辑:程序博客网 时间:2024/05/29 19:26

1. 目的

本规范的目的是提高书写代码的可读性、可修改性、可重用性,优化代码综合和仿真的结

果,指导设计工程师使用VerilogHDL规范代码和优化电路,规范化可编程技术部的FPGA设计输

入,从而做到:①逻辑功能正确,②可快速仿真,③综合结果最优(如果是hardware>

Mem[I] <= 32’>

y避免使用保留字

如:in,out,x,z等不能够做为变量、端口或模块名

y添加有意义的后缀,使信号名更加明确,常用的后缀如下:

寄存后的信号 _reg

芯片的双向信号 -xbio

芯片的三态输出 _xz

芯片的漏极开路输出 _xod

芯片原始输出信号 _xo

芯片原始输入信号 _xi

下降沿有效的寄存器 _f

连到三态输出的信号 _z

寄存前的信号 _next

时钟信号 _Clk

意义后缀

y一个module一个文件,且文件名能与module名对应起来

4.1.2. Modules

y顶层模块应只是内部模块间的互连。

Verilog设计一般都是层次型的设计,也就是在设计中会出现一个或多个模块,模块间的调用

在所难免。可把设计比喻成树,被调用的模块就是树叶,没被调用的模块就是树根,那么在这个

树根模块中,除了内部的互连和模块的调用外,尽量避免再做逻辑,如不能再出现对reg变量赋值

等。这样做的目的是为了更有效的综合,因为在顶层模块中出现中间逻辑,Synopsys 的design

compiler 就不能把子模块中的逻辑综合到最优。

y每一个模块应在开始处注明文件名、功能描述、引用模块、设计者、设计时间及版权信息等。代

码中的所有说明、注释必须均为英文。需要特别说明的是,必须对Revision History要格外重视,必

须将每次版本修改的信息按照时间一一详加叙述,以保持版本的可读性与继承性。

如:/* ========================*\

Filename ﹕RX_MUX.v

Author ﹕

Description ﹕

Called>

If (alpha <>

y用一个函数(function)来代替表达式的多次重复

如果代码中发现多次使用一个特殊的表达式,那么就用一个函数来代替,这样在以后的版本升级

时更便利,这种概念在做行为级的代码设计时同样使用,经常使用的一组描述可以写到一个任务

(task)中。

4.1.5.IF 语句

y向量比较时,比较的向量要相等。

当比较向量时,verilog将对位数小的向量做0 扩展以使它们的长度相匹配,它的自动扩展为隐

式的。建议采用显示扩展,这个规律同样适用于向量同常量的比较。

Reg Abc [7:0];

Reg Bca [3:0];

......

If (Abc = = {4’>

y每一个If 都应有一个else 和它相对应

在做硬件设计时,常要求条件为真时执行一种动作而条件为假时执行另一动作,即使认为条件

为假不可能发生。没有else可能会使综合出的逻辑和RTL级的逻辑不同。如果条件为假时不进行任

何操作,则用一条空语句。

always @(Cond)

begin

if (Cond)

DataOut <= DataIn;

Else :;

end

以上语句DataOut会综合成锁存器.

y应注意If ..else>

else>

end

以上语句在行为级仿真时e的变化将不会使仿真器进入该进程,导致仿真结果错误

yAssign/deassign 仅用于仿真加速

yForce/release 仅用于debug

y避免使用Disable

y对任何reg赋值用非阻塞赋值代替阻塞赋值

4.1.9Combinatorial Vs Sequential Logic

y如果一个事件持续几个时钟周期,设计时就用时序逻辑代替组合逻辑

如: Wire Ct_24_e4; //it>

那么这种设计将综合出两个8 比特的加法器,而且会产生毛刺,对于这样的电路,要采用时序

设计,代码如下:

Reg Ct_24_e4;

Always @(poseddge Clk>

Else>

Ct_24_e4 <= 1’>

Ct_24_e4 <= 1’>

Assign bus[31:0] =>

begin

....

End //>

//style 2 --->

begin //drive>

always @(posedge Clk>

else

CurrentState <= NextState;

end

always @(In1>

Out1 <= 1'b0;

end

S1:

begin

if (In1)

begin

NextState <= S0;

Out1 <= In2;

end

Else

begin

NextState <= S1;

Out1 <= !In2;

end

Endcase

end

endmodule

4.2 代码编写中容易出现的问题

y在for-loop中包括不变的表达式,浪费运算时间

for (i=0;i<4;i=i+1)

begin

Sig1 = Sig2;

DataOut[i] = DataIn[i];

end

for-loop中第一条语句始终不变,浪费运算时间.

y资源共享问题

条件算子中不存在资源共享,如

z = (cond) ? (a +>

else

z =>

else

Count <= Count + 1;

End //end>

End //end>

else

Count <= Count + 1;

End //end>

End //end>

end

else>

begin

If (Z == 3'd7)

begin

Z <= 1'b0;

End

Else

begin

Z <= Z + 1'b1;

end

End

Else ;

End //end>

always @(posedge GATED_Clk>

end

Else

begin

if (Z == 3'd7)

begin

Z <= 1'b0;

end

Else

begin

Z <= Z + 1'b1;

end

End //end>

等效于

c[3:0] =>

c[2] =>

c[0] =>

c[i] =>

end

y避免使用门控时钟

使用门控时钟(Gated>

always @(posedge GATED_Clk>

end

Else

begin

if (Qout == 3'd7)

begin

Qout= 1'b0;

end

Else

begin

Qout = Qout + 1'b1;

end

end

end

endmodule

module COUNT (Reset,Enable,Clk,Qout);

input Reset,Enable,Clk;

output [2:0] Qout;

reg [2:0] Qout;

always @(posedge Clk)

begin

if (Reset)

begin

Qout = 1'b0;

end

else>

begin

if (Qout == 3'd7)

begin

Qout = 1'b0;

end

Else

begin

Qout = Qout + 1'b1;

end

end

end

endmodule 

原创粉丝点击