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
此代碼對我來說是正確的 – Ari