Testbench编写

一、常用模板

`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 时间的统计
\*------------------------------------------------------------------------*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值