出于某种原因,在我的用于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
答案 0 :(得分:0)
发现问题。出于某种原因(我是一个白痴),在逻辑分析仪中只选择了位31:1,解释了看似位移。