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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:46:20