TestBench 是用于验证设计功能是否正确的仿真环境,它不参与综合,仅用于仿真。
你提到的非常正确:
“例化的目的就是把待测试设计和 TestBench 进行对接。”
通过例化,TestBench 可以向 DUT 提供输入激励,并观察其输出响应。
reg
因为这些信号是由 TestBench 驱动的,需要赋值或产生激励波形,所以必须是 reg
类型。
例如:
reg clk;
reg rst_n;
reg [7:0] data_in;
wire
因为这些信号是由 DUT 驱动的,TestBench 只能观测,不能赋值,因此使用 wire
类型。
例如:
wire [7:0] data_out;
wire valid;
假设有一个名为 my_module
的模块定义如下:
module my_module (
input clk,
input rst_n,
input [7:0] data_in,
output reg [7:0] data_out,
output wire valid
);
...
endmodule
那么 TestBench 中的例化应如下所示:
module tb_my_module;
// 声明与 DUT 接口对应的信号
reg clk;
reg rst_n;
reg [7:0] data_in;
wire [7:0] data_out;
wire valid;
// 实例化 DUT
my_module uut (
.clk (clk),
.rst_n (rst_n),
.data_in (data_in),
.data_out(data_out),
.valid (valid)
);
// 激励生成部分
initial begin
clk = 0;
rst_n = 0;
#10 rst_n = 1;
data_in = 8'h55;
#20 data_in = 8'haa;
#100 $finish;
end
// 时钟生成
always #5 clk = ~clk;
// 监控输出
initial begin
$monitor("Time=%0t: data_out=%h, valid=%b", $time, data_out, valid);
end
endmodule
DUT 端口方向 | TestBench 中类型 | 是否可赋值 | 由谁驱动 |
---|---|---|---|
input | reg |
✅ 是 | TestBench |
output | wire |
❌ 否 | DUT |
inout | wire |
❌ 否 | DUT 或 TestBench(双向) |
logic
类型代替 reg
和 wire
,更加灵活。$monitor
、$display
、$strobe
来调试输出结果。initial
和 always
块生成各种激励信号。如果你还有关于 TestBench 编写、覆盖率分析、自动化测试等方面的问题,也欢迎继续提问!