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,加载测试向量时,避免在时钟的上下沿变化,比如数据最好在时钟上升沿之前变化,这也符合建立时间的要求。
4,initial和always是同时执行的,只是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位整型时间
未完,完整内容见附件
文章评论(0条评论)
登录后参与讨论