16 位 ALU 的结果总是 0

16-bit ALU always results in 0

always @* begin
if (SEL == 3'b000)
    ALU_OUT = A + B;
if (SEL == 3'b001)
    ALU_OUT = A - B;
if (SEL == 3'b010)
    ALU_OUT = ~(A & B);
if (SEL == 3'b011);
    ALU_OUT = ~(A | B);
if (SEL == 3'b100)
    ALU_OUT = ~A;
if (SEL == 3'b101)
    ALU_OUT = A >> B;
else 
    ALU_OUT = 0;
end

以上是我的代码,目前针对ALU。我必须为溢出编写代码,但主要问题是代码中的任何内容都不起作用。我不确定我必须修复什么,因为计算机没有说有任何错误。但是,我没有通过所有测试。结果全部为0.

你的代码有逻辑错误。您有 5 个单独的 if 语句,外加 1 个 if/else 语句。您很可能打算使用单个级联 if/else if/ else 语句。为了避免此类错误,最好使用 case 语句:

always @* begin
    case (SEL)
        3'b000  : ALU_OUT = A + B;
        3'b001  : ALU_OUT = A - B;
        3'b010  : ALU_OUT = ~(A & B);
        3'b011  : ALU_OUT = ~(A | B);
        3'b100  : ALU_OUT = ~A;
        3'b101  : ALU_OUT = A >> B;
        default : ALU_OUT = 0;
    endcase
end

使用case语句,一旦SEL匹配其中一个case项,case语句立即退出。

在您的代码中,每个 if 都会被评估,最后一个获胜。例如,如果 SEL 为 0,则执行 ALU_OUT = A + B。模拟器还会检查剩余的 if 语句。当它到达 if (SEL == 3'b101) 时,计算结果为 false,这意味着 else 语句被执行:ALU_OUT = 0。这就是你得到 0 的原因。elseSEL 的任何值执行。

我在 edaplayground 上发布了一个完整的测试平台,证明 case 语句有效。