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