原创 fpga学习日记21,再探testbench

2013-9-2 16:30 1677 16 16 分类: FPGA/CPLD 文集: 数电,FPGA学习

 Testbench再学习

 

Testbench主要用来生成时钟激励和模拟信号提供给测试模块

然后通过modelsim观察模块的响应

 

基本结构:

module test_bench  

//通常Testbench没有输入与输出端口 信号或变量定义声明 

使用initial always语句来产生激励波形 

例化设计模块 

监控和比较输出响应 

endmodule

 

 

具体内容

Testbench内容主要包括

1,时间单位设置

'timescale 1ns/100ps

2,系统时钟和复位信号的产生

方法(1

always

begin

        #5 clk=~clk;

End

方法(2

initial

begin

mclk = 0;

   while(1)

#10 mclk = ~mclk;

End

方法(3

initial

begin

       Forever   #(延时) CLK = ~CLK;

End

 

复位信号

initial

begin

       Rst = 1;

       #100;

       Rst = 0;

       #500;

       Rst = 1;

 

End

initial

begin

       Rst = 1;

       @(negedge CLK);  // 等待时钟下降沿

       repeat (3) @(negedge CLK);   // 经过3个时钟下降沿

       Rst = 1;

end

3,输入信号的初始化

initial

begin

        clk=1'b0;

        rst=1'b1;

        #10

        rst=1'b0;

        #500

        rst=1'b1;

end

4,模拟产生出入信号,实例化待测试模块

initial

begin

   a_in = 1;

   b_in = 3;

   #200 a_in = 2;

   b_in = 0;

   #200 a_in = 3;

   b_in = 3;

end

5,进行仿真观察结果

 

 

注意事项

1相应于被测试模块的输入激励设置为reg型,输出相应设置为wire类型,双向端口inout在测试中需要进行处理。 

 

为双向端口设置中间变量inout_reg作为该inout的输出寄存,inout口在testbench中要定义为wire型变量,然后用输出使能控制传输方向。 eg 

inout [0:0] bi_dir_port; 

wire [0:0] bi_dir_port; 

 

reg [0:0] bi_dir_port_reg; 

reg bi_dir_port_oe; 

assign bi_dir_port=bi_dir_port_oe?bi_dir_port_reg:1'bz; 

bi_dir_port_oe控制端口数据方向,并利用中间变量寄存器改变其值。等于两个模块之间用inout双向口互连。

2,每个testbench都最好包含$stop语句,用以指明仿真何时结束。

3,加载测试向量时,避免在时钟的上下沿变化,比如数据最好在时钟上升沿之前变化,这也符合建立时间的要求。

4initialalways是同时执行的,只是initial只执行一次。

5一般用initial块给信号赋初值,initial块执行一次,always或者forever表示由事件激发反复执行

 

实例

`timescale 1 ns/ 1 ps

module ex0_vlg_tst();

// test vector input registers

reg clk;

reg rst_n;

// wires

wire led;

// assign statements (if any)

ex0 i1 (

// port map - connection between master ports and signals/registers

.clk(clk),

.led(led),

.rst_n(rst_n)

);

initial begin

$monitor($time,"led value = %b\n",led); //监控 led 信号的变化,如果其值发生变

化,立马打印出来

rst_n = 0;                

clk = 0;                          

#1000;                            

@(posedge clk);                       

rst_n = 1;                          

repeat(5) #1_000_000_000;  //延时 5s

$stop;                              

end  

 always #20 clk = ~clk;  //出生 25MHz 时钟信号

endmodule

 

系统任务的使用

1,仿真控制任务

$stop  格式: initial #500 $stop

$finish  格式: initial #500 $finish

$stop暂停仿真后返回软件操作主窗口,将控制权交给user

$finish终止仿真后关闭软件操作主窗口

$time 返回64位整型时间

未完,完整内容见附件 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
16
关闭 站长推荐上一条 /1 下一条