1package xiangshan.backend.fu.NewCSR 2 3import chisel3._ 4import chisel3.util._ 5import difftest._ 6import freechips.rocketchip.rocket.CSRs 7import org.chipsalliance.cde.config.Parameters 8import top.{ArgParser, Generator} 9import utility.{DataHoldBypass, DelayN, GatedValidRegNext, RegNextWithEnable, SignExt, ZeroExt, HPerfMonitor, PerfEvent} 10import utils.OptionWrapper 11import xiangshan.backend.fu.NewCSR.CSRBundles.{CSRCustomState, PrivState, RobCommitCSR} 12import xiangshan.backend.fu.NewCSR.CSRDefines._ 13import xiangshan.backend.fu.NewCSR.CSREnumTypeImplicitCast._ 14import xiangshan.backend.fu.NewCSR.CSREvents.{CSREvents, DretEventSinkBundle, EventUpdatePrivStateOutput, MNretEventSinkBundle, MretEventSinkBundle, SretEventSinkBundle, TargetPCBundle, TrapEntryDEventSinkBundle, TrapEntryEventInput, TrapEntryHSEventSinkBundle, TrapEntryMEventSinkBundle, TrapEntryMNEventSinkBundle, TrapEntryVSEventSinkBundle} 15import xiangshan.backend.fu.fpu.Bundles.Frm 16import xiangshan.backend.fu.util.CSRConst 17import xiangshan.backend.fu.vector.Bundles.{Vl, Vstart, Vxrm, Vxsat} 18import xiangshan.backend.fu.wrapper.CSRToDecode 19import xiangshan.backend.rob.RobPtr 20import xiangshan._ 21import xiangshan.backend.fu.PerfCounterIO 22import xiangshan.ExceptionNO._ 23 24import scala.collection.immutable.SeqMap 25 26object CSRConfig { 27 final val GEILEN = 63 28 29 final val ASIDLEN = 16 // the length of ASID of XS implementation 30 31 final val ASIDMAX = 16 // the max value of ASIDLEN defined by spec 32 33 final val HIIDWidth = 12 // support Hvictl[27:16](IID) 34 35 final val VMIDLEN = 14 // the length of VMID of XS implementation 36 37 final val VMIDMAX = 14 // the max value of VMIDLEN defined by spec 38 39 // the width of VGEIN 40 final val VGEINWidth = 6 41 42 final val VaddrMaxWidth = 48 + 2 // support Sv39/Sv48/Sv39x4/Sv48x4 43 44 final val InstWidth = 32 45 46 final val XLEN = 64 // Todo: use XSParams 47 48 final val VLEN = 128 49 50 // Since we need macro to compute the width of CSR field, the input of macro should be the value that can be computed 51 // at compile time. The log2Up function cannot be used as meta-programming function, so we use litral value here 52 // log2Up(128 + 1), hold 0~128 53 final val VlWidth = 8 54 55 final val PAddrWidth = 48 56 57 final val AddrWidthInPage = 12 58 59 final val PMPAddrWidth = 48 60 61 final val PMPOffBits = 2 62 63 final val PMPAddrBits = PMPAddrWidth - PMPOffBits 64 65 // perf 66 final val perfCntNum = 29 // in Spec 67 68 final val EXT_SSTC = true 69 70 final val PPNLength = 44 71} 72 73class NewCSRInput(implicit p: Parameters) extends Bundle { 74 val wen = Bool() 75 val ren = Bool() 76 val op = UInt(2.W) 77 val addr = UInt(12.W) 78 val src = UInt(64.W) 79 val wdata = UInt(64.W) 80 val mnret = Input(Bool()) 81 val mret = Input(Bool()) 82 val sret = Input(Bool()) 83 val dret = Input(Bool()) 84} 85 86class NewCSROutput(implicit p: Parameters) extends Bundle { 87 val EX_II = Bool() 88 val EX_VI = Bool() 89 val flushPipe = Bool() 90 val rData = UInt(64.W) 91 val targetPcUpdate = Bool() 92 val targetPc = new TargetPCBundle 93 val regOut = UInt(64.W) 94 // perf 95 val isPerfCnt = Bool() 96} 97 98class NewCSR(implicit val p: Parameters) extends Module 99 with HasXSParameter 100 with MachineLevel 101 with SupervisorLevel 102 with HypervisorLevel 103 with VirtualSupervisorLevel 104 with Unprivileged 105 with CSRAIA 106 with HasExternalInterruptBundle 107 with HasNonMaskableIRPBundle 108 with CSREvents 109 with DebugLevel 110 with CSRCustom 111 with CSRPMP 112 with IpIeAliasConnect 113{ 114 115 import CSRConfig._ 116 117 val io = IO(new Bundle { 118 val fromTop = Input(new Bundle { 119 val hartId = UInt(hartIdLen.W) 120 val clintTime = Input(ValidIO(UInt(64.W))) 121 }) 122 val in = Flipped(DecoupledIO(new NewCSRInput)) 123 val trapInst = Input(ValidIO(UInt(InstWidth.W))) 124 val fromMem = Input(new Bundle { 125 val excpVA = UInt(XLEN.W) 126 val excpGPA = UInt(XLEN.W) 127 val excpIsForVSnonLeafPTE = Bool() 128 }) 129 val fromRob = Input(new Bundle { 130 val trap = ValidIO(new Bundle { 131 val pc = UInt(VaddrMaxWidth.W) 132 val pcGPA = UInt(VaddrMaxWidth.W) 133 val instr = UInt(InstWidth.W) 134 val trapVec = UInt(64.W) 135 val singleStep = Bool() 136 val trigger = TriggerAction() 137 val crossPageIPFFix = Bool() 138 val isInterrupt = Bool() 139 val isHls = Bool() 140 val isFetchMalAddr = Bool() 141 val isForVSnonLeafPTE = Bool() 142 }) 143 val commit = Input(new RobCommitCSR) 144 val robDeqPtr = Input(new RobPtr) 145 }) 146 147 val perf = Input(new PerfCounterIO) 148 149 /** Output should be a DecoupledIO, since now CSR writing to integer register file might be blocked (by arbiter) */ 150 val out = DecoupledIO(new NewCSROutput) 151 val status = Output(new Bundle { 152 val privState = new PrivState 153 val interrupt = Bool() 154 val wfiEvent = Bool() 155 // fp 156 val fpState = new Bundle { 157 val off = Bool() 158 val frm = Frm() 159 } 160 // vec 161 val vecState = new Bundle { 162 val vstart = Vstart() 163 val vxsat = Vxsat() 164 val vxrm = Vxrm() 165 val vcsr = UInt(XLEN.W) 166 val vl = Vl() 167 val vtype = UInt(XLEN.W) 168 val vlenb = UInt(XLEN.W) 169 val off = Bool() 170 } 171 // debug 172 val debugMode = Bool() 173 val singleStepFlag = Bool() 174 // trigger 175 val frontendTrigger = new FrontendTdataDistributeIO() 176 val memTrigger = new MemTdataDistributeIO() 177 // Instruction fetch address translation type 178 val instrAddrTransType = new AddrTransType 179 // custom 180 val custom = new CSRCustomState 181 }) 182 // tlb 183 val tlb = Output(new Bundle { 184 val satpASIDChanged = Bool() 185 val vsatpASIDChanged = Bool() 186 val hgatpVMIDChanged = Bool() 187 val satp = new SatpBundle 188 val vsatp = new SatpBundle 189 val hgatp = new HgatpBundle 190 val mxr = Bool() 191 val sum = Bool() 192 val vmxr = Bool() 193 val vsum = Bool() 194 val spvp = Bool() 195 val imode = UInt(2.W) 196 val dmode = UInt(2.W) 197 val dvirt = Bool() 198 val mPBMTE = Bool() 199 val hPBMTE = Bool() 200 }) 201 202 val toDecode = new CSRToDecode 203 204 val fetchMalTval = Input(UInt(XLEN.W)) 205 }) 206 207 val toAIA = IO(Output(new CSRToAIABundle)) 208 val fromAIA = IO(Flipped(Output(new AIAToCSRBundle))) 209 210 dontTouch(toAIA) 211 dontTouch(fromAIA) 212 dontTouch(io.fromTop.clintTime) 213 214 /* Alias of input valid/ready */ 215 val valid = io.in.valid 216 217 /* Alias of input signals */ 218 val wen = io.in.bits.wen && valid 219 val addr = io.in.bits.addr 220 val wdata = io.in.bits.wdata 221 222 val ren = io.in.bits.ren && valid 223 val raddr = io.in.bits.addr 224 225 val hasTrap = io.fromRob.trap.valid 226 val trapVec = io.fromRob.trap.bits.trapVec 227 val trapPC = io.fromRob.trap.bits.pc 228 val trapPCGPA = io.fromRob.trap.bits.pcGPA 229 val trapIsInterrupt = io.fromRob.trap.bits.isInterrupt 230 val trapIsCrossPageIPF = io.fromRob.trap.bits.crossPageIPFFix 231 val trigger = io.fromRob.trap.bits.trigger 232 val singleStep = io.fromRob.trap.bits.singleStep 233 val trapIsHls = io.fromRob.trap.bits.isHls 234 val trapIsFetchMalAddr = io.fromRob.trap.bits.isFetchMalAddr 235 val trapIsForVSnonLeafPTE = io.fromRob.trap.bits.isForVSnonLeafPTE 236 237 // debug_intrrupt 238 val debugIntrEnable = RegInit(true.B) // debug interrupt will be handle only when debugIntrEnable 239 val debugIntr = platformIRP.debugIP && debugIntrEnable 240 241 // CSR Privilege State 242 val PRVM = RegInit(PrivMode(1, 0), PrivMode.M) 243 val V = RegInit(VirtMode(0), VirtMode.Off) 244 val debugMode = RegInit(false.B) 245 246 private val privState = Wire(new PrivState) 247 privState.PRVM := PRVM 248 privState.V := V 249 250 private val isModeM = privState.isModeM 251 private val (isModeHS, isModeHU) = (privState.isModeHS, privState.isModeHU) 252 private val (isModeVS, isModeVU) = (privState.isModeVS, privState.isModeVU) 253 254 val permitMod = Module(new CSRPermitModule) 255 val sstcIRGen = Module(new SstcInterruptGen) 256 257 private val wenLegal = permitMod.io.out.hasLegalWen 258 259 val legalSret = permitMod.io.out.hasLegalSret 260 val legalMret = permitMod.io.out.hasLegalMret 261 val legalMNret = permitMod.io.out.hasLegalMNret 262 val legalDret = permitMod.io.out.hasLegalDret 263 264 var csrRwMap: SeqMap[Int, (CSRAddrWriteBundle[_], UInt)] = 265 machineLevelCSRMap ++ 266 supervisorLevelCSRMap ++ 267 hypervisorCSRMap ++ 268 virtualSupervisorCSRMap ++ 269 unprivilegedCSRMap ++ 270 debugCSRMap ++ 271 aiaCSRMap ++ 272 customCSRMap ++ 273 pmpCSRMap 274 275 val csrMods: Seq[CSRModule[_]] = 276 machineLevelCSRMods ++ 277 supervisorLevelCSRMods ++ 278 hypervisorCSRMods ++ 279 virtualSupervisorCSRMods ++ 280 unprivilegedCSRMods ++ 281 debugCSRMods ++ 282 aiaCSRMods ++ 283 customCSRMods ++ 284 pmpCSRMods 285 286 var csrOutMap: SeqMap[Int, UInt] = 287 machineLevelCSROutMap ++ 288 supervisorLevelCSROutMap ++ 289 hypervisorCSROutMap ++ 290 virtualSupervisorCSROutMap ++ 291 unprivilegedCSROutMap ++ 292 debugCSROutMap ++ 293 aiaCSROutMap ++ 294 customCSROutMap ++ 295 pmpCSROutMap 296 297 // interrupt 298 val intrMod = Module(new InterruptFilter) 299 intrMod.io.in.privState := privState 300 intrMod.io.in.mstatusMIE := mstatus.regOut.MIE.asBool 301 intrMod.io.in.sstatusSIE := mstatus.regOut.SIE.asBool 302 intrMod.io.in.vsstatusSIE := vsstatus.regOut.SIE.asBool 303 intrMod.io.in.mip := mip.rdataFields 304 intrMod.io.in.mie := mie.regOut 305 intrMod.io.in.mideleg := mideleg.regOut 306 intrMod.io.in.sip := sip.regOut 307 intrMod.io.in.sie := sie.regOut 308 intrMod.io.in.hip := hip.regOut 309 intrMod.io.in.hie := hie.regOut 310 intrMod.io.in.hideleg := hideleg.regOut 311 intrMod.io.in.vsip := vsip.regOut 312 intrMod.io.in.vsie := vsie.regOut 313 intrMod.io.in.hvictl := hvictl.regOut 314 intrMod.io.in.hstatus := hstatus.regOut 315 intrMod.io.in.mtopei := mtopei.regOut 316 intrMod.io.in.stopei := stopei.regOut 317 intrMod.io.in.vstopei := vstopei.regOut 318 intrMod.io.in.hviprio1 := hviprio1.regOut 319 intrMod.io.in.hviprio2 := hviprio2.regOut 320 intrMod.io.in.miprios := Cat(miregiprios.map(_.rdata).reverse) 321 intrMod.io.in.hsiprios := Cat(siregiprios.map(_.rdata).reverse) 322 intrMod.io.in.mnstatusNMIE := mnstatus.regOut.NMIE.asBool 323 324 val nmip = RegInit(new NonMaskableIRPendingBundle, (new NonMaskableIRPendingBundle).init) 325 when(nonMaskableIRP.NMI) { 326 nmip.NMI := true.B 327 } 328 329 intrMod.io.in.nmi := nmip.asUInt.orR 330 intrMod.io.in.nmiVec := nmip.asUInt 331 332 when(intrMod.io.out.nmi && intrMod.io.out.interruptVec.valid) { 333 nmip.NMI := false.B 334 } 335 val intrVec = RegEnable(intrMod.io.out.interruptVec.bits, 0.U, intrMod.io.out.interruptVec.valid) 336 val nmi = RegEnable(intrMod.io.out.nmi, false.B, intrMod.io.out.interruptVec.valid) 337 val virtualInterruptIsHvictlInject = RegEnable(intrMod.io.out.virtualInterruptIsHvictlInject, false.B, intrMod.io.out.interruptVec.valid) 338 339 val trapHandleMod = Module(new TrapHandleModule) 340 341 trapHandleMod.io.in.trapInfo.valid := hasTrap 342 trapHandleMod.io.in.trapInfo.bits.trapVec := trapVec.asUInt 343 trapHandleMod.io.in.trapInfo.bits.nmi := nmi 344 trapHandleMod.io.in.trapInfo.bits.intrVec := intrVec 345 trapHandleMod.io.in.trapInfo.bits.isInterrupt := trapIsInterrupt 346 trapHandleMod.io.in.privState := privState 347 trapHandleMod.io.in.mideleg := mideleg.regOut 348 trapHandleMod.io.in.medeleg := medeleg.regOut 349 trapHandleMod.io.in.hideleg := hideleg.regOut 350 trapHandleMod.io.in.hedeleg := hedeleg.regOut 351 trapHandleMod.io.in.mvien := mvien.regOut 352 trapHandleMod.io.in.hvien := hvien.regOut 353 trapHandleMod.io.in.mtvec := mtvec.regOut 354 trapHandleMod.io.in.stvec := stvec.regOut 355 trapHandleMod.io.in.vstvec := vstvec.regOut 356 trapHandleMod.io.in.virtualInterruptIsHvictlInject := virtualInterruptIsHvictlInject 357 358 val entryPrivState = trapHandleMod.io.out.entryPrivState 359 val entryDebugMode = WireInit(false.B) 360 361 // PMP 362 val pmpEntryMod = Module(new PMPEntryHandleModule) 363 pmpEntryMod.io.in.pmpCfg := cfgs.map(_.regOut.asInstanceOf[PMPCfgBundle]) 364 pmpEntryMod.io.in.pmpAddr := pmpaddr.map(_.regOut.asInstanceOf[PMPAddrBundle]) 365 pmpEntryMod.io.in.ren := ren 366 pmpEntryMod.io.in.wen := wen 367 pmpEntryMod.io.in.addr := addr 368 pmpEntryMod.io.in.wdata := wdata 369 370 for ((id, (wBundle, _)) <- csrRwMap) { 371 if (vsMapS.contains(id)) { 372 // VS access CSR by S: privState.isModeVS && addrMappedToVS === sMapVS(id).U 373 wBundle.wen := wenLegal && ((isModeVS && addr === vsMapS(id).U) || (!isModeVS && addr === id.U)) 374 wBundle.wdata := wdata 375 } else if (sMapVS.contains(id)) { 376 wBundle.wen := wenLegal && !isModeVS && addr === id.U 377 wBundle.wdata := wdata 378 } else { 379 wBundle.wen := wenLegal && addr === id.U 380 wBundle.wdata := wdata 381 } 382 } 383 384 private val writeFpLegal = permitMod.io.out.hasLegalWriteFcsr 385 private val writeVecLegal = permitMod.io.out.hasLegalWriteVcsr 386 387 permitMod.io.in.csrAccess.ren := ren && valid 388 permitMod.io.in.csrAccess.wen := wen 389 permitMod.io.in.csrAccess.addr := addr 390 391 permitMod.io.in.privState := privState 392 permitMod.io.in.debugMode := debugMode 393 394 permitMod.io.in.mnret := io.in.bits.mnret && valid 395 permitMod.io.in.mret := io.in.bits.mret && valid 396 permitMod.io.in.sret := io.in.bits.sret && valid 397 permitMod.io.in.dret := io.in.bits.dret && valid 398 permitMod.io.in.csrIsCustom := customCSRMods.map(_.addr.U === addr).reduce(_ || _).orR 399 400 permitMod.io.in.status.tsr := mstatus.regOut.TSR.asBool 401 permitMod.io.in.status.vtsr := hstatus.regOut.VTSR.asBool 402 403 permitMod.io.in.status.tvm := mstatus.regOut.TVM.asBool 404 permitMod.io.in.status.vtvm := hstatus.regOut.VTVM.asBool 405 406 permitMod.io.in.status.mcounteren := mcounteren.rdata 407 permitMod.io.in.status.hcounteren := hcounteren.rdata 408 permitMod.io.in.status.scounteren := scounteren.rdata 409 410 permitMod.io.in.status.mstateen0 := mstateen0.rdata 411 permitMod.io.in.status.hstateen0 := hstateen0.rdata 412 permitMod.io.in.status.sstateen0 := sstateen0.rdata 413 414 permitMod.io.in.status.menvcfg := menvcfg.rdata 415 permitMod.io.in.status.henvcfg := henvcfg.rdata 416 417 permitMod.io.in.status.mstatusFSOff := mstatus.regOut.FS === ContextStatus.Off 418 permitMod.io.in.status.mstatusVSOff := mstatus.regOut.VS === ContextStatus.Off 419 permitMod.io.in.status.vsstatusFSOff := vsstatus.regOut.FS === ContextStatus.Off 420 permitMod.io.in.status.vsstatusVSOff := vsstatus.regOut.VS === ContextStatus.Off 421 422 permitMod.io.in.aia.miselectIsIllegal := miselect.isIllegal 423 permitMod.io.in.aia.siselectIsIllegal := siselect.isIllegal 424 permitMod.io.in.aia.vsiselectIsIllegal := vsiselect.isIllegal 425 permitMod.io.in.aia.siselect := siselect.rdata 426 permitMod.io.in.aia.vsiselect := vsiselect.rdata 427 permitMod.io.in.aia.mvienSEIE := mvien.regOut.SEIE.asBool 428 permitMod.io.in.aia.hvictlVTI := hvictl.regOut.VTI.asBool 429 430 sstcIRGen.i.stime.valid := time.updated 431 sstcIRGen.i.stime.bits := time.stime 432 sstcIRGen.i.vstime.valid := time.updated 433 sstcIRGen.i.vstime.bits := time.vstime 434 sstcIRGen.i.stimecmp := stimecmp.rdata 435 sstcIRGen.i.vstimecmp := vstimecmp.rdata 436 sstcIRGen.i.menvcfgSTCE := menvcfg.regOut.STCE.asBool 437 sstcIRGen.i.henvcfgSTCE := henvcfg.regOut.STCE.asBool 438 439 miregiprios.foreach { mod => 440 mod.w.wen := wen && (addr === mireg.addr.U) && (miselect.regOut.ALL.asUInt === mod.addr.U) 441 mod.w.wdata := wdata 442 } 443 444 siregiprios.foreach { mod => 445 mod.w.wen := wen && (addr === sireg.addr.U) && (siselect.regOut.ALL.asUInt === mod.addr.U) 446 mod.w.wdata := wdata 447 } 448 449 mhartid.hartid := this.io.fromTop.hartId 450 451 cfgs.zipWithIndex.foreach { case (mod, i) => 452 mod.w.wen := wen && (addr === (0x3A0 + i / 8 * 2).U) 453 mod.w.wdata := pmpEntryMod.io.out.pmpCfgWData(8*((i%8)+1)-1,8*(i%8)) 454 } 455 456 pmpaddr.zipWithIndex.foreach{ case(mod, i) => 457 mod.w.wen := wen && (addr === (0x3B0 + i).U) 458 mod.w.wdata := pmpEntryMod.io.out.pmpAddrWData(i) 459 } 460 461 csrMods.foreach { mod => 462 mod match { 463 case m: HypervisorBundle => 464 m.hstatus := hstatus.regOut 465 case _ => 466 } 467 mod match { 468 case m: VirtualSupervisorBundle => 469 m.v := V.asUInt.asBool 470 m.hgatp := hgatp.regOut 471 case _ => 472 } 473 mod match { 474 case m: HasMachineDelegBundle => 475 m.mideleg := mideleg.regOut 476 m.medeleg := medeleg.regOut 477 case _ => 478 } 479 mod match { 480 case m: HasMachineCounterControlBundle => 481 m.mcountinhibit := mcountinhibit.regOut 482 case _ => 483 } 484 mod match { 485 case m: HasExternalInterruptBundle => 486 m.platformIRP := this.platformIRP 487 m.platformIRP.STIP := sstcIRGen.o.STIP 488 m.platformIRP.VSTIP := sstcIRGen.o.VSTIP 489 case _ => 490 } 491 mod match { 492 case m: HasRobCommitBundle => 493 // Todo: move RegNext from ROB to CSR 494 m.robCommit.instNum := io.fromRob.commit.instNum 495 m.robCommit.fflags := RegNextWithEnable(io.fromRob.commit.fflags) 496 m.robCommit.fsDirty := GatedValidRegNext(io.fromRob.commit.fsDirty) 497 m.robCommit.vsDirty := GatedValidRegNext(io.fromRob.commit.vsDirty) 498 m.robCommit.vxsat := RegNextWithEnable(io.fromRob.commit.vxsat) 499 m.robCommit.vtype := RegNextWithEnable(io.fromRob.commit.vtype) 500 m.robCommit.vl := RegNext (io.fromRob.commit.vl) 501 m.robCommit.vstart := RegNextWithEnable(io.fromRob.commit.vstart) 502 m.writeFCSR := writeFpLegal 503 m.writeVCSR := writeVecLegal 504 m.isVirtMode := V.asUInt.asBool 505 case _ => 506 } 507 mod match { 508 case m: TrapEntryDEventSinkBundle => 509 m.trapToD := trapEntryDEvent.out 510 case _ => 511 } 512 mod match { 513 case m: TrapEntryMEventSinkBundle => 514 m.trapToM := trapEntryMEvent.out 515 case _ => 516 } 517 mod match { 518 case m: TrapEntryMNEventSinkBundle => 519 m.trapToMN := trapEntryMNEvent.out 520 case _ => 521 } 522 mod match { 523 case m: TrapEntryHSEventSinkBundle => 524 m.trapToHS := trapEntryHSEvent.out 525 case _ => 526 } 527 mod match { 528 case m: TrapEntryVSEventSinkBundle => 529 m.trapToVS := trapEntryVSEvent.out 530 case _ => 531 } 532 mod match { 533 case m: MretEventSinkBundle => 534 m.retFromM := mretEvent.out 535 case _ => 536 } 537 mod match { 538 case m: MNretEventSinkBundle => 539 m.retFromMN := mnretEvent.out 540 case _ => 541 } 542 mod match { 543 case m: SretEventSinkBundle => 544 m.retFromS := sretEvent.out 545 case _ => 546 } 547 mod match { 548 case m: DretEventSinkBundle => 549 m.retFromD := dretEvent.out 550 case _ => 551 } 552 mod match { 553 case m: HasAIABundle => 554 m.aiaToCSR.rdata.valid := fromAIA.rdata.valid 555 m.aiaToCSR.rdata.bits.data := fromAIA.rdata.bits.data 556 m.aiaToCSR.rdata.bits.illegal := fromAIA.rdata.bits.illegal 557 m.aiaToCSR.meip := fromAIA.meip 558 m.aiaToCSR.seip := fromAIA.seip 559 m.aiaToCSR.vseip := fromAIA.vseip 560 m.aiaToCSR.mtopei := fromAIA.mtopei 561 m.aiaToCSR.stopei := fromAIA.stopei 562 m.aiaToCSR.vstopei := fromAIA.vstopei 563 case _ => 564 } 565 mod match { 566 case m: HasInterruptFilterSink => 567 m.topIR.mtopi := intrMod.io.out.mtopi 568 m.topIR.stopi := intrMod.io.out.stopi 569 m.topIR.vstopi := intrMod.io.out.vstopi 570 case _ => 571 } 572 mod match { 573 case m: HasPMPAddrSink => 574 m.addrRData := pmpEntryMod.io.out.pmpAddrRData 575 case _ => 576 } 577 mod match { 578 case m: HasMHPMSink => 579 // cycle from mcycle 580 m.mHPM.cycle := mcycle.rdata 581 // time from clint 582 m.mHPM.time := io.fromTop.clintTime 583 // instret from minstret 584 m.mHPM.instret := minstret.rdata 585 // VS-Mode or VU-Mode 586 m.v := privState.isVirtual 587 m.htimedelta := htimedelta.rdata 588 m.mHPM.hpmcounters.zip(mhpmcounters).map{ 589 case(counter, mcounter) => counter := mcounter.rdata 590 } 591 case _ => 592 } 593 mod match { 594 case m: HasMachineEnvBundle => 595 m.menvcfg := menvcfg.regOut 596 case _ => 597 } 598 mod match { 599 case m: HasHypervisorEnvBundle => 600 m.menvcfg := menvcfg.regOut 601 case _ => 602 } 603 mod match { 604 case m: HasIpIeBundle => 605 m.mideleg := mideleg.regOut 606 m.mip := mip.rdata 607 m.mie := mie.regOut 608 m.mvip := mvip.regOut 609 m.mvien := mvien.regOut 610 m.hideleg := hideleg.regOut 611 m.hip := hip.regOut 612 m.hie := hie.regOut 613 m.hvien := hvien.regOut 614 m.hvip := hvip.regOut 615 m.sip := sip.regOut 616 m.sie := sie.regOut 617 m.vsip := vsip.regOut 618 m.vsie := vsie.regOut 619 m.hgeip := hgeip.regOut 620 m.hgeie := hgeie.regOut 621 m.hstatusVGEIN := hstatus.regOut.VGEIN 622 case _ => 623 } 624 mod match { 625 case m: HasMhpmeventOfBundle => 626 m.ofVec := VecInit(mhpmevents.map(event => event.rdata.head(1).asBool)).asUInt //todo:fix 627 m.privState := privState 628 m.mcounteren := mcounteren.rdata 629 m.hcounteren := hcounteren.rdata 630 case _ => 631 } 632 mod match { 633 case m: HasStateen0Bundle => 634 m.fromMstateen0 := mstateen0.regOut 635 m.fromHstateen0 := hstateen0.regOut 636 m.privState := privState 637 case _ => 638 } 639 } 640 641 csrMods.foreach { mod => 642 println(s"${mod.modName}: ") 643 println(mod.dumpFields) 644 } 645 646 trapEntryMEvent.valid := hasTrap && entryPrivState.isModeM && !entryDebugMode && !debugMode && !nmi 647 trapEntryMNEvent.valid := hasTrap && nmi && !debugMode 648 trapEntryHSEvent.valid := hasTrap && entryPrivState.isModeHS && !entryDebugMode && !debugMode 649 trapEntryVSEvent.valid := hasTrap && entryPrivState.isModeVS && !entryDebugMode && !debugMode 650 651 Seq(trapEntryMEvent, trapEntryMNEvent, trapEntryHSEvent, trapEntryVSEvent, trapEntryDEvent).foreach { eMod => 652 eMod.in match { 653 case in: TrapEntryEventInput => 654 in.causeNO := trapHandleMod.io.out.causeNO 655 in.trapPc := trapPC 656 in.trapPcGPA := trapPCGPA // only used by trapEntryMEvent & trapEntryHSEvent 657 in.trapInst := io.trapInst 658 in.fetchMalTval := io.fetchMalTval 659 in.isCrossPageIPF := trapIsCrossPageIPF 660 in.isHls := trapIsHls 661 in.isFetchMalAddr := trapIsFetchMalAddr 662 in.trapIsForVSnonLeafPTE := trapIsForVSnonLeafPTE 663 664 in.iMode.PRVM := PRVM 665 in.iMode.V := V 666 // when NMIE is zero, force to behave as MPRV is zero 667 in.dMode.PRVM := Mux(mstatus.regOut.MPRV.asBool && mnstatus.regOut.NMIE.asBool, mstatus.regOut.MPP, PRVM) 668 in.dMode.V := V.asUInt.asBool || mstatus.regOut.MPRV && mnstatus.regOut.NMIE.asBool && (mstatus.regOut.MPP =/= PrivMode.M) && mstatus.regOut.MPV 669 670 in.privState := privState 671 in.mstatus := mstatus.regOut 672 in.hstatus := hstatus.regOut 673 in.sstatus := mstatus.sstatus 674 in.vsstatus := vsstatus.regOut 675 in.pcFromXtvec := trapHandleMod.io.out.pcFromXtvec 676 in.tcontrol := tcontrol.regOut 677 678 in.satp := satp.regOut 679 in.vsatp := vsatp.regOut 680 in.hgatp := hgatp.regOut 681 682 in.memExceptionVAddr := io.fromMem.excpVA 683 in.memExceptionGPAddr := io.fromMem.excpGPA 684 in.memExceptionIsForVSnonLeafPTE := io.fromMem.excpIsForVSnonLeafPTE 685 686 in.virtualInterruptIsHvictlInject := virtualInterruptIsHvictlInject 687 in.hvictlIID := hvictl.regOut.IID.asUInt 688 } 689 } 690 691 mnretEvent.valid := legalMNret 692 mnretEvent.in match { 693 case in => 694 in.mstatus := mstatus.regOut 695 in.mnepc := mnepc.regOut 696 in.mnstatus:= mnstatus.regOut 697 in.satp := satp.regOut 698 in.vsatp := vsatp.regOut 699 in.hgatp := hgatp.regOut 700 } 701 702 mretEvent.valid := legalMret 703 mretEvent.in match { 704 case in => 705 in.mstatus := mstatus.regOut 706 in.mepc := mepc.regOut 707 in.tcontrol := tcontrol.regOut 708 in.satp := satp.regOut 709 in.vsatp := vsatp.regOut 710 in.hgatp := hgatp.regOut 711 } 712 713 sretEvent.valid := legalSret 714 sretEvent.in match { 715 case in => 716 in.privState := privState 717 in.sstatus := mstatus.sstatus 718 in.hstatus := hstatus.regOut 719 in.vsstatus := vsstatus.regOut 720 in.sepc := sepc.regOut 721 in.vsepc := vsepc.regOut 722 in.satp := satp.regOut 723 in.vsatp := vsatp.regOut 724 in.hgatp := hgatp.regOut 725 } 726 727 dretEvent.valid := legalDret 728 dretEvent.in match { 729 case in => 730 in.dcsr := dcsr.regOut 731 in.dpc := dpc.regOut 732 in.mstatus := mstatus.regOut 733 in.satp := satp.regOut 734 in.vsatp := vsatp.regOut 735 in.hgatp := hgatp.regOut 736 } 737 738 PRVM := MuxCase( 739 PRVM, 740 events.filter(_.out.isInstanceOf[EventUpdatePrivStateOutput]).map { 741 x => x.out match { 742 case xx: EventUpdatePrivStateOutput => (xx.privState.valid -> xx.privState.bits.PRVM) 743 } 744 } 745 ) 746 747 V := MuxCase( 748 V, 749 events.filter(_.out.isInstanceOf[EventUpdatePrivStateOutput]).map { 750 x => x.out match { 751 case xx: EventUpdatePrivStateOutput => (xx.privState.valid -> xx.privState.bits.V) 752 } 753 } 754 ) 755 756 debugMode := MuxCase( 757 debugMode, 758 Seq( 759 dretEvent.out.debugMode.valid -> dretEvent.out.debugMode.bits, 760 trapEntryDEvent.out.debugMode.valid -> trapEntryDEvent.out.debugMode.bits 761 ) 762 ) 763 764 debugIntrEnable := MuxCase( 765 debugIntrEnable, 766 Seq( 767 dretEvent.out.debugIntrEnable.valid -> dretEvent.out.debugIntrEnable.bits, 768 trapEntryDEvent.out.debugIntrEnable.valid -> trapEntryDEvent.out.debugIntrEnable.bits 769 ) 770 ) 771 772 // perf 773 val addrInPerfCnt = (wen || ren) && ( 774 (addr >= CSRs.mcycle.U) && (addr <= CSRs.mhpmcounter31.U) || 775 (addr === mcountinhibit.addr.U) || 776 (addr >= CSRs.cycle.U) && (addr <= CSRs.hpmcounter31.U) || 777 Cat(aiaSkipCSRs.map(_.addr.U === addr)).orR 778 ) 779 780 // flush 781 val resetSatp = Cat(Seq(satp, vsatp, hgatp).map(_.addr.U === addr)).orR && wenLegal // write to satp will cause the pipeline be flushed 782 783 val floatStatusOnOff = mstatus.w.wen && ( 784 mstatus.w.wdataFields.FS === ContextStatus.Off && mstatus.regOut.FS =/= ContextStatus.Off || 785 mstatus.w.wdataFields.FS =/= ContextStatus.Off && mstatus.regOut.FS === ContextStatus.Off 786 ) || mstatus.wAliasSstatus.wen && ( 787 mstatus.wAliasSstatus.wdataFields.FS === ContextStatus.Off && mstatus.regOut.FS =/= ContextStatus.Off || 788 mstatus.wAliasSstatus.wdataFields.FS =/= ContextStatus.Off && mstatus.regOut.FS === ContextStatus.Off 789 ) || vsstatus.w.wen && ( 790 vsstatus.w.wdataFields.FS === ContextStatus.Off && vsstatus.regOut.FS =/= ContextStatus.Off || 791 vsstatus.w.wdataFields.FS =/= ContextStatus.Off && vsstatus.regOut.FS === ContextStatus.Off 792 ) 793 794 val vectorStatusOnOff = mstatus.w.wen && ( 795 mstatus.w.wdataFields.VS === ContextStatus.Off && mstatus.regOut.VS =/= ContextStatus.Off || 796 mstatus.w.wdataFields.VS =/= ContextStatus.Off && mstatus.regOut.VS === ContextStatus.Off 797 ) || mstatus.wAliasSstatus.wen && ( 798 mstatus.wAliasSstatus.wdataFields.VS === ContextStatus.Off && mstatus.regOut.VS =/= ContextStatus.Off || 799 mstatus.wAliasSstatus.wdataFields.VS =/= ContextStatus.Off && mstatus.regOut.VS === ContextStatus.Off 800 ) || vsstatus.w.wen && ( 801 vsstatus.w.wdataFields.VS === ContextStatus.Off && vsstatus.regOut.VS =/= ContextStatus.Off || 802 vsstatus.w.wdataFields.VS =/= ContextStatus.Off && vsstatus.regOut.VS === ContextStatus.Off 803 ) 804 805 val triggerFrontendChange = Wire(Bool()) 806 807 val vstartChange = vstart.w.wen && ( 808 vstart.w.wdata === 0.U && vstart.regOut.vstart.asUInt =/= 0.U || 809 vstart.w.wdata =/= 0.U && vstart.regOut.vstart.asUInt === 0.U 810 ) 811 812 // flush pipe when write frm and data > 4 or write fcsr and data[7:5] > 4 or write frm/fcsr and frm is reserved 813 val frmIsReserved = fcsr.frm(2) && fcsr.frm(1, 0).orR 814 val frmWdataReserved = fcsr.wAliasFfm.wdata(2) && fcsr.wAliasFfm.wdata(1, 0).orR 815 val fcsrWdataReserved = fcsr.w.wdata(7) && fcsr.w.wdata(6, 5).orR 816 val frmChange = fcsr.wAliasFfm.wen && (!frmIsReserved && frmWdataReserved || frmIsReserved && !frmWdataReserved) || 817 fcsr.w.wen && (!frmIsReserved && fcsrWdataReserved || frmIsReserved && !fcsrWdataReserved) 818 819 val flushPipe = resetSatp || 820 triggerFrontendChange || floatStatusOnOff || vectorStatusOnOff || 821 vstartChange || frmChange 822 823 private val rdata = Mux1H(csrRwMap.map { case (id, (_, rdata)) => 824 if (vsMapS.contains(id)) { 825 ((isModeVS && addr === vsMapS(id).U) || !isModeVS && addr === id.U) -> rdata 826 } else if (sMapVS.contains(id)) { 827 (!isModeVS && addr === id.U) -> rdata 828 } else { 829 (raddr === id.U) -> rdata 830 } 831 }) 832 833 private val regOut = Mux1H(csrOutMap.map { case (id, regOut) => 834 if (vsMapS.contains(id)) { 835 ((isModeVS && addr === vsMapS(id).U) || !isModeVS && addr === id.U) -> regOut 836 } else if (sMapVS.contains(id)) { 837 (!isModeVS && addr === id.U) -> regOut 838 } else { 839 (raddr === id.U) -> regOut 840 } 841 }) 842 843 private val needTargetUpdate = mnretEvent.out.targetPc.valid || mretEvent.out.targetPc.valid || sretEvent.out.targetPc.valid || dretEvent.out.targetPc.valid || 844 trapEntryMEvent.out.targetPc.valid || trapEntryMNEvent.out.targetPc.valid || trapEntryHSEvent.out.targetPc.valid || trapEntryVSEvent.out.targetPc.valid || trapEntryDEvent.out.targetPc.valid 845 846 private val noCSRIllegal = (ren || wen) && Cat(csrRwMap.keys.toSeq.sorted.map(csrAddr => !(addr === csrAddr.U))).andR 847 848 private val s_idle :: s_waitIMSIC :: s_finish :: Nil = Enum(3) 849 850 /** the state machine of newCSR module */ 851 private val state = RegInit(s_idle) 852 /** the next state of newCSR */ 853 private val stateNext = WireInit(state) 854 state := stateNext 855 856 /** 857 * Asynchronous read operation of CSR. Check whether a read is asynchronous when read-enable is high. 858 * AIA registers are designed to be read asynchronously, so newCSR will wait for response. 859 **/ 860 private val asyncRead = ren && !(permitMod.io.out.EX_II || permitMod.io.out.EX_VI) && ( 861 mireg.addr.U === addr && miselect.inIMSICRange || 862 sireg.addr.U === addr && ((!V.asUInt.asBool && siselect.inIMSICRange) || (V.asUInt.asBool && vsiselect.inIMSICRange)) || 863 vsireg.addr.U === addr && vsiselect.inIMSICRange 864 ) 865 866 /** State machine of newCSR */ 867 switch(state) { 868 is(s_idle) { 869 when(valid && asyncRead) { 870 stateNext := s_waitIMSIC 871 }.elsewhen(valid && !io.out.ready) { 872 stateNext := s_finish 873 } 874 } 875 is(s_waitIMSIC) { 876 when(fromAIA.rdata.valid) { 877 when(io.out.ready) { 878 stateNext := s_idle 879 }.otherwise { 880 stateNext := s_finish 881 } 882 } 883 } 884 is(s_finish) { 885 when(io.out.ready) { 886 stateNext := s_idle 887 } 888 } 889 } 890 891 892 // Todo: check IMSIC EX_II and EX_VI 893 private val imsicIllegal = fromAIA.rdata.valid && fromAIA.rdata.bits.illegal 894 private val imsic_EX_II = imsicIllegal && !V.asUInt.asBool 895 private val imsic_EX_VI = imsicIllegal && V.asUInt.asBool 896 897 /** Set io.in.ready when state machine is ready to receive a new request synchronously */ 898 io.in.ready := (state === s_idle) 899 900 /** 901 * Valid signal of newCSR output. 902 * When in IDLE state, when input_valid is high, we set it. 903 * When in waitIMSIC state, and the next state is IDLE, we set it. 904 **/ 905 906 /** Data that have been read before,and should be stored because output not fired */ 907 io.out.valid := state === s_idle && valid && !asyncRead || 908 state === s_waitIMSIC && fromAIA.rdata.valid || 909 state === s_finish 910 io.out.bits.EX_II := DataHoldBypass(permitMod.io.out.EX_II || noCSRIllegal, false.B, io.in.fire) || 911 DataHoldBypass(imsic_EX_II, false.B, fromAIA.rdata.valid) 912 io.out.bits.EX_VI := DataHoldBypass(permitMod.io.out.EX_VI, false.B, io.in.fire) || 913 DataHoldBypass(imsic_EX_VI, false.B, fromAIA.rdata.valid) 914 io.out.bits.flushPipe := DataHoldBypass(flushPipe, false.B, io.in.fire) 915 916 /** Prepare read data for output */ 917 io.out.bits.rData := DataHoldBypass( 918 Mux1H(Seq( 919 io.in.fire -> rdata, 920 fromAIA.rdata.valid -> fromAIA.rdata.bits.data 921 )), 0.U(64.W), io.in.fire || fromAIA.rdata.valid) 922 io.out.bits.regOut := regOut 923 io.out.bits.targetPc := DataHoldBypass( 924 Mux(trapEntryDEvent.out.targetPc.valid, 925 trapEntryDEvent.out.targetPc.bits, 926 Mux1H(Seq( 927 mnretEvent.out.targetPc.valid -> mnretEvent.out.targetPc.bits, 928 mretEvent.out.targetPc.valid -> mretEvent.out.targetPc.bits, 929 sretEvent.out.targetPc.valid -> sretEvent.out.targetPc.bits, 930 dretEvent.out.targetPc.valid -> dretEvent.out.targetPc.bits, 931 trapEntryMEvent.out.targetPc.valid -> trapEntryMEvent.out.targetPc.bits, 932 trapEntryMNEvent.out.targetPc.valid -> trapEntryMNEvent.out.targetPc.bits, 933 trapEntryHSEvent.out.targetPc.valid -> trapEntryHSEvent.out.targetPc.bits, 934 trapEntryVSEvent.out.targetPc.valid -> trapEntryVSEvent.out.targetPc.bits) 935 ) 936 ), 937 needTargetUpdate) 938 io.out.bits.targetPcUpdate := DataHoldBypass(needTargetUpdate, false.B, io.in.fire) 939 io.out.bits.isPerfCnt := DataHoldBypass(addrInPerfCnt, false.B, io.in.fire) 940 941 io.status.privState := privState 942 io.status.fpState.frm := fcsr.frm 943 io.status.fpState.off := mstatus.regOut.FS === ContextStatus.Off 944 io.status.vecState.vstart := vstart.rdata.asUInt 945 io.status.vecState.vxsat := vcsr.vxsat 946 io.status.vecState.vxrm := vcsr.vxrm 947 io.status.vecState.vcsr := vcsr.rdata.asUInt 948 io.status.vecState.vl := vl.rdata.asUInt 949 io.status.vecState.vtype := vtype.rdata.asUInt // Todo: check correct 950 io.status.vecState.vlenb := vlenb.rdata.asUInt 951 io.status.vecState.off := mstatus.regOut.VS === ContextStatus.Off 952 io.status.interrupt := intrMod.io.out.interruptVec.valid 953 io.status.wfiEvent := debugIntr || (mie.rdata.asUInt & mip.rdata.asUInt).orR 954 io.status.debugMode := debugMode 955 io.status.singleStepFlag := !debugMode && dcsr.regOut.STEP 956 957 /** 958 * debug_begin 959 */ 960 val tdata1Selected = Wire(new Tdata1Bundle) 961 tdata1Selected := tdata1.rdata 962 val dmodeInSelectedTrigger = tdata1Selected.DMODE.asBool 963 val triggerCanWrite = dmodeInSelectedTrigger && debugMode || !dmodeInSelectedTrigger 964 val tdata1Update = tdata1.w.wen && triggerCanWrite 965 val tdata2Update = tdata2.w.wen && triggerCanWrite 966 val tdata1Vec = tdata1RegVec.map{ mod => { 967 val tdata1Wire = Wire(new Tdata1Bundle) 968 tdata1Wire := mod.rdata 969 tdata1Wire 970 }} 971 972 val debugMod = Module(new Debug) 973 debugMod.io.in.trapInfo.valid := hasTrap 974 debugMod.io.in.trapInfo.bits.trapVec := trapVec.asUInt 975 debugMod.io.in.trapInfo.bits.intrVec := intrVec 976 debugMod.io.in.trapInfo.bits.isInterrupt := trapIsInterrupt 977 debugMod.io.in.trapInfo.bits.trigger := trigger 978 debugMod.io.in.trapInfo.bits.singleStep := singleStep 979 debugMod.io.in.privState := privState 980 debugMod.io.in.debugMode := debugMode 981 debugMod.io.in.dcsr := dcsr.regOut 982 debugMod.io.in.tcontrol := tcontrol.regOut 983 debugMod.io.in.tselect := tselect.regOut 984 debugMod.io.in.tdata1Vec := tdata1Vec 985 debugMod.io.in.tdata1Selected := tdata1.rdata 986 debugMod.io.in.tdata2Selected := tdata2.rdata 987 debugMod.io.in.tdata1Update := tdata1Update 988 debugMod.io.in.tdata2Update := tdata2Update 989 debugMod.io.in.tdata1Wdata := wdata 990 991 entryDebugMode := debugMod.io.out.hasDebugTrap && !debugMode 992 993 trapEntryDEvent.valid := entryDebugMode 994 trapEntryDEvent.in.hasDebugIntr := debugMod.io.out.hasDebugIntr 995 trapEntryDEvent.in.debugMode := debugMode 996 trapEntryDEvent.in.hasTrap := hasTrap 997 trapEntryDEvent.in.hasSingleStep := debugMod.io.out.hasSingleStep 998 trapEntryDEvent.in.triggerEnterDebugMode := debugMod.io.out.triggerEnterDebugMode 999 trapEntryDEvent.in.hasDebugEbreakException := debugMod.io.out.hasDebugEbreakException 1000 trapEntryDEvent.in.breakPoint := debugMod.io.out.breakPoint 1001 1002 trapHandleMod.io.in.trapInfo.bits.singleStep := debugMod.io.out.hasSingleStep 1003 1004 intrMod.io.in.debugMode := debugMode 1005 intrMod.io.in.debugIntr := debugIntr 1006 intrMod.io.in.dcsr := dcsr.regOut 1007 1008 tdata1RegVec.foreach { mod => 1009 mod match { 1010 case m: HasdebugModeBundle => 1011 m.debugMode := debugMode 1012 m.chainable := debugMod.io.out.newTriggerChainIsLegal 1013 case _ => 1014 } 1015 } 1016 tdata1RegVec.zip(tdata2RegVec).zipWithIndex.map { case ((mod1, mod2), idx) => { 1017 mod1.w.wen := tdata1Update && (tselect.rdata === idx.U) 1018 mod1.w.wdata := wdata 1019 mod2.w.wen := tdata2Update && (tselect.rdata === idx.U) 1020 mod2.w.wdata := wdata 1021 }} 1022 1023 triggerFrontendChange := debugMod.io.out.triggerFrontendChange 1024 1025 io.status.frontendTrigger := debugMod.io.out.frontendTrigger 1026 io.status.memTrigger := debugMod.io.out.memTrigger 1027 /** 1028 * debug_end 1029 */ 1030 1031 /** 1032 * perf_begin 1033 * perf number: 29 (frontend 8, ctrlblock 8, memblock 8, huancun 5) 1034 */ 1035 // tmp: mhpmevents is wrapper of perfEvents, read/write/update mhpmevents -> read/write/update perfEvents 1036 val csrevents = perfEvents.slice(24, 29) 1037 1038 val hcEvents = Wire(Vec(numPCntHc * coreParams.L2NBanks, new PerfEvent)) 1039 for (i <- 0 until numPCntHc * coreParams.L2NBanks) { 1040 hcEvents(i) := io.perf.perfEventsHc(i) 1041 } 1042 1043 val hpmHc = HPerfMonitor(csrevents, hcEvents) 1044 1045 val privState1H = Cat(privState.isModeM, privState.isModeHS, privState.isModeHU, privState.isModeVS, privState.isModeVU) 1046 val countingEn = RegInit(0.U.asTypeOf(Vec(perfCntNum, Bool()))) 1047 for (i <-0 until perfCntNum) { 1048 countingEn(i) := ((~mhpmevents(i).rdata(62, 58)).asUInt & privState1H).orR 1049 } 1050 val allPerfEvents = io.perf.perfEventsFrontend ++ 1051 io.perf.perfEventsBackend ++ 1052 io.perf.perfEventsLsu ++ 1053 hpmHc.getPerf 1054 1055 val ofFromPerfCntVec = Wire(Vec(perfCntNum, Bool())) 1056 val lcofiReqVec = Wire(Vec(perfCntNum, Bool())) 1057 for(i <- 0 until perfCntNum) { 1058 mhpmcounters(i) match { 1059 case m: HasPerfCounterBundle => 1060 m.countingEn := countingEn(i) 1061 m.perf := allPerfEvents(i) 1062 ofFromPerfCntVec(i) := m.toMhpmeventOF 1063 case _ => 1064 } 1065 perfEvents(i) := Mux(mhpmevents(i).w.wen, wdata, (perfEvents(i).head(1).asBool || ofFromPerfCntVec(i)) ## perfEvents(i).tail(1)) 1066 lcofiReqVec(i) := ofFromPerfCntVec(i) && !mhpmevents(i).rdata.head(1) 1067 } 1068 1069 val lcofiReq = lcofiReqVec.asUInt.orR 1070 mip match { 1071 case m: HasLocalInterruptReqBundle => 1072 m.lcofiReq := lcofiReq 1073 case _ => 1074 } 1075 /** 1076 * perf_end 1077 */ 1078 1079 /** 1080 * [[io.status.custom]] connection 1081 */ 1082 io.status.custom.l1I_pf_enable := spfctl.regOut.L1I_PF_ENABLE.asBool 1083 io.status.custom.l2_pf_enable := spfctl.regOut.L2_PF_ENABLE.asBool 1084 io.status.custom.l1D_pf_enable := spfctl.regOut.L1D_PF_ENABLE.asBool 1085 io.status.custom.l1D_pf_train_on_hit := spfctl.regOut.L1D_PF_TRAIN_ON_HIT.asBool 1086 io.status.custom.l1D_pf_enable_agt := spfctl.regOut.L1D_PF_ENABLE_AGT.asBool 1087 io.status.custom.l1D_pf_enable_pht := spfctl.regOut.L1D_PF_ENABLE_PHT.asBool 1088 io.status.custom.l1D_pf_active_threshold := spfctl.regOut.L1D_PF_ACTIVE_THRESHOLD.asUInt 1089 io.status.custom.l1D_pf_active_stride := spfctl.regOut.L1D_PF_ACTIVE_STRIDE.asUInt 1090 io.status.custom.l1D_pf_enable_stride := spfctl.regOut.L1D_PF_ENABLE_STRIDE.asBool 1091 io.status.custom.l2_pf_store_only := spfctl.regOut.L2_PF_STORE_ONLY.asBool 1092 1093 io.status.custom.icache_parity_enable := sfetchctl.regOut.ICACHE_PARITY_ENABLE.asBool 1094 1095 io.status.custom.lvpred_disable := slvpredctl.regOut.LVPRED_DISABLE.asBool 1096 io.status.custom.no_spec_load := slvpredctl.regOut.NO_SPEC_LOAD.asBool 1097 io.status.custom.storeset_wait_store := slvpredctl.regOut.STORESET_WAIT_STORE.asBool 1098 io.status.custom.storeset_no_fast_wakeup := slvpredctl.regOut.STORESET_NO_FAST_WAKEUP.asBool 1099 io.status.custom.lvpred_timeout := slvpredctl.regOut.LVPRED_TIMEOUT.asUInt 1100 1101 io.status.custom.bp_ctrl.ubtb_enable := sbpctl.regOut.UBTB_ENABLE .asBool 1102 io.status.custom.bp_ctrl.btb_enable := sbpctl.regOut.BTB_ENABLE .asBool 1103 io.status.custom.bp_ctrl.bim_enable := sbpctl.regOut.BIM_ENABLE .asBool 1104 io.status.custom.bp_ctrl.tage_enable := sbpctl.regOut.TAGE_ENABLE .asBool 1105 io.status.custom.bp_ctrl.sc_enable := sbpctl.regOut.SC_ENABLE .asBool 1106 io.status.custom.bp_ctrl.ras_enable := sbpctl.regOut.RAS_ENABLE .asBool 1107 io.status.custom.bp_ctrl.loop_enable := sbpctl.regOut.LOOP_ENABLE .asBool 1108 1109 io.status.custom.sbuffer_threshold := smblockctl.regOut.SBUFFER_THRESHOLD.asUInt 1110 io.status.custom.ldld_vio_check_enable := smblockctl.regOut.LDLD_VIO_CHECK_ENABLE.asBool 1111 io.status.custom.soft_prefetch_enable := smblockctl.regOut.SOFT_PREFETCH_ENABLE.asBool 1112 io.status.custom.cache_error_enable := smblockctl.regOut.CACHE_ERROR_ENABLE.asBool 1113 io.status.custom.uncache_write_outstanding_enable := smblockctl.regOut.UNCACHE_WRITE_OUTSTANDING_ENABLE.asBool 1114 io.status.custom.hd_misalign_st_enable := smblockctl.regOut.HD_MISALIGN_ST_ENABLE.asBool 1115 io.status.custom.hd_misalign_ld_enable := smblockctl.regOut.HD_MISALIGN_LD_ENABLE.asBool 1116 1117 io.status.custom.fusion_enable := srnctl.regOut.FUSION_ENABLE.asBool 1118 io.status.custom.wfi_enable := srnctl.regOut.WFI_ENABLE.asBool 1119 1120 io.status.instrAddrTransType.bare := privState.isModeM || 1121 (!privState.isVirtual && satp.regOut.MODE === SatpMode.Bare) || 1122 (privState.isVirtual && vsatp.regOut.MODE === SatpMode.Bare && hgatp.regOut.MODE === HgatpMode.Bare) 1123 io.status.instrAddrTransType.sv39 := !privState.isModeM && !privState.isVirtual && satp.regOut.MODE === SatpMode.Sv39 || 1124 privState.isVirtual && vsatp.regOut.MODE === SatpMode.Sv39 1125 io.status.instrAddrTransType.sv48 := !privState.isModeM && !privState.isVirtual && satp.regOut.MODE === SatpMode.Sv48 || 1126 privState.isVirtual && vsatp.regOut.MODE === SatpMode.Sv48 1127 io.status.instrAddrTransType.sv39x4 := privState.isVirtual && vsatp.regOut.MODE === SatpMode.Bare && hgatp.regOut.MODE === HgatpMode.Sv39x4 1128 io.status.instrAddrTransType.sv48x4 := privState.isVirtual && vsatp.regOut.MODE === SatpMode.Bare && hgatp.regOut.MODE === HgatpMode.Sv48x4 1129 assert(PopCount(io.status.instrAddrTransType.asUInt) === 1.U, "Exactly one inst trans type should be asserted") 1130 1131 private val csrAccess = wen || ren 1132 1133 private val imsicAddrValid = 1134 csrAccess && addr === CSRs.mireg.U && miselect.inIMSICRange || 1135 csrAccess && addr === CSRs.sireg.U && !isModeVS && siselect.inIMSICRange || 1136 csrAccess && (addr === CSRs.sireg.U && isModeVS || addr === CSRs.vsireg.U) && vsiselect.inIMSICRange 1137 1138 private val imsicAddr = Mux1H(Seq( 1139 (csrAccess && addr === CSRs.mireg.U) -> miselect.rdata, 1140 (csrAccess && addr === CSRs.sireg.U && !isModeVS) -> siselect.rdata, 1141 (csrAccess && (addr === CSRs.sireg.U && isModeVS || addr === CSRs.vsireg.U)) -> vsiselect.rdata, 1142 )) 1143 1144 private val imsicAddrPrivState = Mux1H(Seq( 1145 (csrAccess && addr === CSRs.mireg.U) -> PrivState.ModeM, 1146 (csrAccess && addr === CSRs.sireg.U && !isModeVS) -> PrivState.ModeHS, 1147 (csrAccess && (addr === CSRs.sireg.U && isModeVS || addr === CSRs.vsireg.U)) -> PrivState.ModeVS, 1148 )) 1149 1150 private val imsicWdataValid = 1151 mireg.w.wen && miselect.inIMSICRange || 1152 sireg.w.wen && siselect.inIMSICRange || 1153 vsireg.w.wen && vsiselect.inIMSICRange 1154 1155 toAIA.addr.valid := imsicAddrValid 1156 toAIA.addr.bits.addr := imsicAddr 1157 toAIA.addr.bits.prvm := imsicAddrPrivState.PRVM 1158 toAIA.addr.bits.v := imsicAddrPrivState.V 1159 1160 toAIA.wdata.valid := imsicWdataValid 1161 toAIA.wdata.bits.op := io.in.bits.op 1162 toAIA.wdata.bits.data := io.in.bits.src 1163 toAIA.vgein := hstatus.regOut.VGEIN.asUInt 1164 toAIA.mClaim := mtopei.w.wen 1165 toAIA.sClaim := stopei.w.wen 1166 toAIA.vsClaim := vstopei.w.wen 1167 1168 // tlb 1169 io.tlb.satpASIDChanged := GatedValidRegNext(wenLegal && addr === CSRs. satp.U && satp .regOut.ASID =/= satp.w.wdataFields.ASID) 1170 io.tlb.vsatpASIDChanged := GatedValidRegNext(wenLegal && addr === CSRs.vsatp.U && vsatp.regOut.ASID =/= vsatp.w.wdataFields.ASID) 1171 io.tlb.hgatpVMIDChanged := GatedValidRegNext(wenLegal && addr === CSRs.hgatp.U && hgatp.regOut.VMID =/= hgatp.w.wdataFields.VMID) 1172 io.tlb.satp := satp.rdata 1173 io.tlb.vsatp := vsatp.rdata 1174 io.tlb.hgatp := hgatp.rdata 1175 io.tlb.mxr := mstatus.regOut.MXR.asBool 1176 io.tlb.sum := mstatus.regOut.SUM.asBool 1177 io.tlb.vmxr := vsstatus.regOut.MXR.asBool 1178 io.tlb.vsum := vsstatus.regOut.SUM.asBool 1179 io.tlb.spvp := hstatus.regOut.SPVP.asBool 1180 1181 io.tlb.imode := PRVM.asUInt 1182 // when NMIE is zero, force to behave as MPRV is zero 1183 io.tlb.dmode := Mux( 1184 (debugMode && dcsr.regOut.MPRVEN || !debugMode) && mstatus.regOut.MPRV && mnstatus.regOut.NMIE, 1185 mstatus.regOut.MPP.asUInt, 1186 PRVM.asUInt 1187 ) 1188 io.tlb.dvirt := Mux( 1189 (debugMode && dcsr.regOut.MPRVEN || !debugMode) && mstatus.regOut.MPRV && mnstatus.regOut.NMIE && mstatus.regOut.MPP =/= PrivMode.M, 1190 mstatus.regOut.MPV.asUInt, 1191 V.asUInt 1192 ) 1193 io.tlb.mPBMTE := RegNext(menvcfg.regOut.PBMTE.asBool) 1194 io.tlb.hPBMTE := RegNext(henvcfg.regOut.PBMTE.asBool) 1195 1196 io.toDecode.illegalInst.sfenceVMA := isModeHS && mstatus.regOut.TVM || isModeHU 1197 io.toDecode.virtualInst.sfenceVMA := isModeVS && hstatus.regOut.VTVM || isModeVU 1198 io.toDecode.illegalInst.sfencePart := isModeHU 1199 io.toDecode.virtualInst.sfencePart := isModeVU 1200 io.toDecode.illegalInst.hfenceGVMA := isModeHS && mstatus.regOut.TVM || isModeHU 1201 io.toDecode.illegalInst.hfenceVVMA := isModeHU 1202 io.toDecode.virtualInst.hfence := isModeVS || isModeVU 1203 io.toDecode.illegalInst.hlsv := isModeHU && !hstatus.regOut.HU 1204 io.toDecode.virtualInst.hlsv := isModeVS || isModeVU 1205 io.toDecode.illegalInst.fsIsOff := mstatus.regOut.FS === ContextStatus.Off || (isModeVS || isModeVU) && vsstatus.regOut.FS === ContextStatus.Off 1206 io.toDecode.illegalInst.vsIsOff := mstatus.regOut.VS === ContextStatus.Off || (isModeVS || isModeVU) && vsstatus.regOut.VS === ContextStatus.Off 1207 io.toDecode.illegalInst.wfi := isModeHU || !isModeM && mstatus.regOut.TW 1208 io.toDecode.virtualInst.wfi := isModeVS && !mstatus.regOut.TW && hstatus.regOut.VTW || isModeVU && !mstatus.regOut.TW 1209 io.toDecode.illegalInst.frm := frmIsReserved 1210 // Ref: The RISC-V Instruction Set Manual Volume I - 20.5. Control and Status Register State 1211 io.toDecode.illegalInst.cboZ := !isModeM && !menvcfg.regOut.CBZE || isModeHU && !senvcfg.regOut.CBZE 1212 io.toDecode.virtualInst.cboZ := menvcfg.regOut.CBZE && ( 1213 isModeVS && !henvcfg.regOut.CBZE || 1214 isModeVU && !(henvcfg.regOut.CBZE && senvcfg.regOut.CBZE) 1215 ) 1216 io.toDecode.illegalInst.cboCF := !isModeM && !menvcfg.regOut.CBCFE || isModeHU && !senvcfg.regOut.CBCFE 1217 io.toDecode.virtualInst.cboCF := menvcfg.regOut.CBCFE && ( 1218 isModeVS && !henvcfg.regOut.CBCFE || 1219 isModeVU && !(henvcfg.regOut.CBCFE && senvcfg.regOut.CBCFE) 1220 ) 1221 io.toDecode.illegalInst.cboI := 1222 !isModeM && menvcfg.regOut.CBIE === EnvCBIE.Off || 1223 isModeHU && senvcfg.regOut.CBIE === EnvCBIE.Off 1224 io.toDecode.virtualInst.cboI := menvcfg.regOut.CBIE =/= EnvCBIE.Off && ( 1225 isModeVS && henvcfg.regOut.CBIE === EnvCBIE.Off || 1226 isModeVU &&(henvcfg.regOut.CBIE === EnvCBIE.Off || senvcfg.regOut.CBIE === EnvCBIE.Off) 1227 ) 1228 io.toDecode.special.cboI2F := !io.toDecode.illegalInst.cboI && !io.toDecode.virtualInst.cboI && ( 1229 menvcfg.regOut.CBIE === EnvCBIE.Flush && !isModeM || 1230 senvcfg.regOut.CBIE === EnvCBIE.Flush && (isModeHU || isModeVU) || 1231 henvcfg.regOut.CBIE === EnvCBIE.Flush && (isModeVS || isModeVU) 1232 ) 1233 1234 // Always instantiate basic difftest modules. 1235 if (env.AlwaysBasicDiff || env.EnableDifftest) { 1236 val hartId = io.fromTop.hartId 1237 val trapValid = io.fromRob.trap.valid 1238 val trapNO = Mux(virtualInterruptIsHvictlInject && hasTrap, hvictl.regOut.IID.asUInt, trapHandleMod.io.out.causeNO.ExceptionCode.asUInt) 1239 val interrupt = trapHandleMod.io.out.causeNO.Interrupt.asBool 1240 val hasNMI = nmi && hasTrap 1241 val interruptNO = Mux(interrupt, trapNO, 0.U) 1242 val exceptionNO = Mux(!interrupt, trapNO, 0.U) 1243 val isSv39: Bool = 1244 (isModeHS || isModeHU) && satp.regOut.MODE === SatpMode.Sv39 || 1245 (isModeVS || isModeVU) && vsatp.regOut.MODE === SatpMode.Sv39 1246 val isSv48: Bool = 1247 (isModeHS || isModeHU) && satp.regOut.MODE === SatpMode.Sv48 || 1248 (isModeVS || isModeVU) && vsatp.regOut.MODE === SatpMode.Sv48 1249 val isBare = !isSv39 && !isSv48 1250 val sv39PC = SignExt(trapPC.take(39), XLEN) 1251 val sv48PC = SignExt(trapPC.take(48), XLEN) 1252 val barePC = ZeroExt(trapPC.take(PAddrBits), XLEN) 1253 // When enable virtual memory, the higher bit should fill with the msb of address of Sv39/Sv48/Sv57 1254 val exceptionPC = Mux1H(Seq( 1255 isSv39 -> sv39PC, 1256 isSv48 -> sv48PC, 1257 isBare -> barePC, 1258 )) 1259 1260 val diffArchEvent = DifftestModule(new DiffArchEvent, delay = 3, dontCare = true) 1261 diffArchEvent.coreid := hartId 1262 diffArchEvent.valid := trapValid 1263 diffArchEvent.interrupt := interruptNO 1264 diffArchEvent.exception := exceptionNO 1265 diffArchEvent.exceptionPC := exceptionPC 1266 diffArchEvent.hasNMI := hasNMI 1267 diffArchEvent.virtualInterruptIsHvictlInject := virtualInterruptIsHvictlInject && hasTrap 1268 if (env.EnableDifftest) { 1269 diffArchEvent.exceptionInst := io.fromRob.trap.bits.instr 1270 } 1271 1272 val diffCSRState = DifftestModule(new DiffCSRState) 1273 diffCSRState.coreid := hartId 1274 diffCSRState.privilegeMode := privState.PRVM.asUInt 1275 diffCSRState.mstatus := mstatus.rdata.asUInt 1276 diffCSRState.sstatus := mstatus.sstatus.asUInt 1277 diffCSRState.mepc := mepc.rdata.asUInt 1278 diffCSRState.sepc := sepc.rdata.asUInt 1279 diffCSRState.mtval := mtval.rdata.asUInt 1280 diffCSRState.stval := stval.rdata.asUInt 1281 diffCSRState.mtvec := mtvec.rdata.asUInt 1282 diffCSRState.stvec := stvec.rdata.asUInt 1283 diffCSRState.mcause := mcause.rdata.asUInt 1284 diffCSRState.scause := scause.rdata.asUInt 1285 diffCSRState.satp := satp.rdata.asUInt 1286 diffCSRState.mip := mip.rdata.asUInt 1287 diffCSRState.mie := mie.rdata.asUInt 1288 diffCSRState.mscratch := mscratch.rdata.asUInt 1289 diffCSRState.sscratch := sscratch.rdata.asUInt 1290 diffCSRState.mideleg := mideleg.rdata.asUInt 1291 diffCSRState.medeleg := medeleg.rdata.asUInt 1292 1293 val diffDebugMode = DifftestModule(new DiffDebugMode) 1294 diffDebugMode.coreid := hartId 1295 diffDebugMode.debugMode := debugMode 1296 diffDebugMode.dcsr := dcsr.rdata.asUInt 1297 diffDebugMode.dpc := dpc.rdata.asUInt 1298 diffDebugMode.dscratch0 := dscratch0.rdata.asUInt 1299 diffDebugMode.dscratch1 := dscratch1.rdata.asUInt 1300 1301 val diffTriggerCSRState = DifftestModule(new DiffTriggerCSRState) 1302 diffTriggerCSRState.coreid := hartId 1303 diffTriggerCSRState.tselect := tselect.rdata 1304 diffTriggerCSRState.tdata1 := tdata1.rdata 1305 diffTriggerCSRState.tinfo := tinfo.rdata 1306 diffTriggerCSRState.tcontrol := tcontrol.rdata 1307 1308 val diffVecCSRState = DifftestModule(new DiffVecCSRState) 1309 diffVecCSRState.coreid := hartId 1310 diffVecCSRState.vstart := vstart.rdata.asUInt 1311 diffVecCSRState.vxsat := vcsr.vxsat.asUInt 1312 diffVecCSRState.vxrm := vcsr.vxrm.asUInt 1313 diffVecCSRState.vcsr := vcsr.rdata.asUInt 1314 diffVecCSRState.vl := RegNext(io.fromRob.commit.vl) 1315 diffVecCSRState.vtype := vtype.rdata.asUInt 1316 diffVecCSRState.vlenb := vlenb.rdata.asUInt 1317 1318 val diffFpCSRState = DifftestModule(new DiffFpCSRState) 1319 diffFpCSRState.coreid := hartId 1320 diffFpCSRState.fcsr := fcsr.rdata.asUInt 1321 1322 val diffHCSRState = DifftestModule(new DiffHCSRState) 1323 diffHCSRState.coreid := hartId 1324 diffHCSRState.virtMode := privState.V.asBool 1325 diffHCSRState.mtval2 := mtval2.rdata.asUInt 1326 diffHCSRState.mtinst := mtinst.rdata.asUInt 1327 diffHCSRState.hstatus := hstatus.rdata.asUInt 1328 diffHCSRState.hideleg := hideleg.rdata.asUInt 1329 diffHCSRState.hedeleg := hedeleg.rdata.asUInt 1330 diffHCSRState.hcounteren := hcounteren.rdata.asUInt 1331 diffHCSRState.htval := htval.rdata.asUInt 1332 diffHCSRState.htinst := htinst.rdata.asUInt 1333 diffHCSRState.hgatp := hgatp.rdata.asUInt 1334 diffHCSRState.vsstatus := vsstatus.rdata.asUInt 1335 diffHCSRState.vstvec := vstvec.rdata.asUInt 1336 diffHCSRState.vsepc := vsepc.rdata.asUInt 1337 diffHCSRState.vscause := vscause.rdata.asUInt 1338 diffHCSRState.vstval := vstval.rdata.asUInt 1339 diffHCSRState.vsatp := vsatp.rdata.asUInt 1340 diffHCSRState.vsscratch := vsscratch.rdata.asUInt 1341 1342 val platformIRPMeipChange = !platformIRP.MEIP && RegNext(platformIRP.MEIP) || 1343 platformIRP.MEIP && !RegNext(platformIRP.MEIP) || 1344 !fromAIA.meip && RegNext(fromAIA.meip) || 1345 fromAIA.meip && !RegNext(fromAIA.meip) 1346 val platformIRPMtipChange = !platformIRP.MTIP && RegNext(platformIRP.MTIP) || platformIRP.MTIP && !RegNext(platformIRP.MTIP) 1347 val platformIRPMsipChange = !platformIRP.MSIP && RegNext(platformIRP.MSIP) || platformIRP.MSIP && !RegNext(platformIRP.MSIP) 1348 val platformIRPSeipChange = !platformIRP.SEIP && RegNext(platformIRP.SEIP) || 1349 platformIRP.SEIP && !RegNext(platformIRP.SEIP) || 1350 !fromAIA.seip && RegNext(fromAIA.seip) || 1351 fromAIA.seip && !RegNext(fromAIA.seip) 1352 val platformIRPStipChange = !sstcIRGen.o.STIP && RegNext(sstcIRGen.o.STIP) || sstcIRGen.o.STIP && !RegNext(sstcIRGen.o.STIP) 1353 val platformIRPVseipChange = !platformIRP.VSEIP && RegNext(platformIRP.VSEIP) || 1354 platformIRP.VSEIP && !RegNext(platformIRP.VSEIP) || 1355 !hgeip.rdata.asUInt(hstatus.regOut.VGEIN.asUInt) && RegNext(hgeip.rdata.asUInt(hstatus.regOut.VGEIN.asUInt)) || 1356 hgeip.rdata.asUInt(hstatus.regOut.VGEIN.asUInt) && !RegNext(hgeip.rdata.asUInt(hstatus.regOut.VGEIN.asUInt)) 1357 val platformIRPVstipChange = !sstcIRGen.o.VSTIP && RegNext(sstcIRGen.o.VSTIP) || sstcIRGen.o.VSTIP && !RegNext(sstcIRGen.o.VSTIP) 1358 val lcofiReqChange = !lcofiReq && RegNext(lcofiReq) || lcofiReq && !RegNext(lcofiReq) 1359 1360 val diffNonRegInterruptPendingEvent = DifftestModule(new DiffNonRegInterruptPendingEvent) 1361 diffNonRegInterruptPendingEvent.coreid := hartId 1362 diffNonRegInterruptPendingEvent.valid := platformIRPMeipChange || platformIRPMtipChange || platformIRPMsipChange || 1363 platformIRPSeipChange || platformIRPStipChange || 1364 platformIRPVseipChange || platformIRPVstipChange || 1365 lcofiReqChange 1366 diffNonRegInterruptPendingEvent.platformIRPMeip := platformIRP.MEIP || fromAIA.meip 1367 diffNonRegInterruptPendingEvent.platformIRPMtip := platformIRP.MTIP 1368 diffNonRegInterruptPendingEvent.platformIRPMsip := platformIRP.MSIP 1369 diffNonRegInterruptPendingEvent.platformIRPSeip := platformIRP.SEIP || fromAIA.seip 1370 diffNonRegInterruptPendingEvent.platformIRPStip := sstcIRGen.o.STIP 1371 diffNonRegInterruptPendingEvent.platformIRPVseip := platformIRP.VSEIP || hgeip.rdata.asUInt(hstatus.regOut.VGEIN.asUInt) 1372 diffNonRegInterruptPendingEvent.platformIRPVstip := sstcIRGen.o.VSTIP 1373 diffNonRegInterruptPendingEvent.localCounterOverflowInterruptReq := lcofiReq 1374 1375 } 1376} 1377 1378trait IpIeAliasConnect { 1379 self: NewCSR with MachineLevel with SupervisorLevel with VirtualSupervisorLevel with HypervisorLevel => 1380 1381 mip.fromMvip := mvip.toMip 1382 mip.fromSip := sip.toMip 1383 mip.fromVSip := vsip.toMip 1384 mvip.fromMip := mip.toMvip 1385 mvip.fromSip := sip.toMvip 1386 mvip.fromVSip := vsip.toMvip 1387 hvip.fromMip := mip.toHvip 1388 hvip.fromHip := hip.toHvip 1389 hvip.fromVSip := vsip.toHvip 1390 1391 mie.fromHie := hie.toMie 1392 mie.fromSie := sie.toMie 1393 mie.fromVSie := vsie.toMie 1394 sie.fromVSie := vsie.toSie 1395} 1396 1397object NewCSRMain extends App { 1398 val (config, firrtlOpts, firtoolOpts) = ArgParser.parse( 1399 args :+ "--disable-always-basic-diff" :+ "--dump-fir" :+ "--fpga-platform" :+ "--target" :+ "verilog") 1400 1401 val defaultConfig = config.alterPartial({ 1402 // Get XSCoreParams and pass it to the "small module" 1403 case XSCoreParamsKey => config(XSTileKey).head 1404 }) 1405 1406 Generator.execute( 1407 firrtlOpts :+ "--full-stacktrace" :+ "--target-dir" :+ "backend", 1408 new NewCSR()(defaultConfig), 1409 firtoolOpts 1410 ) 1411 1412 println("done") 1413}