什么是测试平台
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 73 课,共 90 课。
testbench 是一种特殊的 Verilog 模块,用于测试另一个模块。它会向你的设计提供输入,并检查输出是否正确。
为什么需要测试平台?
构建模块时,你需要确保它能正常工作。测试平台可以让你:
- 向模块输入不同的值
- 观察输出
- 检查输出是否符合你的预期
- 自动完成此操作,无需手动测试
测试平台与设计模块
| 设计模块 | 测试平台 | |
|---|---|---|
| 用途 | 实现硬件 | 测试设计模块 |
| 有端口吗? | 有(输入和输出) | 没有(独立运行) |
| 可综合吗? | 可以 | 不可以(仅用于仿真) |
简单测试平台示例
module testbench; // 没有端口!
// 输入和输出来自正在测试的模块(DUT)。
reg a, b; // 用 reg 表示输入
wire c; // 用 wire 表示输出
// 这里实例化了模块:创建一个 and_gate 模块的实例,并将其命名为 dut
and_gate dut ( // 实例化 DUT
.a(a),
.b(b),
.c(c)
);
// 这是一个 initial 块,用于向被测模块的输入提供测试值。
initial begin // 提供测试值
a = 0; b = 0; #10;
a = 0; b = 1; #10;
a = 1; b = 0; #10;
a = 1; b = 1; #10;
$finish;
end
endmodule要点
- 测试平台没有端口
reg用于会变化的信号(输入到 DUT 的信号)wire用于来自 DUT 的信号(输出)
- 正在测试的模块称为 DUT(被测设计)
$finish会结束仿真
我们将在接下来的课程中介绍创建激励、显示结果和其他测试平台功能。
挑战
已为你提供一个与门模块。你的任务是在其测试平台中补全缺失部分。
操作说明:
在测试平台中添加以下部分:
- 为输入
a和b声明reg - 为输出
c声明wire - 实例化
and_gate,名称为dut,并连接各端口
亲手试试
module and_gate (
input a,
input b,
output c
);
assign c = a & b;
endmodule
module testbench;
// 任务 1:为输入 a 和 b 声明 reg。
// 任务 2:为输出 c 声明 wire。
// 任务 3:实例化 and_gate,命名为 dut。
// 连接 .a(a)、.b(b) 和 .c(c)。
initial begin
a = 0; b = 0; #10 $display("%d & %d = %d", a, b, c);
a = 0; b = 1; #10 $display("%d & %d = %d", a, b, c);
a = 1; b = 0; #10 $display("%d & %d = %d", a, b, c);
a = 1; b = 1; #10 $display("%d & %d = %d", a, b, c);
$finish;
end
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器