Verilog Testbench中port_match_tb信号为X未同步更新问题求助
问题定位与修复方案
核心错误根源
你遇到的X态问题是Testbench中存在多驱动冲突,错误出在port_match_tb的声明代码:
// 错误写法 wire [31:0] port_match_tb = 0;
Verilog中给wire类型变量直接赋值等价于添加了一个连续赋值语句,将该信号永久绑定到固定值0;同时这个wire信号又连接到了待测模块test_module_i的port_match输出端口,相当于同一个信号有两个互不关联的驱动源:
- 驱动源1:待测模块内部逻辑输出的
port_match动态值 - 驱动源2:固定电平0
两个驱动源输出值不一致时,仿真器就会判定该信号为不定态X,这就是你看到的不同步现象。
修复方法
直接删除wire声明后的初始赋值即可,修改后的代码为:
// 正确写法 wire [31:0] port_match_tb;
wire类型信号本身不需要手动赋初始值,它的取值完全由所连接的驱动源决定,修改后待测模块的输出会直接驱动port_match_tb,仿真时就能和模块内部的port_match信号同步更新。
可选优化建议
你待测模块的always块存在逻辑重叠隐患:如果某一拍同时满足rx_vld_net && rx_sof_net和rx_vld_net && rx_eof_net(也就是单拍报文的场景,SOF和EOF同时拉高),两个对port_match的非阻塞赋值会同时触发,虽然Verilog语法规定同一过程块中后写的赋值会覆盖前写的,但为了逻辑可读性更好,建议修改为互斥的条件分支:
always @(posedge clk_net) begin if(rx_vld_net) begin if(rx_sof_net || rx_eof_net) begin port_match <= 0; end else begin port_match <= port_match + 1; end end // 其余场景保持原值,无需额外处理 end
内容的提问来源于stack exchange,提问作者Manisha Riyana
相关产品推荐
相关产品推荐

