add LR/SC support
This commit is contained in:
		| @@ -127,6 +127,11 @@ object XDecode extends DecodeConstants | ||||
|     AMOMINU_D-> List(xpr64,N,N,BR_N,  N,Y,Y,A2_ZERO, DW_XPR,FN_ADD,   Y,M_XA_MINU,MT_D, N,N,Y,WA_RD,WB_ALU,PCR.N,N,N,N,N,N), | ||||
|     AMOMAX_D->  List(xpr64,N,N,BR_N,  N,Y,Y,A2_ZERO, DW_XPR,FN_ADD,   Y,M_XA_MAX, MT_D, N,N,Y,WA_RD,WB_ALU,PCR.N,N,N,N,N,N), | ||||
|     AMOMAXU_D-> List(xpr64,N,N,BR_N,  N,Y,Y,A2_ZERO, DW_XPR,FN_ADD,   Y,M_XA_MAXU,MT_D, N,N,Y,WA_RD,WB_ALU,PCR.N,N,N,N,N,N), | ||||
|  | ||||
|     LR_W->      List(Y,    N,N,BR_N,  N,Y,Y,A2_ZERO, DW_XPR,FN_ADD,   Y,M_XLR,    MT_W, N,N,Y,WA_RD,WB_ALU,PCR.N,N,N,N,N,N), | ||||
|     LR_D->      List(xpr64,N,N,BR_N,  N,Y,Y,A2_ZERO, DW_XPR,FN_ADD,   Y,M_XLR,    MT_D, N,N,Y,WA_RD,WB_ALU,PCR.N,N,N,N,N,N), | ||||
|     SC_W->      List(Y,    N,N,BR_N,  N,Y,Y,A2_ZERO, DW_XPR,FN_ADD,   Y,M_XSC,    MT_W, N,N,Y,WA_RD,WB_ALU,PCR.N,N,N,N,N,N), | ||||
|     SC_D->      List(xpr64,N,N,BR_N,  N,Y,Y,A2_ZERO, DW_XPR,FN_ADD,   Y,M_XSC,    MT_D, N,N,Y,WA_RD,WB_ALU,PCR.N,N,N,N,N,N), | ||||
|                                          | ||||
|     LUI->       List(Y,    N,N,BR_N,  N,N,N,A2_LTYPE,DW_XPR,FN_OP2,   N,M_X,      MT_X, N,N,Y,WA_RD,WB_ALU,PCR.N,N,N,N,N,N), | ||||
|     ADDI->      List(Y,    N,N,BR_N,  N,N,Y,A2_ITYPE,DW_XPR,FN_ADD,   N,M_X,      MT_X, N,N,Y,WA_RD,WB_ALU,PCR.N,N,N,N,N,N), | ||||
| @@ -383,7 +388,7 @@ class Control(implicit conf: RocketConfiguration) extends Component | ||||
|   val mem_reg_replay_next     = Reg(resetVal = Bool(false)) | ||||
|   val mem_reg_pcr             = Reg(resetVal = PCR.N) | ||||
|   val mem_reg_cause           = Reg(){UFix()} | ||||
|   val mem_reg_mem_type        = Reg(){Bits()} | ||||
|   val mem_reg_slow_bypass     = Reg(){Bool()} | ||||
|  | ||||
|   val wb_reg_valid           = Reg(resetVal = Bool(false)) | ||||
|   val wb_reg_pcr             = Reg(resetVal = PCR.N) | ||||
| @@ -516,8 +521,9 @@ class Control(implicit conf: RocketConfiguration) extends Component | ||||
|                      ex_reg_div_mul_val && !io.dpath.div_mul_rdy || | ||||
|                      mem_reg_replay_next | ||||
|   ctrl_killx := take_pc_wb || replay_ex | ||||
|  | ||||
|   val take_pc_ex = !Mux(ex_reg_jalr, ex_reg_btb_hit && io.dpath.jalr_eq, ex_reg_btb_hit === io.dpath.ex_br_taken) | ||||
|   // detect 2-cycle load-use delay for LB/LH/SC | ||||
|   val ex_slow_bypass = ex_reg_mem_cmd === M_XSC || AVec(MT_B, MT_BU, MT_H, MT_HU).contains(ex_reg_mem_type) | ||||
|  | ||||
|   val (ex_xcpt, ex_cause) = checkExceptions(List( | ||||
|     (ex_reg_xcpt_interrupt || ex_reg_xcpt, ex_reg_cause), | ||||
| @@ -552,7 +558,7 @@ class Control(implicit conf: RocketConfiguration) extends Component | ||||
|     mem_reg_fp_val := ex_reg_fp_val | ||||
|     mem_reg_vec_val := ex_reg_vec_val | ||||
|     mem_reg_replay_next := ex_reg_replay_next | ||||
|     mem_reg_mem_type := ex_reg_mem_type | ||||
|     mem_reg_slow_bypass := ex_slow_bypass | ||||
|     mem_reg_xcpt := ex_xcpt | ||||
|   } | ||||
|  | ||||
| @@ -667,9 +673,8 @@ class Control(implicit conf: RocketConfiguration) extends Component | ||||
|      | ||||
|   // stall for RAW/WAW hazards on PCRs, LB/LH, and mul/div in memory stage. | ||||
|   val mem_mem_cmd_bh = | ||||
|     if (!conf.fastLoadWord) Bool(true) | ||||
|     else if (conf.fastLoadByte) Bool(false) | ||||
|     else AVec(MT_B, MT_BU, MT_H, MT_HU) contains mem_reg_mem_type | ||||
|     if (conf.fastLoadWord) Bool(!conf.fastLoadByte) && mem_reg_slow_bypass | ||||
|     else Bool(true) | ||||
|   val data_hazard_mem = mem_reg_wen && | ||||
|     (id_raddr1 != UFix(0) && id_renx1 && id_raddr1 === io.dpath.mem_waddr || | ||||
|      id_raddr2 != UFix(0) && id_renx2 && id_raddr2 === io.dpath.mem_waddr || | ||||
|   | ||||
		Reference in New Issue
	
	Block a user