Testbench中Driver与Monitor无正确输出问题排查及代码修改建议
1x3路由器验证异常的问题排查与修改方案
一、路由器设计(router_1x3)端可能的问题
- 选择信号解码逻辑错误:检查
case语句中sel=2'b10的分支是否正确。比如是否误写为2'b01,或者default分支优先级过高覆盖了该情况。修改时确保2'b10分支明确赋值out2 = data_in(同步逻辑必须用非阻塞赋值<=)。// 正确的同步逻辑示例 always @(posedge clk or negedge rst_n) begin if(!rst_n) begin out0 <= 0; out1 <= 0; out2 <= 0; end else begin case(sel) 2'b00: out0 <= data_in; 2'b01: out1 <= data_in; 2'b10: out2 <= data_in; // 确认该分支存在且逻辑正确 default: begin out0 <= 0; out1 <= 0; out2 <= 0; end endcase end end - 端口定义错误:检查
out2是否被定义为output类型,而非input或inout;同时确认sel的位宽与Testbench一致(设计中sel需为2bit)。 - 复位信号未正确释放:若设计带复位,确认Testbench中复位信号已在测试开始后拉低(或拉高,依复位极性),避免输出始终被复位为0。
二、Testbench Driver模块问题
- 驱动时序不匹配:若设计为同步逻辑,Driver需在时钟边沿驱动信号,确保DUT能采样到正确值。避免直接组合逻辑赋值,改用时钟块驱动:
// Driver中的时钟块示例 clocking cb @(posedge clk); default input #1step output #0; output sel, data_in; endclocking task drive_packet; input [1:0] sel_in; input [7:0] data_in_val; cb.sel <= sel_in; cb.data_in <= data_in_val; @cb; // 等待一个时钟周期,让DUT完成采样 endtask - 信号连接错误:确认Driver的
sel和data_in信号已正确连接到DUT的对应端口,而非悬空或连接到错误信号。 - 位宽不匹配:检查Driver中
sel(需为2bit)和data_in的位宽是否与DUT端口一致,避免因位宽截断导致sel实际值为0。
三、Testbench Monitor模块问题
- 采样时机错误:Monitor需在DUT输出更新后采样,同步逻辑应在时钟上升沿之后采样(比如
@(posedge clk)后延迟一点,或用##1):always @(posedge clk) begin ##1; // 等待输出完成更新 $display("out2 = %d", dut.out2); end - 采样信号错误:确认Monitor采集的是DUT的
out2端口,而非Testbench中其他初始为0的内部信号。
四、DUT与Testbench连接问题
- 检查顶层Testbench中DUT的端口连接,确保
out2未悬空或接地,正确连接到Monitor的观测信号:router_1x3 dut( .clk(clk), .rst_n(rst_n), .sel(driver.sel), .data_in(driver.data_in), .out0(out0), .out1(out1), .out2(out2) // 确认该连接存在且正确 );
内容的提问来源于stack exchange,提问作者Arjun Ram
相关产品推荐
相关产品推荐

