编写高效率的testbench

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编写高效率的testbench

简介:

由于设计的规模越来越大也越来越复杂,数字设计的验证已经成为一个日益困难和繁琐的任务。验证工程师们依靠一些验证工具和方法来应付这个挑战。对于几百万门的大型设计,工程师们一般使用一套形式验证(formal verification)工具。然而对于一些小型的设计,设计工程师常常发现用带有testbench的HDL仿真器就可以很好地进行验证。

Testbench已经成为一个验证高级语言(HLL --High-Level Language) 设计的标准方法。通常testbench完成如下的任务:

1.实例化需要测试的设计(DUT);

2.通过对DUT模型加载测试向量来仿真设计;

3.将输出结果到终端或波形窗口中加以视觉检视;

4.另外,将实际结果和预期结果进行比较。

通常testbench用工业标准的VHDL或Verilog硬件描述语言来编写。Testbench调用功能设计,然后进行仿真。复杂的testbench完成一些附加的功能—例如它们包含一些逻辑来选择产生合适的设计激励或比较实际结果和预期结果。

后续的章节描述了一个仔细构建的testbench的结构,并且提供了一个自动比较实际结果与预期结果的进行自我检查的testbench例子。

图1给出了一个如上所描述步骤的标准HDL验证流程。由于testbench使用VHDL或Verilog来描述,testbench的验证过程可以根据不同的平台或不同的软件工具实现。由于VHDL或Verilog是公开的通用标准,使用VHDL或Verilog编写的testbench以后也可以毫无困难地重用(reuse)。

图1使用Testbench的HDL验证流程

构建Testbench

Testbench用VHDL或Verilog来编写。由于testbench只用来进行仿真,它们没有那些适用于综合的RTL语言子集的语法约束限制,而是所有的行为结构都可以使用。因而testbench可以编写的更为通用,使得它们可以更容易维护。

所有testbench包含了如表1的基本程序段。正如上面所提到的,testbench通常包含附加功能,如在终端上可视的结果和内建的错误检测。

表1 testbench 的基本程序段

下面的例子介绍testbench 中经常使用的结构。

产生时钟信号

使用系统时钟的时序逻辑设计必须产生时钟。时钟信号在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 Clock = 0;

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

end

// Clock Generation method 2:

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

提供激励信号 为了获得testbench 的验证结果,激励必须作用于DUT 。在testbench 中使用的并行激励块提供必要的激励。激励的产生可以采用两个方法:绝对时间激励和相对时间激励。在第一个方法里,仿真变量相对于仿真时间零点进行详细描述。相对而言,相对时间激励提供初始值,然后等待一个事件来重新触发激励。根据设计者的需要,两种方法可以在testbench 中同时使用。

下面的程序段是绝对时间激励的例子。

声明时钟信号:对时钟信号的驱动方法1 :方法2 :(输入信号的驱动)

initial begin reset = 1; load = 0; cout_updn = 0; #100 reset = 0;

#20 load = 1;

#20 count_updn = 1;

end

下面的程序段是相对时间激励的例子。 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 ()显示结果。VHDL 没有等效的显示指令,它提供了std_textio 标准文本输入输出程序包。它允许文件的i/o 重定向到显示终端窗口(作为这个技术的示例,参看下面的自较验查验证设计)

下面是verilog 示例,它将在终端屏幕上显示一些值。

实例

以绝对时间刻度,

描述输入信号 :

持续100个单位时间,reset 为L 。实例以相对时间刻度,

描述输入信号 :initial 语法特点 :

相关文档
最新文档