文档介绍:数字集成电路设计入门
--从HDL到版图
于敦山
北大微电子学系
第十五章 Verilog Test Bench使用简介
学习内容:
用一个复杂的test bench复习设计的组织与仿真
建立test bench通常使用的编码风格及方法
设计组织
虚线表示编译时检测输入文件是否存在及可读并允许生成输出文件。
test bench组织
简单的test bench向要验证的设计提供向量,人工验证输出。
复杂的test bench是自检测的,其结果自动验证。
stimulus
要验证的设计
简单的test bench
复杂的test bench
激励
验证结果
要验证的设计
并行块
fork…join块在测试文件中很常用。他们的并行特性使用户可以说明绝对时间,并且可以并行的执行复杂的过程结构,如循环或任务。
module inline_ tb;
reg [7: 0] data_ bus;
// instance of DUT
initial fork
data_bus = 8'b00;
#10 data_bus = 8'h45;
#20 repeat (10) #10 data_bus = data_bus + 1;
#25 repeat (5) #20 data_bus = data_bus << 1;
#140 data_bus = 8'h0f;
join
endmodule
上面的两个repeat循环从不同时间开始,并行执行。象这样的特殊的激励集在单个的begin…end块中将很难实现。
Time | data_ bus
0 | 8’b0000_0000
10 | 8’b0100_0101
30 | 8’b0100_0110
40 | 8’b0100_0111
45 | 8’b1000_1110
50 | 8’b1000_1111
60 | 8’b1001_0000
65 | 8’b0010_0000
70 | 8’b0010_0001
80 | 8’b0010_0010
85 | 8’b0100_0100
90 | 8’b0100_0101
100 | 8’b0100_0110
105 | 8’b1000_1100
110 | 8’b1000_1101
120 | 8’b1000_1110
125 | 8’b0001_1100
140 | 8’b0000_1111
包含文件
包含文件用于读入代码的重复部分或公共数据。
module clk_gen (clk);
output clk; reg clk;
`include ""
initial begin
while ($ time < sim_end)
begin
clk = initial_clock;
#(period/2) clk = !initial_clock;
#(period/2);
end
$finish;
end
endmodule
在上面的例子中,公共参数在一个独立的文件中定义。此文件在不同的仿真中可被不同的测试文件调用。
// common. txt
// clock and simulator constants
parameter initial_clock = 1;
parameter period = 15;
parameter max_cyc = 100;
parameter sim_end = period * max_cyc
施加激励
产生激励并加到设计有很多种方法。一些常用的方法有:
从一个initial块中施加线激励
从一个循环或always块施加激励
从一个向量或整数数组施加激励
记录一个仿真过程,然后在另一个仿真中回放施加激励
线性激励
线性激励有以下特性:
只有变量的值改变时才列出
易于定义复杂的时序关系
对一个复杂的测试,测试基准(test bench)可能非常大
module inline_ tb;
reg [7: 0] data_ bus, addr;
wire [7: 0] results;
DUT u1 (results, data_ bus, addr);
initial
fork
data_bus = 8'h00;
addr = 8'h3f;
#10 data_ bus = 8'h45;
#15 addr = 8'hf0;
#40 data_ bus = 8'h0f;
#60 $finish;
join
endmodule
循环激励
从循环产生激励有以下特性:
在每一次循环,修改同一组激励变量
时序关系规则
代码紧凑
module loop_tb;
reg clk;
r