Fix CSR interlocks
This commit is contained in:
		@@ -417,7 +417,7 @@ class Control(implicit conf: RocketConfiguration) extends Module
 | 
			
		||||
  // flush pipeline on CSR writes that may have side effects
 | 
			
		||||
  val id_csr_flush = {
 | 
			
		||||
    val safe_csrs = CSRs.sup0 :: CSRs.sup1 :: CSRs.epc :: Nil
 | 
			
		||||
    id_csr_en && id_csr_wen && DecodeLogic(id_csr_addr, legal_csrs -- safe_csrs, safe_csrs)
 | 
			
		||||
    id_csr_en && id_csr_wen && !DecodeLogic(id_csr_addr, safe_csrs, legal_csrs -- safe_csrs)
 | 
			
		||||
  }
 | 
			
		||||
  val id_privileged = id_sret || id_csr_privileged
 | 
			
		||||
 | 
			
		||||
@@ -645,10 +645,13 @@ class Control(implicit conf: RocketConfiguration) extends Module
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // stall for RAW/WAW hazards on PCRs, loads, AMOs, and mul/div in execute stage.
 | 
			
		||||
  val id_renx1_not0 = id_renx1 && id_raddr1 != UInt(0)
 | 
			
		||||
  val id_renx2_not0 = id_renx2 && id_raddr2 != UInt(0)
 | 
			
		||||
  val id_wen_not0 = id_wen && id_waddr != UInt(0)
 | 
			
		||||
  val data_hazard_ex = ex_reg_wen &&
 | 
			
		||||
    (id_renx1.toBool && id_raddr1 === io.dpath.ex_waddr ||
 | 
			
		||||
     id_renx2.toBool && id_raddr2 === io.dpath.ex_waddr ||
 | 
			
		||||
     id_wen.toBool   && id_waddr  === io.dpath.ex_waddr)
 | 
			
		||||
    (id_renx1_not0 && id_raddr1 === io.dpath.ex_waddr ||
 | 
			
		||||
     id_renx2_not0 && id_raddr2 === io.dpath.ex_waddr ||
 | 
			
		||||
     id_wen_not0   && id_waddr  === io.dpath.ex_waddr)
 | 
			
		||||
  val fp_data_hazard_ex = ex_reg_fp_wen &&
 | 
			
		||||
    (io.fpu.dec.ren1 && id_raddr1 === io.dpath.ex_waddr ||
 | 
			
		||||
     io.fpu.dec.ren2 && id_raddr2 === io.dpath.ex_waddr ||
 | 
			
		||||
@@ -662,9 +665,9 @@ class Control(implicit conf: RocketConfiguration) extends Module
 | 
			
		||||
    if (conf.fastLoadWord) Bool(!conf.fastLoadByte) && mem_reg_slow_bypass
 | 
			
		||||
    else Bool(true)
 | 
			
		||||
  val data_hazard_mem = mem_reg_wen &&
 | 
			
		||||
    (id_raddr1 != UInt(0) && id_renx1 && id_raddr1 === io.dpath.mem_waddr ||
 | 
			
		||||
     id_raddr2 != UInt(0) && id_renx2 && id_raddr2 === io.dpath.mem_waddr ||
 | 
			
		||||
     id_waddr  != UInt(0) && id_wen   && id_waddr  === io.dpath.mem_waddr)
 | 
			
		||||
    (id_renx1_not0 && id_raddr1 === io.dpath.mem_waddr ||
 | 
			
		||||
     id_renx2_not0 && id_raddr2 === io.dpath.mem_waddr ||
 | 
			
		||||
     id_wen_not0   && id_waddr  === io.dpath.mem_waddr)
 | 
			
		||||
  val fp_data_hazard_mem = mem_reg_fp_wen &&
 | 
			
		||||
    (io.fpu.dec.ren1 && id_raddr1 === io.dpath.mem_waddr ||
 | 
			
		||||
     io.fpu.dec.ren2 && id_raddr2 === io.dpath.mem_waddr ||
 | 
			
		||||
@@ -683,9 +686,9 @@ class Control(implicit conf: RocketConfiguration) extends Module
 | 
			
		||||
  val id_wb_hazard = fp_data_hazard_wb && (wb_dcache_miss || wb_reg_fp_val)
 | 
			
		||||
 | 
			
		||||
  val id_sboard_hazard =
 | 
			
		||||
    (id_raddr1 != UInt(0) && id_renx1 && sboard.readBypassed(id_raddr1) ||
 | 
			
		||||
     id_raddr2 != UInt(0) && id_renx2 && sboard.readBypassed(id_raddr2) ||
 | 
			
		||||
     id_waddr  != UInt(0) && id_wen   && sboard.readBypassed(id_waddr))
 | 
			
		||||
    (id_renx1_not0 && sboard.readBypassed(id_raddr1) ||
 | 
			
		||||
     id_renx2_not0 && sboard.readBypassed(id_raddr2) ||
 | 
			
		||||
     id_wen_not0   && sboard.readBypassed(id_waddr))
 | 
			
		||||
 | 
			
		||||
  val ctrl_stalld =
 | 
			
		||||
    id_ex_hazard || id_mem_hazard || id_wb_hazard || id_sboard_hazard ||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user