Verilog错误:ALU输出右移一位

时间:2014-03-25 21:32:49

标签: verilog

出于某种原因,在我的用于ALU的Verilog代码中,输出被正确计算,但随后向右移位了一位。

我通过使用嵌入式逻辑分析仪监控信号来了解这一点,并且我100%确定这是正在发生的事情。我无法监控aluout_A,但我可以看到aluout_M(应该是aluout_A,有一个周期延迟)以及aluin1_A,aluin2_A和alufunc_A。

如果我没有弄错,问题应该出现在下面的代码块中,但我完全不知道为什么会发生这种情况。

reg signed [(DBITS-1):0] aluout_A;
always @(alufunc_A or aluin1_A or aluin2_A) begin
    case(alufunc_A)
        {1'b0,OP2_ALU_ADD }: aluout_A=aluin1_A+aluin2_A;
        {1'b0,OP2_ALU_SUB }: aluout_A=aluin1_A-aluin2_A;
        {1'b0,OP2_ALU_AND }: aluout_A=aluin1_A&aluin2_A;
        {1'b0,OP2_ALU_OR  }: aluout_A=aluin1_A|aluin2_A;
        {1'b0,OP2_ALU_XOR }: aluout_A=aluin1_A^aluin2_A;
        {1'b0,OP2_ALU_NAND}: aluout_A=~(aluin1_A&aluin2_A);
        {1'b0,OP2_ALU_NOR }: aluout_A=~(aluin1_A|aluin2_A);
        {1'b0,OP2_ALU_NXOR}: aluout_A=~(aluin1_A^aluin2_A);
        {1'b0,OP2_ALU_MVHI}: aluout_A={aluin2_A[15:0],16'b0};
        {1'b1,OP2_CMP_F   }: aluout_A={31'b0,1'b0};
        {1'b1,OP2_CMP_EQ  }: aluout_A={31'b0,aluin1_A==aluin2_A};
        {1'b1,OP2_CMP_LT  }: aluout_A={31'b0,aluin1_A< aluin2_A};
        {1'b1,OP2_CMP_LTE }: aluout_A={31'b0,aluin1_A<=aluin2_A};
        {1'b1,OP2_CMP_EQZ }: aluout_A={31'b0,aluin1_A==32'b0};
        {1'b1,OP2_CMP_LTZ }: aluout_A={31'b0,aluin1_A< 32'b0};
        {1'b1,OP2_CMP_LTEZ}: aluout_A={31'b0,aluin1_A<=32'b0};
        {1'b1,OP2_CMP_T   }: aluout_A={31'b0,1'b1};
        {1'b1,OP2_CMP_NE  }: aluout_A={31'b0,aluin1_A!=aluin2_A};
        {1'b1,OP2_CMP_GTE }: aluout_A={31'b0,aluin1_A>=aluin2_A};
        {1'b1,OP2_CMP_GT  }: aluout_A={31'b0,aluin1_A> aluin2_A};
        {1'b1,OP2_CMP_NEZ }: aluout_A={31'b0,aluin1_A!=32'b0};
        {1'b1,OP2_CMP_GTEZ}: aluout_A={31'b0,aluin1_A>=32'b0};
        {1'b1,OP2_CMP_GTZ }: aluout_A={31'b0,aluin1_A> 32'b0};
        default:  aluout_A={DBITS{1'bX}};
    endcase
end

reg signed [(DBITS-1):0] aluout_M;
always @(posedge clk) begin
    aluout_M <= aluout_A;
end

1 个答案:

答案 0 :(得分:0)

发现问题。出于某种原因(我是一个白痴),在逻辑分析仪中只选择了位31:1,解释了看似位移。