Verilog向量赋值异常:wire u赋值后仍为zzzz,求解决方案
Verilog向量赋值导致u输出zzzz的原因与修复
核心问题:线网多驱动冲突
你代码里对u的每一位都做了两次assign赋值:先写了assign u[3] = 1;这类直接赋值,之后又用assign u[3] = s[3];这类依赖s的赋值。在Verilog中,wire类型线网被多个连续赋值语句驱动时,会触发冲突解析,最终结果就是高阻态Z,这就是u输出zzzz的根源。修复步骤
删掉对u的重复驱动语句,只保留你需要的那组赋值逻辑。比如保留依赖s的assign,去掉直接赋值1/0的代码段。额外优化
对4位wires的赋值,单独给每一位写assign虽然合法,但更简洁规范的写法是直接整体赋值:assign s = 4'b1111;,减少冗余代码。
修改后的示例代码:
module test; wire [3:0] s; wire [3:0] u; // 更简洁的整体赋值方式 assign s = 4'b1111; // 只保留这组依赖s的赋值,移除重复的assign语句 assign u[3] = s[3]; assign u[2] = s[2] & ~|s[3]; assign u[1] = s[1] & ~|s[3:2]; assign u[0] = s[0] & ~|s[3:1]; initial begin $display("%d", s[3]); $display("%d", s[2]); $display("%d", s[1]); $display("%d", s[0]); $display("%d", s); $display("%d", u[3]); $display("%d", u[2]); $display("%d", u[1]); $display("%d", u[0]); $display("%d", u); end endmodule
内容的提问来源于stack exchange,提问作者Tcrumb
相关产品推荐
相关产品推荐

