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的赋值更新。
修复方案
你可以选择任意一种方式解决打印问题:
- 在
initial块的最开头添加#0;延迟,让仿真器先完成所有连续赋值的更新,再执行打印逻辑:
initial begin #0; // 新增这行 $display("%b",inputA); // 剩下的打印逻辑保持不变 end
- 更规范的做法是把打印逻辑移到
testbench中,在给输入赋值后增加微小延迟再打印,避免时序竞争:
// 在testbench中新增initial块 initial begin #1; $display("%b", prod.p0); // 可通过层次化引用访问Product模块内部的p变量 // 其他打印逻辑 $finish; end
- 补充遗漏的输出赋值:当前你的
Product模块的Output端口没有赋值,需要补全所有部分积的求和逻辑:
assign Output = s0 + s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15;
内容的提问来源于stack exchange,提问作者Kirill Polovtsev
相关产品推荐
相关产品推荐

