一、常用模板
`timescale 1ns/1ps //时间精度
`define Clock 20 //时钟周期
module my_design_tb;
//==================<端口>==================================================
reg clk ; //时钟,50Mhz
reg rst_n ; //复位,低电平有效
reg [XX:0] in ; //
wire [XX:0] out ; //
//--------------------------------------------------------------------------
//-- 模块例化
//--------------------------------------------------------------------------
my_design u_my_design
(
.clk (clk ),
.rst_n (rst_n ),
.in (in ),
.out (out )
);
//----------------------------------------------------------------------
//-- 时钟信号和复位信号
//----------------------------------------------------------------------
initial begin
clk = 0;
forever
#(`Clock/2) clk = ~clk;
end
initial begin
rst_n = 0; #(`Clock*20+1);
rst_n = 1;
end
//----------------------------------------------------------------------
//-- 设计输入信号
//----------------------------------------------------------------------
initial begin
in = 0;
#(`Clock*20+2); //初始化完成
$stop;
end
endmodule
二、时钟激励设计
`timescale 1ns/1ps //时间精度
`define Clock 20 //时钟周期
//==========================================================================
//== 方法一,50%占空比
//==========================================================================
initial begin
clk = 0;
forever
#(`Clock/2) clk = ~clk;
end
//==========================================================================
//== 方法二,50%占空比
//==========================================================================
initial begin
clk = 0;
always
#(`Clock/2) clk = ~clk;
end
//==========================================================================
//== 方法三,产生固定输入的时钟脉冲
//==========================================================================
initial begin
clk = 0;
repeat(6)
#(`Clock/2) clk = ~clk;
end
//==========================================================================
//== 方法四,非50%占空比
//==========================================================================
initial begin
clk = 0;
forever begin
#((`Clock/2)-2) clk = 0;
#((`Clock/2)+2) clk = 1;
end
end
三、复位信号设计
`timescale 1ns/1ps //时间精度
`define Clock 20 //时钟周期
//==========================================================================
//== 方法一,异步复位
//==========================================================================
initial begin
rst_n = 0; #(`Clock*20+1);
rst_n = 1;
end
//==========================================================================
//== 方法二,同步复位
//==========================================================================
initial begin
rst_n = 0; #(`Clock*20);
rst_n = 1;
end
四、task常用方法
//==========================================================================
//== 输入信号任务封装
//==========================================================================
task i_data;
input [7:0] dut_data;
begin
@(posedge data_en); send_data=0;
@(posedge data_en); send_data=dut_data[0];
@(posedge data_en); send_data=dut_data[1];
@(posedge data_en); send_data=dut_data[2];
@(posedge data_en); send_data=dut_data[3];
@(posedge data_en); send_data=dut_data[4];
@(posedge data_en); send_data=dut_data[5];
@(posedge data_en); send_data=dut_data[6];
@(posedge data_en); send_data=dut_data[7];
@(posedge data_en); send_data=1;
#100;
end
endtask
//调用方法:i_data(8'hXX);
//==========================================================================
//== 多输入信号任务封装
//==========================================================================
task more_input;
input [ 7:0] a;
input [ 7:0] b;
input [31:0] times;
output [ 8:0] c;
begin
repeat(times) @(posedge clk) //等待 times 个时钟上升沿
c=a+b;
end
endtask
//调用方法:more_input(x,y,t,z); //按声明顺序
五、@和wait
//==========================================================================
//== @为边沿触发
//==========================================================================
initial begin
start = 1;
repeat(5) @(posedge clk) //等待5个时钟上升沿
start = 0;
end
//==========================================================================
//== wait为电平触发
//==========================================================================
initial begin
start = 1;
wait(en); //等待en==1
start = 0;
end
六、常用仿真控制语句
$random //产生随机数
$random % n //产生范围 {-n,n} 的随机数
{$random} % n //产生范围 { 0,n} 的随机数
$stop //停止运行仿真,Modelsim 中可继续仿真
$finish //结束运行仿真,Modelsim 中不可继续仿真
$stop(n) //带参数系统任务,根据参数 0、1、2 不同,输出仿真信息
$finish(n) //带参数系统任务,根据参数 0、1、2 不同,输出仿真信息
/*------------------------------------------------------------------------*\
0:不输出任何信息
1:输出当前仿真时刻和位置
2:输出当前仿真时刻、位置和仿真过程中用到的 memory 以及 CPU 时间的统计
\*------------------------------------------------------------------------*/