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 的原因。else
对 SEL
的任何值执行。
我在 edaplayground 上发布了一个完整的测试平台,证明 case
语句有效。
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 的原因。else
对 SEL
的任何值执行。
我在 edaplayground 上发布了一个完整的测试平台,证明 case
语句有效。