u@home:~$

LSU OP decode 搞错地方了

应该放在_d。现在是放在_e了。

LSU BRU要是想stall IFU,最好在_d就判断好指令,这样stall IFU的时候就不需要再处理_d流水线寄存器里的指令了,要不_d也得stall。

ALU也是把alu_op送进去的,里面也有解码的部分。

感觉应该把lsu_op在_d送进去,decode的verilog代码也是在lsu里,把结果送到_e的流水线寄存器里。

不过看到在OpenSPARC里也是部分解码出op,具体详细的还是在各个功能模块里。

ifu/rtl/sparc_ifu_dec.v

//----------------------------------------------------------------------
// Code Begins Here
//----------------------------------------------------------------------
   assign       clk = rclk;


   assign   op  = dtu_inst_d[31:30];
   assign   op2 = dtu_inst_d[24:22];
   assign   op3 = dtu_inst_d[24:19];
   assign   opf = dtu_inst_d[13:5];

   // decode op
   assign   brsethi_inst = ~op[1] & ~op[0];
   assign   call_inst    = ~op[1] &  op[0];
   assign   arith_inst   =  op[1] & ~op[0];
   assign   mem_inst     =  op[1] &  op[0];

   // partial decode op2
   assign   sethi_or_nop = op2[2] & ~op2[1] & ~op2[0];

   // decode op3
   assign   op3_hi[0] = ~op3[5] & ~op3[4];
   assign   op3_hi[1] = ~op3[5] &  op3[4];
   assign   op3_hi[2] =  op3[5] & ~op3[4];
   assign   op3_hi[3] =  op3[5] &  op3[4];

   assign   op3_lo[0]  = ~op3[3] & ~op3[2] & ~op3[1] & ~op3[0];
   assign   op3_lo[1]  = ~op3[3] & ~op3[2] & ~op3[1] &  op3[0];
   assign   op3_lo[2]  = ~op3[3] & ~op3[2] &  op3[1] & ~op3[0];



...



   //-------------
   // ALU Controls
   //-------------
   // mov bit
   assign ifu_exu_aluop_d[2] = brsethi_inst & sethi_or_nop |   // sethi
                            arith_inst & op3_hi[2] & op3[3];   // mov, rd

   // aluop
   assign ifu_exu_aluop_d[1] = (arith_inst &
                                      ((op3_hi[3] & (op3_lo[0] |   // wr
                                               op3_lo[2] |   // wrpr
                                               op3_lo[3])) | // wrhpr
                                                         (~op3[5] & op3[1]))         // xor, or
                                );

   // aluop/mov type
   assign ifu_exu_aluop_d[0] = (arith_inst &
                                      ((op3_hi[3] & (op3_lo[0] |
                                               op3_lo[2] |
                                               op3_lo[3])) | // wr
                                                         (~op3[5] & op3[0])        | // xor, and
                                                         (op3_hi[2] & op3_lo[15]))   // movr
                                );

   // invert rs2
   assign ifu_exu_invert_d  = arith_inst &
                              (~op3[5] & op3[2]  |   // sub, andn, orn, xorn
                               op3_hi[2] & (op3_lo[3] | op3_lo[1])); // tag sub

   assign ifu_exu_usecin_d   = arith_inst & ~op3[5] & op3[3];   // addc, subc

现在LSU就先不改了,先用lsu_dispatch_d,这个就是表明指令是lsu related的。