add vector irq handler
This commit is contained in:
		| @@ -143,6 +143,7 @@ object Constants | ||||
|   val PCR_FROMHOST = UFix(17, 5); | ||||
|   val PCR_VECBANK  = UFix(18, 5); | ||||
|   val PCR_VECCFG   = UFix(19, 5); | ||||
|   val PCR_VECIRQAUX= UFix(20, 5) | ||||
|  | ||||
|   // definition of bits in PCR status reg | ||||
|   val SR_ET   = 0;  // enable traps | ||||
|   | ||||
| @@ -201,6 +201,11 @@ class rocketProc(resetSignal: Bool = null) extends Component(resetSignal) | ||||
|     // fences | ||||
|     ctrl.io.vec_iface.vfence_ready := vu.io.vec_fence_ready | ||||
|  | ||||
|     // irqs | ||||
|     ctrl.io.vec_iface.irq := vu.io.irq | ||||
|     ctrl.io.vec_iface.irq_cause := vu.io.irq_cause | ||||
|     dpath.io.vec_iface.irq_aux := vu.io.irq_aux | ||||
|  | ||||
|     // exceptions | ||||
|     vu.io.xcpt.exception := ctrl.io.vec_iface.exception | ||||
|     ctrl.io.vec_iface.exception_ack_valid := vu.io.xcpt.exception_ack_valid | ||||
|   | ||||
| @@ -50,6 +50,7 @@ class ioCtrlDpath extends Bundle() | ||||
|   val exception = Bool(OUTPUT); | ||||
|   val cause    = UFix(5,OUTPUT); | ||||
|   val badvaddr_wen = Bool(OUTPUT); // high for a load/store access fault | ||||
|   val vec_irq_aux_wen = Bool(OUTPUT) | ||||
|   // inputs from datapath | ||||
|   val xcpt_ma_inst = Bool(INPUT);  // high on a misaligned/illegal virtual PC | ||||
|   val btb_hit = Bool(INPUT); | ||||
| @@ -622,6 +623,8 @@ class rocketCtrl extends Component | ||||
|  | ||||
|   var vec_replay = Bool(false) | ||||
|   var vec_stalld = Bool(false) | ||||
|   var vec_irq = Bool(false) | ||||
|   var vec_irq_cause = UFix(0,5) | ||||
|   if (HAVE_VEC) | ||||
|   { | ||||
|     // vector control | ||||
| @@ -637,21 +640,26 @@ class rocketCtrl extends Component | ||||
|  | ||||
|     vec_replay = vec.io.replay | ||||
|     vec_stalld = vec.io.stalld // || id_vfence_cv && !vec.io.vfence_ready | ||||
|     vec_irq = vec.io.irq | ||||
|     vec_irq_cause = vec.io.irq_cause | ||||
|   } | ||||
|  | ||||
|   // exception handling | ||||
|   // FIXME: verify PC in MEM stage points to valid, restartable instruction | ||||
|   val p_irq_timer = (io.dpath.status(15).toBool && io.dpath.irq_timer); | ||||
|   val p_irq_ipi   = (io.dpath.status(13).toBool && io.dpath.irq_ipi); | ||||
|   val p_irq_vec   = (io.dpath.status(8) && vec_irq) | ||||
|   val interrupt =  | ||||
|     io.dpath.status(SR_ET).toBool && mem_reg_valid &&  | ||||
|     ((io.dpath.status(15).toBool && io.dpath.irq_timer) || | ||||
|      (io.dpath.status(13).toBool && io.dpath.irq_ipi)); | ||||
|      (io.dpath.status(13).toBool && io.dpath.irq_ipi) || | ||||
|      p_irq_vec); | ||||
|       | ||||
|   val interrupt_cause =  | ||||
|     Mux(p_irq_ipi, UFix(21,5), | ||||
|     Mux(p_irq_timer, UFix(23,5), | ||||
|       UFix(0,5))); | ||||
|     Mux(p_irq_vec, vec_irq_cause, | ||||
|         UFix(0,5)))) | ||||
|  | ||||
|   val mem_xcpt_ma_ld = io.dmem.xcpt_ma_ld && !mem_reg_kill | ||||
|   val mem_xcpt_ma_st = io.dmem.xcpt_ma_st && !mem_reg_kill | ||||
| @@ -723,6 +731,7 @@ class rocketCtrl extends Component | ||||
| 	io.dpath.exception    := wb_reg_exception; | ||||
| 	io.dpath.cause        := wb_reg_cause; | ||||
| 	io.dpath.badvaddr_wen := wb_badvaddr_wen; | ||||
|   io.dpath.vec_irq_aux_wen := wb_reg_exception && wb_reg_cause >= UFix(24) | ||||
|  | ||||
|   io.dpath.sel_pc := | ||||
|     Mux(wb_reg_exception,               PC_EVEC, // exception | ||||
|   | ||||
| @@ -43,6 +43,9 @@ class ioCtrlVecInterface extends Bundle | ||||
|   val vximm2q_user_ready = Bool(INPUT) | ||||
|   val vfence_ready = Bool(INPUT) | ||||
|  | ||||
|   val irq = Bool(INPUT) | ||||
|   val irq_cause = UFix(5, INPUT) | ||||
|  | ||||
|   val exception = Bool(OUTPUT) | ||||
|   val exception_ack_valid = Bool(INPUT) | ||||
|   val exception_ack_ready = Bool(OUTPUT) | ||||
| @@ -63,6 +66,8 @@ class ioCtrlVec extends Bundle | ||||
|   val replay = Bool(OUTPUT) | ||||
|   val stalld = Bool(OUTPUT) | ||||
|   val vfence_ready = Bool(OUTPUT) | ||||
|   val irq = Bool(OUTPUT) | ||||
|   val irq_cause = UFix(5, OUTPUT) | ||||
| } | ||||
|  | ||||
| class rocketCtrlVec extends Component | ||||
| @@ -235,4 +240,6 @@ class rocketCtrlVec extends Component | ||||
|  | ||||
|   io.stalld := reg_xcptwait | ||||
|   io.vfence_ready := !io.sr_ev || io.iface.vfence_ready | ||||
|   io.irq := io.iface.irq | ||||
|   io.irq_cause := io.iface.irq_cause | ||||
| } | ||||
|   | ||||
| @@ -384,6 +384,7 @@ class rocketDpath extends Component | ||||
|     vec.io.wdata := wb_reg_vec_wdata | ||||
|     vec.io.rs2 := wb_reg_rs2 | ||||
|  | ||||
|     pcr.io.vec_irq_aux := vec.io.irq_aux | ||||
|     pcr.io.vec_appvl := vec.io.appvl | ||||
|     pcr.io.vec_nxregs := vec.io.nxregs | ||||
|     pcr.io.vec_nfregs := vec.io.nfregs | ||||
| @@ -395,6 +396,7 @@ class rocketDpath extends Component | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     pcr.io.vec_irq_aux := UFix(0) | ||||
|     pcr.io.vec_appvl := UFix(0) | ||||
|     pcr.io.vec_nxregs := UFix(0) | ||||
|     pcr.io.vec_nfregs := UFix(0) | ||||
| @@ -429,4 +431,5 @@ class rocketDpath extends Component | ||||
|   pcr.io.cause 			  := io.ctrl.cause; | ||||
|   pcr.io.pc					  := wb_reg_pc; | ||||
|   pcr.io.badvaddr_wen := io.ctrl.badvaddr_wen; | ||||
|   pcr.io.vec_irq_aux_wen := io.ctrl.vec_irq_aux_wen | ||||
| } | ||||
|   | ||||
| @@ -70,6 +70,8 @@ class ioDpathPCR extends Bundle() | ||||
|   val exception = Bool(INPUT); | ||||
|   val cause     = UFix(5, INPUT); | ||||
|   val badvaddr_wen = Bool(INPUT); | ||||
|   val vec_irq_aux = Bits(64, INPUT) | ||||
|   val vec_irq_aux_wen = Bool(INPUT) | ||||
|   val pc        = UFix(VADDR_BITS+1, INPUT); | ||||
|   val eret      = Bool(INPUT); | ||||
|   val ei        = Bool(INPUT); | ||||
| @@ -100,6 +102,7 @@ class rocketDpathPCR extends Component | ||||
|   val reg_k1       = Reg() { Bits() }; | ||||
|   val reg_ptbr     = Reg() { UFix() }; | ||||
|   val reg_vecbank  = Reg(resetVal = Bits("b1111_1111", 8)) | ||||
|   val reg_vec_irq_aux = Reg() { Bits() } | ||||
|    | ||||
|   val reg_error_mode  = Reg(resetVal = Bool(false)); | ||||
|   val reg_status_vm   = Reg(resetVal = Bool(false)); | ||||
| @@ -145,6 +148,9 @@ class rocketDpathPCR extends Component | ||||
|   when (io.badvaddr_wen) { | ||||
|     reg_badvaddr     := Cat(badvaddr_sign, io.w.data(VADDR_BITS-1,0)).toUFix; | ||||
|   } | ||||
|   when (io.vec_irq_aux_wen) { | ||||
|     reg_vec_irq_aux := io.vec_irq_aux | ||||
|   } | ||||
|  | ||||
|   when (io.exception) { | ||||
|     when (!reg_status_et) { | ||||
| @@ -207,6 +213,7 @@ class rocketDpathPCR extends Component | ||||
|     when (waddr === PCR_K1)       { reg_k1          := wdata; } | ||||
|     when (waddr === PCR_PTBR)     { reg_ptbr        := Cat(wdata(PADDR_BITS-1, PGIDX_BITS), Bits(0, PGIDX_BITS)).toUFix; } | ||||
|     when (waddr === PCR_VECBANK)  { reg_vecbank     := wdata(7,0) } | ||||
|     when (waddr === PCR_VECIRQAUX) { reg_vec_irq_aux := wdata } | ||||
|   } | ||||
|  | ||||
|   rdata := Bits(0, 64) | ||||
| @@ -227,6 +234,7 @@ class rocketDpathPCR extends Component | ||||
|       is (PCR_PTBR)     { rdata := Cat(Bits(0,64-PADDR_BITS), reg_ptbr); } | ||||
|       is (PCR_VECBANK)  { rdata := Cat(Bits(0, 56), reg_vecbank) } | ||||
|       is (PCR_VECCFG)   { rdata := Cat(Bits(0, 40), io.vec_nfregs, io.vec_nxregs, io.vec_appvl) } | ||||
|       is (PCR_VECIRQAUX){ rdata := reg_vec_irq_aux } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -13,6 +13,7 @@ class ioDpathVecInterface extends Bundle | ||||
|   val vximm2q_bits = Bits(SZ_VSTRIDE, OUTPUT) | ||||
|   val vcntq_bits = Bits(SZ_VLEN, OUTPUT) | ||||
|   val evac_addr = Bits(64, OUTPUT) | ||||
|   val irq_aux = Bits(64, INPUT) | ||||
| } | ||||
|  | ||||
| class ioDpathVec extends Bundle | ||||
| @@ -28,6 +29,7 @@ class ioDpathVec extends Bundle | ||||
|   val wdata = Bits(64, INPUT) | ||||
|   val rs2 = Bits(64, INPUT) | ||||
|   val wen = Bool(OUTPUT) | ||||
|   val irq_aux = Bits(64, OUTPUT) | ||||
|   val appvl = UFix(12, OUTPUT) | ||||
|   val nxregs = UFix(6, OUTPUT) | ||||
|   val nfregs = UFix(6, OUTPUT) | ||||
| @@ -131,6 +133,7 @@ class rocketDpathVec extends Component | ||||
|   } | ||||
|  | ||||
|   io.wen := io.valid && io.ctrl.wen | ||||
|   io.irq_aux := io.iface.irq_aux | ||||
|   io.appvl := Mux(io.ctrl.fn === VEC_VL || io.ctrl.fn === VEC_CFGVL, appvl, reg_appvl) | ||||
|   io.nxregs := reg_nxregs | ||||
|   io.nfregs := reg_nfregs | ||||
|   | ||||
		Reference in New Issue
	
	Block a user