RISCV decode 总结

RISCV decode 总结


// 总结如下:

   // define  AMO : AMOADD_W,AMOXOR_W,AMOSWAP_W,AMOAND_W,AMOOR_W,AMOMIN_W,AMOMINU_W,AMOMAX_W,AMOMAXU_W;
   //               AMOADD_D,AMOXOR_D,AMOSWAP_D,AMOAND_D,AMOOR_D,AMOMIN_D,AMOMINU_D,AMOMAX_D,AMOMAXU_D;
   // define  LR  : LR_W,LR_D
   // define  SC  : SC_W,SC_D
   // define  L   : LW,LD,LWU,LH,LHU,LB,LBU
   // define  S   : SD,SW,SH,SB
   // define  CSR : CSRRW,CSRRS,CSRRC; CSRRWI,CSRRSI,CSRRCI; 

   // define  FL  : FLW,FLD;
   // define  FS  : FSW,FSD;

iq-type IQT_MEM :  L,S,AMO,LR,SC; FL,FS;
iq-type IQT_INT :  OTHER_ALL;
func unit FU_MEM:  L,S,AMO,LR,SC,FENCE;

br/jmp          :  BEQ,BNE,BGE,BGEU,BLT,BLTU; JAL; JALR;
is_load         :  L; FL
is_store        :  S; FS; AMOO; LR,SC; FENCE;                                                      // 任何进入STQ的东西,包括fence和AMOs

is_amo          :  AMOO,LR,SC;
is_fence        :  FENCE;
is_fence_i      :  FENCE_I;

// NOTE: 虽然 AUIPC,JAL,JALR 的 wakeup_delay = 1,但是它们却不能 bypass
bypassable      :  LUI; ADDI,ANDI,ORI,XORI,SLTI,SLTIU,SLLI,SRAI,SRLI; ADDIW,SLLIW,SRAIW,SRLIW; 
                   SLL,ADD,SUB,SLT,SLTU,AND,OR,XOR,SRA,SRL; ADDW,SUBW,SLLW,SRAW,SRLW;
 
// NOTE: RISCV 指令集只有小于(<),没有大于(>),只有大于等于(>=),没有小于等于(<=),交换两个源操作数可实现同等功能
allocate_brtag  :  BEQ,BNE,BGE,BGEU,BLT,BLTU;                                                        // 分配brtag

is_unique       :  CSR; SCALL,SBREAK,SRET,MRET,DRET,SFENCE_VM; WFI; FENCE; FENCE_I; AMO; LR,SC;      // 只允许这条指令在管道中,等待STQ耗尽,然后清空fetch(告诉ROB直到清空为止)
flush on commit :  CSR; WFI; FENCE; FENCE_I; AMO; LR,SC;                                             // 一些指令需要刷新后面的管道

frs3_en         :  FMADD_S,FMSUB_S,FNMADD_S,FNMSUB_S,FMADD_D,FMSUB_D,FNMADD_D,FNMSUB_D;              // 只有浮点的乘加会使用到第三个源操作数

wakeup_delay = 3: L

wakeup_delay = 1: LUI; ADDI,ANDI,ORI,XORI,SLTI,SLTIU,SLLI,SRAI,SRLI; ADDIW,SLLIW,SRAIW,SRLIW;
                   SLL,ADD,SUB,SLT,SLTU,AND,OR,XOR,SRA,SRL; ADDW,SUBW,SLLW,SRAW,SRLW; AUIPC; JAL,JALR;

wakeup_delay = 1: OTHER_ALL;




你可能感兴趣的:(RISC-V)