编写高效的测试设计(testbenches)
简介:
由于设计的规模越来越大和越来越复杂,数字设计的验证已经成为一个日益困难和繁琐的事。面对挑战,验证工程师们依靠许多的验证工具和方法。对于大的系统,如几百万门的设计,工程师们一般使用一套可靠的验证工具。当然,对于一些小的设计,设计工程师常常发现带有测试的hdl仿真器就可以做得很好。
测试设计已经成为一个验证高级语言设计HLL (High-Level Language) 的标准方法。
典型的,测试设计完成以下任务:
实现测试设计;
仿真通过使用模块的测试向量来仿真测试设计;
输出结果到终端或波形窗口以检视;
可选择的将实际结果和预期结果进行比较。
一般测试设计使用工业标准的VHDL或verilog硬件描述语言来编写。测试设计调用功能设计,然后仿真。复杂的测试设计完成一些附加的功能----如它们包含逻辑来为设计决定适当的设计激励或比较实际结果和预期结果。
后续的章节说明了一个非常稳定的测试设计的结构,并且提供了一个自较验测例子----它将自动比较实际结果和测试设计的预期结果。
图1说明一个基于以上基本要求的标准的hdl验证流程。由于测试设计使用VHDL或verilogHDL来描述,测试设计的验证过程可以在不同的平台或不同公司的软件工具环境完成。另外,由于VHDL或verilogHDL是公开的通用标准语言,使用VHDL或verilogHDL来描述验证设计可以毫无困难的在将来重用。
图1使用测试设计的HDL测试验证流程
构建测试设计:
测试设计可以用VHDL或verilogHDL来描述.因为测试设计只用来进行仿真,它们没有那些适应综合中仅应用的rtl语言子集的语法约束的限制.而是所有的行为结构都可以使用。从而测试设计可以编写的更为通用,使得它们可以更容易维护。
所有的测试设计包含了如表1的基本程序段块。正如上面所提到的,测试设计一般包含更多的附加功能,如在终端上可视的结果和内建的错误检测。
测试设计的基本程序段
下面的例子说明经常使用的测试设计的结构。
产生时钟信号
使用系统时钟来的时序逻辑设计必须产生时钟。重复的时钟信号可以很容易的在vhdl或verilog源码中实现。以下是vhdl和verilog的时钟发生示例。
VHDL:
-- Declare a clock period constant.
Constant ClockPeriod : TIME := 10 ns;
-- Clock Generation method 1:
Clock <= not Clock after ClockPeriod / 2;
-- Clock Generation method 2:
GENERATE CLOCK: process
begin
wait for (ClockPeriod / 2)
Clock <= ’1’;
wait for (ClockPeriod / 2)
Clock <= ’0’;
end process;
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
准备激励信号
为了获得测试设计的验证结果,激励必须在测试设计中提供。在测试设计中使用的并行激励块提供必要的激励。两个方法被考虑:绝对时间激励和相对时间激励。在第一个方法里,仿真变量被详细描述为相对于仿真时间零点。通过比较,相对时间激励提供初始值,然后在重触发激励前等待一个事件。根据设计者的需要,两种方法可以在测试设计中组合使用。
表2 绝对时间激励
表2和表3分别以vhdl和verilog提供了一个绝对时间激励和相对时间激励的源代码。
表3 相对时间激励
VHDL进程块和Verilog初始块与设计文件中的其他的进程块或初始块同时执行。然而,在每一个进程块或初始块中,事件是按照书写的顺序有序的规划的。这说明在仿真时间零点并发的每一个块激励的顺序。多模块应该被用来将复杂的激励顺序分解为有 更好的可读性和方便维护的代码。
显示结果
在verilog中推荐使用关键字$display 和 $monitor 显示结果。虽然vhdl没有等效的显示指令,它提供了std_textio标准文本输入输出程序包。它允许文件的i/o重定向到显示终端窗口(作为这个技术的示例,参看下面的自较验查验证设计)
下面是verilog示例,它将在终端屏幕上显示一些值。
// 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
关键字 $display在终端屏幕上输出引用的附加的说明文字(“。。。”).关键字$monitor
- 现代实时频谱测试技术(10-23)
- TD-SCDMA系统终端CC实体的一致性测试(10-27)
- 用数字荧光示波器对开关电源功率损耗进行精确分析(11-04)
- 基于FFT的低频谐波失真度测试仪(01-30)
- 针对高速物理层的测试解决方案(03-29)
- 秘密武器助你从容应对噪声检测难题(03-29)