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;