You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Verilog乘法模块中wire类型p0-p15输出全为高阻z是什么原因?

问题根因分析
  • 你的代码不存在类型错误,p0~p15 用wire类型搭配assign连续赋值是完全正确的,不需要换成reg类型。
  • 输出全z的核心原因是Verilog的仿真调度时序问题:你把initial打印块写在了Product模块内部,initial块的语句会在仿真0时刻优先执行,此时assign给p0~p15的连续赋值语句还没有完成求值更新,wire类型的初始值就是高阻z,因此打印出来全是z。
  • 直接打印{16{inputA[0]}} & inputB[15:0]能得到正确结果,是因为表达式会在$display执行时当场取inputA、inputB的当前值计算,不需要依赖wire的赋值更新。
修复方案

你可以选择任意一种方式解决打印问题:

  1. 在initial块的最开头添加#0; 延迟,让仿真器先完成所有连续赋值的更新,再执行打印逻辑:
initial begin
    #0; // 新增这行
    $display("%b",inputA);
    // 剩下的打印逻辑保持不变
end
  1. 更规范的做法是把打印逻辑移到testbench中,在给输入赋值后增加微小延迟再打印,避免时序竞争:
// 在testbench中新增initial块
initial begin
    #1;
    $display("%b", prod.p0); // 可通过层次化引用访问Product模块内部的p变量
    // 其他打印逻辑
    $finish;
end
  1. 补充遗漏的输出赋值:当前你的Product模块的Output端口没有赋值,需要补全所有部分积的求和逻辑:
assign Output = s0 + s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15;

内容的提问来源于stack exchange,提问作者Kirill Polovtsev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:54:03