如何编写一个高效的Testbench?_testbench编写

forever Clock = #(ClockPeriod / 2) ~ Clock;

end

// Clock Generation method 2:
initial begin
always #(ClockPeriod / 2) Clock = ~Clock;
end


        时钟信号一般使用always和Foever这两个循环来构建,方法很简单:每半个时钟周期,时钟信号翻转一次,这样就能实现周期性的占空比为50%的方波。 




---


### 提供激励


        为了获得testbenches的验证结果,必须向被测模块提供测试刺激。在testbenches上使用并行块来提供必要的测试激励。可以采用两种方法:绝对时间激励和相对时间激励。在第一种方法中,仿真数值相对于仿真时间零指定。相比之下,相对时间激励提供初始值,然后等待事件再重新触发激励。根据设计人员的需要,这两种方法可以在一个testbenches中实现。


        下面分别提供了绝对时间激励和相对时间激励的例子:


(1)绝对时间激励



initial begin
Reset = 1;
Load = 0;
Count_UpDn = 0;
#100 Reset = 0;
#20 Load = 1;
#20 Count_UpDn = 1;
end


        绝对时间激励使用#+时间来定义,比如#20就代表从仿真开始20个时间单位。


(2)相对时间激励



always @ (posedge clock)
TB_Count <= TB_Count + 1;

initial begin
if (TB_Count <= 5)
begin
Reset = 1;
Load = 0;
Count _UpDn = 0;
end
else
begin
Reset = 0;
Load = 1;
Count_UpDn = 1;
end
end

initial begin
if (Count == 1100) begin
Count_UpDn <= 0;
$display(“Terminal Count
Reached, now counting down.”);
end
end


        相对时间激励则使用某些时间来进行控制,比如时钟的上升沿啦,某个信号条变成具体的指定的值的时间啦,等等。


        Verilog中的所有initial块是一起并发执行的。但是,在每个initial块中,事件是按照写入的顺序执行的。这意味着测试激励在每个并发块中会从仿真的零时刻开始执行。设计者应该使用多个initial块将复杂的测试激励分解成多个简单的部分,从而使代码更具可读性和可维护性。




---


### 显示结果


        在Verilog中,通过$display和$monitor关键字可以方便地显示结果。


        以下是在终端屏幕上显示仿真结果的例子:



// pipes the ASCII results to the terminal or text editor

initial begin
$timeformat(-9,1,“ns”,12);
$display(" Time Clk Rst Ld SftRg Data Sel");
$monitor(“%t %b %b %b %b %b %b”, $realtime,
clock, reset, load, shiftreg, data, sel);
end


        $timeformat关键字指定时间变量的格式。$display关键字将带引号的文本("…")输出到终端窗口。$monitor关键字的工作方式不同,因为它的输出是事件驱动的。在本例中,$realtime变量(由用户分配给当前仿真时间)用于触发信号列表中值的显示。信号列表以$realtime变量开始,后面跟着要显示其值的其他信号的名称(时钟、重置、加载等)。开头的“%”关键字包含一个格式说明符列表,用于控制如何格式化信号列表中的每个信号值以便显示。格式列表是位置对应的——每个格式说明符顺序地与信号列表中的一个连续的信号名称相关联。例如,%t指示符将显示的$realtime值格式化为时间格式,而第一个%指定符将时钟值格式化为二进制格式。Verilog提供了额外的格式说明符,例如,%h用于十六进制格式,%d用于十进制格式,%o用于八进制格式。


        格式化的显示结果如图2所示。


![](https://img-blog.csdnimg.cn/faed008ac6454a88ac71014f17631420.png)


         $display是直接显示括号里的一句话,而$monitor则是对括号内的变量进行监控,每当监控变量中的任意一个发生改变,就会在终端打印所有的变量值。




---


### 简单的testbenches


        简单的testbenches例化被测模块,然后为其提供测试激励。Testbench输出以图形方式显示在仿真工具的波形窗口上,或者作为文本发送到用户的终端或文件。下面是一个表示移位寄存器的简单Verilog设计:



module shift_reg (clock, reset, load, sel, data, shiftreg);
input clock;
input reset;
input load;
input [1:0] sel;
input [4:0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值