参考资料
【明德扬_verilog零基础入门语法HDL仿真快速掌握-手把手教你写FPGA/ASIC代码设计流程中的应用】
4. Verilog工程模板、相应规范
4.1 Verilog工程模板
4.1.1 设计模块模板
module module_name(
clk,
rst_n,
//其他信号,举例dout
dout
};
//参数定义
parameter DATA_W = 8;
//输入信号定义
input clk;
input rst_n;
//输出信号定义
output[DATA_W-1:0] dout;
//输出信号reg定义
reg[DATA_W-1:0] dout;
//中间信号定义
reg signal_1;
wire siginal_2;
//组合逻辑写法
always@(*)begin
//组合逻辑事务
end
//时序逻辑写法
always@(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
//复位操作
end
else begin
//触发器操作
end
end
endmodule
4.1.2 测试模块模板
`timescale 1ns / 1ps
module TestBench_name();
//时钟和复位
reg clk ;
reg rst_n ;
//uut 的输入信号
reg[3:0] din_0 ;
reg din_1 ;
//uut 的输出信号
wire dout_0 ;
wire[4:0] dout_1 ;
//时钟周期,单位为ns,可在此修改时钟周期
parameter CYCLE = 20;
//复位时间,此时表示复位3个时钟周期的时间
parameter RST_TIME = 3;
//待测试的模块例化
module_name uut(
.clk (clk) ,
.rst_n (rst_n) ,
.din_0 (din_0) ,
.din_1 (din_1) ,
.dout_0 (dout_0) ,
.dout_1 (dout_1)
// ,更多...
);
//生成本地时钟:50M
initial begin
clk = 0;
forever
#(CYCLE/2)
clk = ~clk;
end
//产生复位信号
initial begin
rst_n = 1;
#2;
rst_n = 0;
#(CYCLE*RST_TIME);
rst_n = 1;
end
//输入信号din0赋值方式
initial begin
#1;
//赋初值
din_0 = 0;
#(10*CYCLE);
//开始赋值
end
//输入信号din1赋值方式
initial begin
#1;
//赋初值
din_1 = 0;
#(10*CYCLE);
//开始赋值
end
endmodule
4.2 相应规范
4.2.1 时序逻辑和组合逻辑写法
4.2.2 阻塞赋值和非阻塞赋值
4.2.3 always写法规范
4.2.4 begin end以及信号的对齐
4.2.5 信号大小写的规范
4.2.6 时钟及复位信号问题
4.2.7 reg和wire类型的使用
- always里面,等号左边的信号,无论是时序逻辑还是组合逻辑,都必须是reg类型
4.2.8 输入输出的规范
- 输出使用寄存器打一拍出去,可以极大降低出现亚稳态的概率。(毛刺)
4.2.9 总结
😊