2024年大数据最全如何编写一个高效的Testbench?_testbench编写,想跳槽涨薪的必看

本文详细介绍了如何编写高效的FPGA Testbench,包括构建testbenches的基本部分,如产生时钟信号、提供激励和显示结果,以及自动化验证和高级testbenches技术。强调了使用任务分解测试激励的重要性,提供了实例代码,帮助开发者提升测试验证能力。
摘要由CSDN通过智能技术生成

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

构建testbenches

testbenches可以用VHDL或Verilog编写。由于testbenches仅用于仿真,因此它们不受可综合过程中使用的RTL语言子集的语义约束的限制。因此,可以更通用地编写测试testbenches,这会使得它们更具可维护性。

所有的testbenches都包含表1中所示的基本部分。如上所述,testbenches通常还包含额外的功能,例如在终端上显示结果和错误检测功能。

下面的例子展示了一些在testbenches中经常使用的结构。

上面的结构是一个testbenches一定会具备的基本结构,testbenches的编写比较灵活,因为其内容不需要综合,也就是说不需要被映射到具体的电路实现,说白了,就是设计者随心所欲的写激励来作为输入,观察被测的功能模块能否在对应测试激励下,实现符合预期条件的输出。


产生时钟信号

使用系统时钟来实现时序逻辑的设计必须生成一个时钟。时钟可以很容易地在Verilog源代码中实现。以下是时钟生成的例子:

// Declare a clock period constant.
Parameter ClockPeriod = 10;

// Clock Generation method 1:
initial begin
    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中,通过 d i s p l a y 和 display和 displaymonitor关键字可以方便地显示结果。

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

// 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

t i m e f o

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值