参考资料
【明德扬_verilog零基础入门语法HDL仿真快速掌握-手把手教你写FPGA/ASIC代码设计流程中的应用】
4. Verilog工程模板、相应规范
4.1 Verilog工程模板
4.1.1 设计模块模板
module module_name(clk,rst_n,//其他信号,举例doutdout
};//参数定义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)beginif(rst_n==1'b0)begin//复位操作endelse begin//触发器操作endend
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) // ,更多...);//生成本地时钟:50Minitial beginclk = 0;forever #(CYCLE/2)clk = ~clk;end//产生复位信号initial beginrst_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 总结
😊