XSCore.scala 2.9 KB
Newer Older
L
LinJiawei 已提交
1 2 3 4 5 6 7
package xiangshan

import chisel3._
import chisel3.util._
import bus.simplebus._
import noop.{Cache, CacheConfig, HasExceptionNO, TLB, TLBConfig}
import xiangshan.backend._
8
import xiangshan.backend.dispatch.DP1Config
9 10
import xiangshan.backend.exu.ExuConfig
import xiangshan.frontend.Frontend
L
LinJiawei 已提交
11
import xiangshan.utils._
L
LinJiawei 已提交
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

trait HasXSParameter {
  val XLEN = 64
  val HasMExtension = true
  val HasCExtension = true
  val HasDiv = true
  val HasIcache = true
  val HasDcache = true
  val EnableStoreQueue = false
  val AddrBits = 64 // AddrBits is used in some cases
  val VAddrBits = 39 // VAddrBits is Virtual Memory addr bits
  val PAddrBits = 32 // PAddrBits is Phyical Memory addr bits
  val AddrBytes = AddrBits / 8 // unused
  val DataBits = XLEN
  val DataBytes = DataBits / 8
  val HasFPU = true
  val FetchWidth = 8
29
  val IBufSize = 64
L
LinJiawei 已提交
30
  val DecodeWidth = 6
31
  val RenameWidth = 6
L
LinJiawei 已提交
32
  val CommitWidth = 6
33 34
  val BrqSize = 16
  val BrTagWidth = log2Up(BrqSize)
L
LinJiawei 已提交
35
  val NRPhyRegs = 128
36 37 38
  val PhyRegIdxWidth = log2Up(NRPhyRegs)
  val NRReadPorts = 14
  val NRWritePorts = 8
39
  val RoqSize = 32
40
  val RoqIdxWidth = log2Up(RoqSize)
W
William Wang 已提交
41
  val ExtendedRoqIdxWidth = RoqIdxWidth + 1
42 43 44
  val IntDqDeqWidth = 4
  val FpDqDeqWidth = 4
  val LsDqDeqWidth = 4
45 46 47 48 49
  val dp1Config = DP1Config(
    IntDqSize = 16,
    FpDqSize = 16,
    LsDqSize = 16
  )
50 51 52 53 54 55 56 57
  val exuConfig = ExuConfig(
    AluCnt = 4,
    BruCnt = 1,
    MulCnt = 1,
    MduCnt = 1,
    FmacCnt = 4,
    FmiscCnt = 1,
    FmiscDivSqrtCnt = 1,
58 59
    LduCnt = 1,
    StuCnt = 1
60
  )
L
LinJiawei 已提交
61 62
}

L
LinJiawei 已提交
63
trait HasXSLog { this: Module =>
64
  implicit val moduleName: String = this.name
L
LinJiawei 已提交
65 66
}

L
LinJiawei 已提交
67 68 69
abstract class XSModule extends Module
  with HasXSParameter
  with HasExceptionNO
L
LinJiawei 已提交
70
  with HasXSLog
L
LinJiawei 已提交
71

72 73 74 75 76 77 78 79 80
//remove this trait after impl module logic
trait NeedImpl { this: Module =>
  override protected def IO[T <: Data](iodef: T): T = {
    val io = chisel3.experimental.IO(iodef)
    io <> DontCare
    io
  }
}

L
LinJiawei 已提交
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
abstract class XSBundle extends Bundle
  with HasXSParameter

case class XSConfig
(
  FPGAPlatform: Boolean = true,
  EnableDebug: Boolean = false
)

class XSCore(implicit val p: XSConfig) extends XSModule {
  val io = IO(new Bundle {
    val imem = new SimpleBusC
    val dmem = new SimpleBusC
    val mmio = new SimpleBusUC
    val frontend = Flipped(new SimpleBusUC())
  })

  io.imem <> DontCare

  val dmemXbar = Module(new SimpleBusCrossbarNto1(3))

102
  val front = Module(new Frontend)
L
LinJiawei 已提交
103 104
  val backend = Module(new Backend)

105
  front.io.backend <> backend.io.frontend
L
LinJiawei 已提交
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

  backend.io.memMMU.imem <> DontCare

  val dtlb = TLB(
    in = backend.io.dmem,
    mem = dmemXbar.io.in(1),
    flush = false.B,
    csrMMU = backend.io.memMMU.dmem
  )(TLBConfig(name = "dtlb", totalEntry = 64))
  dmemXbar.io.in(0) <> dtlb.io.out
  dmemXbar.io.in(2) <> io.frontend

  io.dmem <> Cache(
    in = dmemXbar.io.out,
    mmio = Seq(io.mmio),
    flush = "b00".U,
    empty = dtlb.io.cacheEmpty,
    enable = HasDcache
  )(CacheConfig(name = "dcache"))
}