add vec->ctrl fences
This commit is contained in:
		| @@ -253,8 +253,8 @@ class rocketCtrl extends Component | |||||||
|     VFMVV->     List(VEC_Y,Y,BR_N,  REN_N,REN_N,A2_X,    DW_X,  FN_X,   M_N,M_X,      MT_X, N,MUL_X,  N,DIV_X, WEN_N,WA_X, WB_X,  REN_N,WEN_N,I_X, SYNC_N,N,N,N,N), |     VFMVV->     List(VEC_Y,Y,BR_N,  REN_N,REN_N,A2_X,    DW_X,  FN_X,   M_N,M_X,      MT_X, N,MUL_X,  N,DIV_X, WEN_N,WA_X, WB_X,  REN_N,WEN_N,I_X, SYNC_N,N,N,N,N), | ||||||
|     FENCE_L_V-> List(VEC_Y,Y,BR_N,  REN_N,REN_N,A2_X,    DW_X,  FN_X,   M_N,M_X,      MT_X, N,MUL_X,  N,DIV_X, WEN_N,WA_X, WB_X,  REN_N,WEN_N,I_X, SYNC_N,N,N,N,N), |     FENCE_L_V-> List(VEC_Y,Y,BR_N,  REN_N,REN_N,A2_X,    DW_X,  FN_X,   M_N,M_X,      MT_X, N,MUL_X,  N,DIV_X, WEN_N,WA_X, WB_X,  REN_N,WEN_N,I_X, SYNC_N,N,N,N,N), | ||||||
|     FENCE_G_V-> List(VEC_Y,Y,BR_N,  REN_N,REN_N,A2_X,    DW_X,  FN_X,   M_N,M_X,      MT_X, N,MUL_X,  N,DIV_X, WEN_N,WA_X, WB_X,  REN_N,WEN_N,I_X, SYNC_N,N,N,N,N), |     FENCE_G_V-> List(VEC_Y,Y,BR_N,  REN_N,REN_N,A2_X,    DW_X,  FN_X,   M_N,M_X,      MT_X, N,MUL_X,  N,DIV_X, WEN_N,WA_X, WB_X,  REN_N,WEN_N,I_X, SYNC_N,N,N,N,N), | ||||||
|     FENCE_L_CV->List(VEC_Y,Y,BR_N,  REN_N,REN_N,A2_X,    DW_X,  FN_X,   M_N,M_X,      MT_X, N,MUL_X,  N,DIV_X, WEN_N,WA_X, WB_X,  REN_N,WEN_N,I_X, SYNC_N,N,N,N,N), |     FENCE_L_CV->List(VEC_Y,Y,BR_N,  REN_N,REN_N,A2_X,    DW_X,  FN_X,   M_N,M_X,      MT_X, N,MUL_X,  N,DIV_X, WEN_N,WA_X, WB_X,  REN_N,WEN_N,I_X, SYNC_N,N,N,N,Y), | ||||||
|     FENCE_G_CV->List(VEC_Y,Y,BR_N,  REN_N,REN_N,A2_X,    DW_X,  FN_X,   M_N,M_X,      MT_X, N,MUL_X,  N,DIV_X, WEN_N,WA_X, WB_X,  REN_N,WEN_N,I_X, SYNC_N,N,N,N,N), |     FENCE_G_CV->List(VEC_Y,Y,BR_N,  REN_N,REN_N,A2_X,    DW_X,  FN_X,   M_N,M_X,      MT_X, N,MUL_X,  N,DIV_X, WEN_N,WA_X, WB_X,  REN_N,WEN_N,I_X, SYNC_N,N,N,N,Y), | ||||||
|     VLD->       List(VEC_Y,Y,BR_N,  REN_N,REN_Y,A2_ZERO, DW_XPR,FN_ADD, M_N,M_X,      MT_X, N,MUL_X,  N,DIV_X, WEN_N,WA_X, WB_ALU,REN_N,WEN_N,I_X, SYNC_N,N,N,N,N), |     VLD->       List(VEC_Y,Y,BR_N,  REN_N,REN_Y,A2_ZERO, DW_XPR,FN_ADD, M_N,M_X,      MT_X, N,MUL_X,  N,DIV_X, WEN_N,WA_X, WB_ALU,REN_N,WEN_N,I_X, SYNC_N,N,N,N,N), | ||||||
|     VLW->       List(VEC_Y,Y,BR_N,  REN_N,REN_Y,A2_ZERO, DW_XPR,FN_ADD, M_N,M_X,      MT_X, N,MUL_X,  N,DIV_X, WEN_N,WA_X, WB_ALU,REN_N,WEN_N,I_X, SYNC_N,N,N,N,N), |     VLW->       List(VEC_Y,Y,BR_N,  REN_N,REN_Y,A2_ZERO, DW_XPR,FN_ADD, M_N,M_X,      MT_X, N,MUL_X,  N,DIV_X, WEN_N,WA_X, WB_ALU,REN_N,WEN_N,I_X, SYNC_N,N,N,N,N), | ||||||
|     VLWU->      List(VEC_Y,Y,BR_N,  REN_N,REN_Y,A2_ZERO, DW_XPR,FN_ADD, M_N,M_X,      MT_X, N,MUL_X,  N,DIV_X, WEN_N,WA_X, WB_ALU,REN_N,WEN_N,I_X, SYNC_N,N,N,N,N), |     VLWU->      List(VEC_Y,Y,BR_N,  REN_N,REN_Y,A2_ZERO, DW_XPR,FN_ADD, M_N,M_X,      MT_X, N,MUL_X,  N,DIV_X, WEN_N,WA_X, WB_ALU,REN_N,WEN_N,I_X, SYNC_N,N,N,N,N), | ||||||
| @@ -573,7 +573,7 @@ class rocketCtrl extends Component | |||||||
|   }  |   }  | ||||||
|  |  | ||||||
|   var vec_replay = Bool(false) |   var vec_replay = Bool(false) | ||||||
|  |   var vec_cpfence = Bool(false) | ||||||
|   if (HAVE_VEC) |   if (HAVE_VEC) | ||||||
|   { |   { | ||||||
|     // vector control |     // vector control | ||||||
| @@ -588,12 +588,16 @@ class rocketCtrl extends Component | |||||||
|     vec.io.iface.vximm1q_ready := io.vec_iface.vximm1q_ready |     vec.io.iface.vximm1q_ready := io.vec_iface.vximm1q_ready | ||||||
|     vec.io.iface.vximm2q_ready := io.vec_iface.vximm2q_ready |     vec.io.iface.vximm2q_ready := io.vec_iface.vximm2q_ready | ||||||
|  |  | ||||||
|     // FIXME |  | ||||||
|     // use io.vec_iface.vackq_valid |  | ||||||
|     io.vec_iface.vackq_ready := Bool(true) |  | ||||||
|  |  | ||||||
|     vec_replay = vec.io.replay |     vec_replay = vec.io.replay | ||||||
|  |     vec_cpfence = Reg(resetVal = Bool(false)) | ||||||
|  |     when (vec.io.cpfence) { | ||||||
|  |       vec_cpfence := Bool(true) | ||||||
|  |     } | ||||||
|  |     when (io.vec_iface.vackq_valid || wb_reg_exception) { | ||||||
|  |       vec_cpfence := Bool(false) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     io.vec_iface.vackq_ready := Bool(true) | ||||||
|     vec.io.sr_ev := io.dpath.status(SR_EV) |     vec.io.sr_ev := io.dpath.status(SR_EV) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -749,6 +753,7 @@ class rocketCtrl extends Component | |||||||
|       id_mem_val.toBool && !(io.dmem.req_rdy && io.dtlb_rdy) || |       id_mem_val.toBool && !(io.dmem.req_rdy && io.dtlb_rdy) || | ||||||
|       id_vec_val.toBool && !(io.vec_iface.vcmdq_ready && io.vec_iface.vximm1q_ready && io.vec_iface.vximm2q_ready) || // being conservative |       id_vec_val.toBool && !(io.vec_iface.vcmdq_ready && io.vec_iface.vximm1q_ready && io.vec_iface.vximm2q_ready) || // being conservative | ||||||
|       ((id_sync === SYNC_D) || (id_sync === SYNC_I)) && !io.dmem.req_rdy || |       ((id_sync === SYNC_D) || (id_sync === SYNC_I)) && !io.dmem.req_rdy || | ||||||
|  |       vec_cpfence || | ||||||
|       id_console_out_val && !io.console.rdy |       id_console_out_val && !io.console.rdy | ||||||
|     ); |     ); | ||||||
|   val ctrl_stallf = ctrl_stalld; |   val ctrl_stallf = ctrl_stalld; | ||||||
|   | |||||||
| @@ -34,6 +34,7 @@ class ioCtrlVec extends Bundle | |||||||
|   val iface = new ioCtrlVecInterface() |   val iface = new ioCtrlVecInterface() | ||||||
|   val sr_ev = Bool(INPUT) |   val sr_ev = Bool(INPUT) | ||||||
|   val replay = Bool(OUTPUT) |   val replay = Bool(OUTPUT) | ||||||
|  |   val cpfence = Bool(OUTPUT) | ||||||
| } | } | ||||||
|  |  | ||||||
| class rocketCtrlVec extends Component | class rocketCtrlVec extends Component | ||||||
| @@ -46,52 +47,53 @@ class rocketCtrlVec extends Component | |||||||
|                 //                                 | vcmdq |                 //                                 | vcmdq | ||||||
|                 //                       wen       | | vximm1q |                 //                       wen       | | vximm1q | ||||||
|                 // val vcmd    vimm      | fn      | | | vximm2q |                 // val vcmd    vimm      | fn      | | | vximm2q | ||||||
|                 //   | |       |         | |       | | | | |                 //   | |       |         | |       | | | | cpfence | ||||||
|                 List(N,VCMD_X, VIMM_X,   N,VEC_X  ,N,N,N,N),Array( |                 //   | |       |         | |       | | | | | | ||||||
|     VVCFGIVL->  List(Y,VCMD_I, VIMM_VLEN,Y,VEC_CFG,N,Y,Y,N), |                 List(N,VCMD_X, VIMM_X,   N,VEC_X  ,N,N,N,N,N),Array( | ||||||
|     VSETVL->    List(Y,VCMD_I, VIMM_VLEN,Y,VEC_VL ,N,Y,Y,N), |     VVCFGIVL->  List(Y,VCMD_I, VIMM_VLEN,Y,VEC_CFG,N,Y,Y,N,N), | ||||||
|     VF->        List(Y,VCMD_I, VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     VSETVL->    List(Y,VCMD_I, VIMM_VLEN,Y,VEC_VL ,N,Y,Y,N,N), | ||||||
|     VMVV->      List(Y,VCMD_TX,VIMM_X,   N,VEC_X  ,Y,Y,N,N), |     VF->        List(Y,VCMD_I, VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     VMSV->      List(Y,VCMD_TX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     VMVV->      List(Y,VCMD_TX,VIMM_X,   N,VEC_X  ,Y,Y,N,N,N), | ||||||
|     VFMVV->     List(Y,VCMD_TF,VIMM_X,   N,VEC_X  ,Y,Y,N,N), |     VMSV->      List(Y,VCMD_TX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     FENCE_L_V-> List(Y,VCMD_F, VIMM_X,   N,VEC_X  ,N,Y,N,N), |     VFMVV->     List(Y,VCMD_TF,VIMM_X,   N,VEC_X  ,Y,Y,N,N,N), | ||||||
|     FENCE_G_V-> List(Y,VCMD_F, VIMM_X,   N,VEC_X  ,N,Y,N,N), |     FENCE_L_V-> List(Y,VCMD_F, VIMM_X,   N,VEC_X  ,N,Y,N,N,N), | ||||||
|     FENCE_L_CV->List(Y,VCMD_F, VIMM_X,   N,VEC_X  ,N,Y,N,N), |     FENCE_G_V-> List(Y,VCMD_F, VIMM_X,   N,VEC_X  ,N,Y,N,N,N), | ||||||
|     FENCE_G_CV->List(Y,VCMD_F, VIMM_X,   N,VEC_X  ,N,Y,N,N), |     FENCE_L_CV->List(Y,VCMD_F, VIMM_X,   N,VEC_X  ,N,Y,N,N,Y), | ||||||
|     VLD->       List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     FENCE_G_CV->List(Y,VCMD_F, VIMM_X,   N,VEC_X  ,N,Y,N,N,Y), | ||||||
|     VLW->       List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     VLD->       List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     VLWU->      List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     VLW->       List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     VLH->       List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     VLWU->      List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     VLHU->      List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     VLH->       List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     VLB->       List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     VLHU->      List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     VLBU->      List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     VLB->       List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     VSD->       List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     VLBU->      List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     VSW->       List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     VSD->       List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     VSH->       List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     VSW->       List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     VSB->       List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     VSH->       List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     VFLD->      List(Y,VCMD_MF,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     VSB->       List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     VFLW->      List(Y,VCMD_MF,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     VFLD->      List(Y,VCMD_MF,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     VFSD->      List(Y,VCMD_MF,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     VFLW->      List(Y,VCMD_MF,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     VFSW->      List(Y,VCMD_MF,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N), |     VFSD->      List(Y,VCMD_MF,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     VLSTD->     List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y), |     VFSW->      List(Y,VCMD_MF,VIMM_ALU, N,VEC_X  ,Y,Y,Y,N,N), | ||||||
|     VLSTW->     List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y), |     VLSTD->     List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y,N), | ||||||
|     VLSTWU->    List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y), |     VLSTW->     List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y,N), | ||||||
|     VLSTH->     List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y), |     VLSTWU->    List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y,N), | ||||||
|     VLSTHU->    List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y), |     VLSTH->     List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y,N), | ||||||
|     VLSTB->     List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y), |     VLSTHU->    List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y,N), | ||||||
|     VLSTBU->    List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y), |     VLSTB->     List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y,N), | ||||||
|     VSSTD->     List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y), |     VLSTBU->    List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y,N), | ||||||
|     VSSTW->     List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y), |     VSSTD->     List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y,N), | ||||||
|     VSSTH->     List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y), |     VSSTW->     List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y,N), | ||||||
|     VSSTB->     List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y), |     VSSTH->     List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y,N), | ||||||
|     VFLSTD->    List(Y,VCMD_MF,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y), |     VSSTB->     List(Y,VCMD_MX,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y,N), | ||||||
|     VFLSTW->    List(Y,VCMD_MF,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y), |     VFLSTD->    List(Y,VCMD_MF,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y,N), | ||||||
|     VFSSTD->    List(Y,VCMD_MF,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y), |     VFLSTW->    List(Y,VCMD_MF,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y,N), | ||||||
|     VFSSTW->    List(Y,VCMD_MF,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y) |     VFSSTD->    List(Y,VCMD_MF,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y,N), | ||||||
|  |     VFSSTW->    List(Y,VCMD_MF,VIMM_ALU, N,VEC_X  ,Y,Y,Y,Y,N) | ||||||
|   )) |   )) | ||||||
|  |  | ||||||
|   val wb_vec_val :: wb_sel_vcmd :: wb_sel_vimm :: wb_vec_wen :: wb_vec_fn :: wb_vec_appvlmask :: veccs0 = veccs |   val wb_vec_val :: wb_sel_vcmd :: wb_sel_vimm :: wb_vec_wen :: wb_vec_fn :: wb_vec_appvlmask :: veccs0 = veccs | ||||||
|   val wb_vec_cmdq_enq :: wb_vec_ximm1q_enq :: wb_vec_ximm2q_enq :: Nil = veccs0 |   val wb_vec_cmdq_enq :: wb_vec_ximm1q_enq :: wb_vec_ximm2q_enq :: wb_vec_cpfence :: Nil = veccs0 | ||||||
|  |  | ||||||
|   val valid_common = io.dpath.valid && io.sr_ev && wb_vec_val.toBool && !(wb_vec_appvlmask.toBool && io.dpath.appvl0) |   val valid_common = io.dpath.valid && io.sr_ev && wb_vec_val.toBool && !(wb_vec_appvlmask.toBool && io.dpath.appvl0) | ||||||
|  |  | ||||||
| @@ -113,4 +115,5 @@ class rocketCtrlVec extends Component | |||||||
|     wb_vec_ximm1q_enq && !io.iface.vximm1q_ready || |     wb_vec_ximm1q_enq && !io.iface.vximm1q_ready || | ||||||
|     wb_vec_ximm2q_enq && !io.iface.vximm2q_ready |     wb_vec_ximm2q_enq && !io.iface.vximm2q_ready | ||||||
|   ) |   ) | ||||||
|  |   io.cpfence := valid_common && wb_vec_cpfence && !io.replay | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user