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。
发布于 2021-05-13 13:43:13
您的代码有一个逻辑错误。您有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的任何值都执行。
我在操场上发布了一个完整的测试平台,演示了case语句的工作原理。
https://stackoverflow.com/questions/67519817
复制相似问题