共计 1580 个字符,预计需要花费 4 分钟才能阅读完成。
- Testbench 的概念
Testbench 是一种用任意语言编写的程序或模块,用于在模仿过程中执行和验证硬件模型的性能正确性。Verilog 次要用于硬件建模(模仿),该语言蕴含各种资源,用于格式化,读取,存储,动态分配,比拟和写入模仿数据,包含输出激励和输入后果。 - Testbench 的组成组件
Testbench 的次要组件如下:
时间表申明:指定所有提早的工夫单位
Module:它定义了测试文件的 top 模块,测试文件的 top 模块通常没有输入输出端口,测试是间接监控寄存器和线网这些外部信号的流动
外部信号:它将驱动激励信号进入 UUT 并监控 UUT 的响应,信号驱动和监控
UUT 实例化
激励生成:编写语句以创立激励和程序块
响应监控和比拟:自我测试语句,能报告数值,谬误和正告
2-1. Testbench 的提早建模
Verilog 反对两种类型的提早建模:(i)惯性和(ii)传输。惯性提早是门(gate)或电路因为其物理个性而可能经验的提早。依据所应用的技术,它能够是 ps 或 ns。惯性提早还用于确定输出是否对门或电路有影响。如果输出至多在初始提早时没有放弃变动,则疏忽输出变动。例如,5 ns 的惯性提早意味着无论何时输出发生变化,它都应放弃至多 5 ns 的变动,以使其被视为已更改,否则将疏忽该变动(被视为噪声尖峰)。传输提早是传输电路导线的信号的航行工夫。以下是运输和惯性提早的示例:
wire #2 a_long_wire; // 运输提早两单元工夫
xor #1 M1(sum, a, b); // 惯性提早 1 单元工夫
2-2. Testbench 中的初始语句
初始语句在 testbenchs 中用于生成激励和管制仿真执行。参照上面的一个例子:
initial begin
#100 $finish; // run simulation for 100 units
end
initial begin
#10 a=0; b=0; // a, b zero after 10 units delay. Between 0 and 10,
// it is x
#10 b=1; // At 20, make b=1
#10 a=1; // at 30, make a=1
#10 b=0; // at 40, make b=0
end
上面是生成称为时钟的周期信号的初始语句用法的另一个示例。它将产生 50%占空比的时钟信号,周期为 20 个单位。
reg clock;
parameter half_cycle = 10;
initial begin
clock = 0;
forever begin
#half_cycle clock = 1;
#half_cycle clock = 0;
end
end
- 应用 Testbench 的一个例子
第 1 行定义了 `timescale 指令。
第 2 行和第 3 行定义了测试平台模块名称。请留神,通常,testbench 模块的端口列表中不列出端口。
第 5 即将拨动开关定义为 reg 数据类型,因为它将用于提供激励。它连贯到被测试(tutorial)的实例化设施。
第 11 行应用实例名称 tut1 和输出 / 输入端口实例化测试(tutorial)中的设计。
第 13 行到第 22 行定义了计算预期输入的 function。
第 24 至 35 行应用 initial 过程形容来定义激励。能够在仿真器控制台窗口中应用 system task $ display 来查看第 31 行和第 33 行生成的音讯。
第 29 行通过传递开关参数调用函数 expected_led,并将返回的(计算过的)输入调配给 e_led。e_led 在第 7 行定义为 reg 类型,因为它在过程语句(初始)中接管函数调用的输入。
第 28 和 29 行还别离定义惯性提早 50 和 10,以模仿提早。
- 开发一个生成特定波形的 Testbench
开发一个 testbench,生成如下所示的波形。
试验步骤:
关上 Vivado 并创立一个名为 Testbench 的空白我的项目。
创立并增加输入下面显示的波形的 Verilog 模块。
将设计模仿 150 ns 并验证是否生成了正确的输入。