1package xiangshan 2 3import chisel3._ 4import chisel3.util._ 5import bus.simplebus._ 6import noop.{Cache, CacheConfig, HasExceptionNO, TLB, TLBConfig} 7import xiangshan.backend._ 8import xiangshan.backend.dispatch.DP1Config 9import xiangshan.backend.exu.ExuConfig 10import xiangshan.frontend.Frontend 11import xiangshan.utils._ 12 13trait HasXSParameter { 14 val XLEN = 64 15 val HasMExtension = true 16 val HasCExtension = true 17 val HasDiv = true 18 val HasIcache = true 19 val HasDcache = true 20 val EnableStoreQueue = false 21 val AddrBits = 64 // AddrBits is used in some cases 22 val VAddrBits = 39 // VAddrBits is Virtual Memory addr bits 23 val PAddrBits = 32 // PAddrBits is Phyical Memory addr bits 24 val AddrBytes = AddrBits / 8 // unused 25 val DataBits = XLEN 26 val DataBytes = DataBits / 8 27 val HasFPU = true 28 val FetchWidth = 8 29 val IBufSize = 64 30 val DecodeWidth = 8 31 val DecBufSize = 8 32 val RenameWidth = 6 33 val CommitWidth = 6 34 val BrqSize = 16 35 val BrTagWidth = log2Up(BrqSize) 36 val NRPhyRegs = 128 37 val PhyRegIdxWidth = log2Up(NRPhyRegs) 38 val NRReadPorts = 14 39 val NRWritePorts = 8 40 val RoqSize = 32 41 val RoqIdxWidth = log2Up(RoqSize) 42 val ExtendedRoqIdxWidth = RoqIdxWidth + 1 43 val IntDqDeqWidth = 4 44 val FpDqDeqWidth = 4 45 val LsDqDeqWidth = 4 46 val dp1Config = DP1Config( 47 IntDqSize = 16, 48 FpDqSize = 16, 49 LsDqSize = 16 50 ) 51 val exuConfig = ExuConfig( 52 AluCnt = 4, 53 BruCnt = 1, 54 MulCnt = 1, 55 MduCnt = 1, 56 FmacCnt = 4, 57 FmiscCnt = 1, 58 FmiscDivSqrtCnt = 1, 59 LduCnt = 1, 60 StuCnt = 1 61 ) 62} 63 64trait HasXSLog { this: Module => 65 implicit val moduleName: String = this.name 66} 67 68abstract class XSModule extends Module 69 with HasXSParameter 70 with HasExceptionNO 71 with HasXSLog 72 73//remove this trait after impl module logic 74trait NeedImpl { this: Module => 75 override protected def IO[T <: Data](iodef: T): T = { 76 val io = chisel3.experimental.IO(iodef) 77 io <> DontCare 78 io 79 } 80} 81 82abstract class XSBundle extends Bundle 83 with HasXSParameter 84 85case class XSConfig 86( 87 FPGAPlatform: Boolean = true, 88 EnableDebug: Boolean = false 89) 90 91class XSCore(implicit val p: XSConfig) extends XSModule { 92 val io = IO(new Bundle { 93 val imem = new SimpleBusC 94 val dmem = new SimpleBusC 95 val mmio = new SimpleBusUC 96 val frontend = Flipped(new SimpleBusUC()) 97 }) 98 99 io.imem <> DontCare 100 101 val dmemXbar = Module(new SimpleBusCrossbarNto1(3)) 102 103 val front = Module(new Frontend) 104 val backend = Module(new Backend) 105 106 front.io.backend <> backend.io.frontend 107 108 backend.io.memMMU.imem <> DontCare 109 110 val dtlb = TLB( 111 in = backend.io.dmem, 112 mem = dmemXbar.io.in(1), 113 flush = false.B, 114 csrMMU = backend.io.memMMU.dmem 115 )(TLBConfig(name = "dtlb", totalEntry = 64)) 116 dmemXbar.io.in(0) <> dtlb.io.out 117 dmemXbar.io.in(2) <> io.frontend 118 119 io.dmem <> Cache( 120 in = dmemXbar.io.out, 121 mmio = Seq(io.mmio), 122 flush = "b00".U, 123 empty = dtlb.io.cacheEmpty, 124 enable = HasDcache 125 )(CacheConfig(name = "dcache")) 126} 127