2014-03-25 79 views
0

出於某種原因,在ALU的Verilog代碼中,輸出計算正確,但後來右移一位。Verilog錯誤:ALU輸出右移一位

我從嵌入式邏輯分析儀的監控信號中知道這一點,並且我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 
+0

此代碼對我來說是正確的 – Ari

回答

0

發現問題。出於某種原因(我是一個白癡),在邏輯分析儀中,只選擇31:1位,解釋看似位移。