Verilog模块输出出现ZZZZ异常,请求排查故障原因
Verilog模块输出高阻态(ZZZZ)问题排查
我编写了如下Verilog模块,预期功能为:当Odds信号为真时,输出B+C的运算结果;当Evens信号为真且Odds为假时,输出B-C的运算结果;当两者均不成立时输出0。但仿真后模块输出出现ZZZZ,多次检查逻辑未发现问题,恳请帮忙排查原因。
模块代码
module ECE228_2( input [7:0] A, input [3:0] B, input [3:0] C, output [4:0] Out ); wire Odds, XEvens, Evens; wire [3:0]Bit4AddOut, Bit4AddCarry, Bit4SubOut, Bit4SubCarry, NotC; wire [4:0]EvenMuxOut; //C取反用于补码减法 not xC0(NotC[0],C[0]); not xC1(NotC[1],C[1]); not xC2(NotC[2],C[2]); not xC3(NotC[3],C[3]); //对奇数位异或,判断1的个数是否为奇数 xor xo0(Odds,A[1],A[3],A[5],A[7]); //对偶数位异或后取反,判断1的个数是否为偶数 xor xo1(XEvens,A[0],A[2],A[4],A[6]); not evenflip(Evens,XEvens); //4位加法:B+C FullAdd FA0(B[0],C[0],1'b0,Bit4AddOut[0],Bit4AddCarry[0]); FullAdd FA1(B[1],C[1],Bit4AddCarry[0],Bit4AddOut[1],Bit4AddCarry[1]); FullAdd FA2(B[2],C[2],Bit4AddCarry[1],Bit4AddOut[2],Bit4AddCarry[2]); FullAdd FA3(B[3],C[3],Bit4AddCarry[2],Bit4AddOut[3],Bit4AddCarry[3]); //4位减法:B-C(通过补码实现) FullAdd FAS0(B[0],NotC[0],1'b1,Bit4SubOut[0],Bit4SubCarry[0]); FullAdd FAS1(B[1],NotC[1],Bit4SubCarry[0],Bit4SubOut[1],Bit4SubCarry[1]); FullAdd FAS2(B[2],NotC[2],Bit4SubCarry[1],Bit4SubOut[2],Bit4SubCarry[2]); FullAdd FAS3(B[3],NotC[3],Bit4SubCarry[2],Bit4SubOut[3],Bit4SubCarry[3]); //2选1多路选择器:Evens为真时输出B-C,否则输出0(5位) MUX2_1 EvenMux0(Bit4SubOut[0],1'b0,Evens,EvenMuxOut[0]); MUX2_1 EvenMux1(Bit4SubOut[1],1'b0,Evens,EvenMuxOut[1]); MUX2_1 EvenMux2(Bit4SubOut[2],1'b0,Evens,EvenMuxOut[2]); MUX2_1 EvenMux3(Bit4SubOut[3],1'b0,Evens,EvenMuxOut[3]); MUX2_1 EvenMux4(Bit4SubCarry[3],1'b0,Evens,EvenMuxOut[4]); //2选1多路选择器:Odds为真时输出B+C,否则输出上层选择器结果 MUX2_1 OddMux0(Bit4AddOut[0],EvenMuxOut[0],Odds,Out[0]); MUX2_1 OddMux1(Bit4AddOut[1],EvenMuxOut[1],Odds,Out[1]); MUX2_1 OddMux2(Bit4AddOut[2],EvenMuxOut[2],Odds,Out[2]); MUX2_1 OddMux3(Bit4AddOut[3],EvenMuxOut[3],Odds,Out[3]); MUX2_1 OddMux4(Bit4AddCarry[3],EvenMuxOut[4],Odds,Out[4]); endmodule //2选1多路选择器模块 module MUX2_1( input MuxTrue, input MuxFalse, input MuxSel, output MuxOut ); wire MuxA1, MuxA2, XMuxSel; //选择信号取反 not XSel(XMuxSel,MuxSel); //选择信号为1时的路径 and MATrue(MuxA1,MuxTrue,MuxSel); //选择信号为0时的路径 and MAFalse(MuxA2,MuxFalse,XMuxSel); //合并输出 or MuxOr(MuxOut,MuxA1,MuxA2); endmodule //全加器模块 module FullAdd( input FAin1, input FAin2, input FACin, output FAOut, output FACout ); wire FAWHA1Out,FAWHA1Cout,FAWHA2Cout; //调用半加器实现全加器 HalfAdd FA_HA1(FAin1,FAin2,FAWHA1Cout,FAWHA1Out); HalfAdd FA_HA2(FAWHA1Out,FACin,FAWHA2Cout,FAout); or FAOr(FACout,FAWHA1Cout,FAWHA2Cout); endmodule //半加器模块 module HalfAdd( input HAin1, input HAin2, output HACout, output HAOut ); //半加器门级实现 xor HAXOR(HAOut,HAin1,HAin2); and HAAND(HACout,HAin1,HAin2); endmodule
测试平台代码
module ECE228_2_test; reg [7:0]A; reg [3:0]B; reg [3:0]C; wire [4:0]Out; ECE228_2 uut ( .A(A), .B(B), .C(C), .Out(Out) ); initial begin B = 4'b0111; //B = 7 C = 4'b0011; //C = 3 //顺序测试A的不同取值 A = 8'b00000000; #10 A = 8'b00000001; #10 A = 8'b00000010; #10 A = 8'b00000011; #10 A = 8'b00000100; #10 A = 8'b00000101; #10 A = 8'b00000111; #10 A = 8'b00001000; //随机测试A的取值 #10 A = 8'b11011000; #10 A = 8'b00011110; #10 A = 8'b10100101; #10 A = 8'b00110101; #10 A = 8'b11001010; #10 A = 8'b11100001; #10 A = 8'b11111111; #10 A = 8'b01011010; #10 A = 8'b01110010; end endmodule
仿真输出

问题排查与修正
核心错误出在FullAdd模块的端口拼写不一致:
在FullAdd模块定义中,输出端口为FAOut(大写O结尾),但在调用HalfAdd FA_HA2时,误写为FAout(小写o结尾)。这个拼写错误导致FAOut信号未被正确驱动,进而引发后续加法/减法电路的输出信号处于未定义状态,最终导致顶层模块的Out输出高阻态(ZZZZ)。
修正后的FullAdd模块代码如下:
//修正后的全加器模块 module FullAdd( input FAin1, input FAin2, input FACin, output FAOut, output FACout ); wire FAWHA1Out,FAWHA1Cout,FAWHA2Cout; //调用半加器实现全加器 HalfAdd FA_HA1(FAin1,FAin2,FAWHA1Cout,FAWHA1Out); HalfAdd FA_HA2(FAWHA1Out,FACin,FAWHA2Cout,FAOut); // 修正拼写:FAout → FAOut or FAOr(FACout,FAWHA1Cout,FAWHA2Cout); endmodule
修正后重新仿真,输出将恢复正常,符合预期功能。
内容的提问来源于stack exchange,提问作者Scott Carey
相关产品推荐
相关产品推荐

