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
- Verilog HDL代码书写规范
- Verilog HDL代码书写规范
- Verilog HDL 语言书写规范
- Verilog 代码 书写规范
- 用verilog HDL实现LCD液晶显示代码
- 模N计数器的Verilog HDL代码
- Verilog HDL && Quartus 设计规范、代码风格
- [Verilog]个人.v文件书写规范
- Verilog代码编写规范
- Verilog代码编写规范
- Verilog代码规范
- java代码书写规范
- Java代码书写规范
- 汇编语言代码书写规范
- 代码书写规范
- iOS书写代码规范
- java代码书写规范
- android代码书写规范
- linux base note(1) (Linux filesystem structure and bash)
- (六)线性选择
- Word快捷键
- (七)线性堆栈
- Remove Element
- Verilog HDL代码书写规范
- j2recover----最强大的jfs2文件删除恢复工具
- 网络爬虫
- (八)循环队列
- 机房收费系统关于结账和账单生成的计算问题
- C#学习记录四:集合,比较和转换
- php (十三) 面向对象 封装
- JSTL核心标签库之简单介绍
- HDOJ 1027 Ignatius and the Princess II