xref: /XiangShan/src/main/scala/xiangshan/XSCore.scala (revision 66314a3840e5ebe6cc81ca4725bde95942f67489)
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.DP1Parameters
9import xiangshan.backend.exu.ExuParameters
10import xiangshan.frontend._
11import 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 PredictWidth = FetchWidth * 2
30  val EnableBPU = true
31  val EnableBPD = false // enable backing predictor(like Tage) in BPUStage3
32  val HistoryLength = 64
33  val BtbSize = 256
34  // val BtbWays = 4
35  val BtbBanks = PredictWidth
36  // val BtbSets = BtbSize / BtbWays
37  val JbtacSize = 1024
38  val JbtacBanks = 8
39  val RasSize = 16
40  val IBufSize = 64
41  val DecodeWidth = 6
42  val RenameWidth = 6
43  val CommitWidth = 6
44  val BrqSize = 16
45  val IssQueSize = 8
46  val BrTagWidth = log2Up(BrqSize)
47  val NRPhyRegs = 128
48  val PhyRegIdxWidth = log2Up(NRPhyRegs)
49  val NRReadPorts = 14
50  val NRWritePorts = 8
51  val RoqSize = 32
52  val InnerRoqIdxWidth = log2Up(RoqSize)
53  val RoqIdxWidth = InnerRoqIdxWidth + 1
54  val IntDqDeqWidth = 4
55  val FpDqDeqWidth = 4
56  val LsDqDeqWidth = 4
57  val dp1Paremeters = DP1Parameters(
58    IntDqSize = 16,
59    FpDqSize = 16,
60    LsDqSize = 16
61  )
62  val exuParameters = ExuParameters(
63    JmpCnt = 1,
64    AluCnt = 4,
65    MulCnt = 1,
66    MduCnt = 1,
67    FmacCnt = 0,
68    FmiscCnt = 0,
69    FmiscDivSqrtCnt = 0,
70    LduCnt = 0,
71    StuCnt = 1
72  )
73}
74
75trait HasXSLog { this: Module =>
76  implicit val moduleName: String = this.name
77}
78
79abstract class XSModule extends Module
80  with HasXSParameter
81  with HasExceptionNO
82  with HasXSLog
83
84//remove this trait after impl module logic
85trait NeedImpl { this: Module =>
86  override protected def IO[T <: Data](iodef: T): T = {
87    val io = chisel3.experimental.IO(iodef)
88    io <> DontCare
89    io
90  }
91}
92
93abstract class XSBundle extends Bundle
94  with HasXSParameter
95  with HasTageParameter
96
97case class XSConfig
98(
99  FPGAPlatform: Boolean = true,
100  EnableDebug: Boolean = true
101)
102
103object AddressSpace extends HasXSParameter {
104  // (start, size)
105  // address out of MMIO will be considered as DRAM
106  def mmio = List(
107    (0x30000000L, 0x10000000L),  // internal devices, such as CLINT and PLIC
108    (0x40000000L, 0x40000000L) // external devices
109  )
110
111  def isMMIO(addr: UInt): Bool = mmio.map(range => {
112    require(isPow2(range._2))
113    val bits = log2Up(range._2)
114    (addr ^ range._1.U)(PAddrBits-1, bits) === 0.U
115  }).reduce(_ || _)
116}
117
118
119class XSCore(implicit p: XSConfig) extends XSModule {
120  val io = IO(new Bundle {
121    val imem = new SimpleBusC
122    val dmem = new SimpleBusC
123    val mmio = new SimpleBusUC
124    val frontend = Flipped(new SimpleBusUC())
125  })
126
127  io.imem <> DontCare
128
129  val dmemXbar = Module(new SimpleBusCrossbarNto1(3))
130
131  val front = Module(new Frontend)
132  val backend = Module(new Backend)
133
134  front.io.backend <> backend.io.frontend
135
136  backend.io.memMMU.imem <> DontCare
137
138  val dtlb = TLB(
139    in = backend.io.dmem,
140    mem = dmemXbar.io.in(1),
141    flush = false.B,
142    csrMMU = backend.io.memMMU.dmem
143  )(TLBConfig(name = "dtlb", totalEntry = 64))
144  dmemXbar.io.in(0) <> dtlb.io.out
145  dmemXbar.io.in(2) <> io.frontend
146
147  io.dmem <> Cache(
148    in = dmemXbar.io.out,
149    mmio = Seq(io.mmio),
150    flush = "b00".U,
151    empty = dtlb.io.cacheEmpty,
152    enable = HasDcache
153  )(CacheConfig(name = "dcache"))
154
155  XSDebug("(req valid, ready | resp valid, ready) \n")
156  XSDebug("c-mem(%x %x %x| %x %x) c-coh(%x %x %x| %x %x) cache (%x %x %x| %x %x) tlb (%x %x %x| %x %x)\n",
157    io.dmem.mem.req.valid,
158    io.dmem.mem.req.ready,
159    io.dmem.mem.req.bits.addr,
160    io.dmem.mem.resp.valid,
161    io.dmem.mem.resp.ready,
162    io.dmem.coh.req.valid,
163    io.dmem.coh.req.ready,
164    io.dmem.coh.req.bits.addr,
165    io.dmem.coh.resp.valid,
166    io.dmem.coh.resp.ready,
167    dmemXbar.io.out.req.valid,
168    dmemXbar.io.out.req.ready,
169    dmemXbar.io.out.req.bits.addr,
170    dmemXbar.io.out.resp.valid,
171    dmemXbar.io.out.resp.ready,
172    backend.io.dmem.req.valid,
173    backend.io.dmem.req.ready,
174    backend.io.dmem.req.bits.addr,
175    backend.io.dmem.resp.valid,
176    backend.io.dmem.resp.ready
177  )
178}
179