// 总结如下:
// 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;