XSSim.scala 6.1 KB
Newer Older
Z
Zihao Yu 已提交
1 2
package top

Z
Zihao Yu 已提交
3
import system._
Z
Zihao Yu 已提交
4 5
import chisel3._
import chisel3.util._
6
import chipsalliance.rocketchip.config
7
import chisel3.stage.ChiselGeneratorAnnotation
Z
Zihao Yu 已提交
8
import device._
L
linjiawei 已提交
9
import freechips.rocketchip.amba.axi4.{AXI4Fragmenter, AXI4UserYanker}
10
import freechips.rocketchip.diplomacy.{AddressSet, BufferParams, LazyModule, LazyModuleImp}
11
import freechips.rocketchip.tilelink.{TLBuffer, TLCacheCork, TLFragmenter, TLFuzzer, TLToAXI4, TLXbar}
L
LinJiawei 已提交
12
import xiangshan._
13
import utils._
14
import ExcitingUtils.Debug
Z
Zihao Yu 已提交
15

16 17
class DiffTestIO extends XSBundle {
  val r = Output(Vec(64, UInt(XLEN.W)))
W
William Wang 已提交
18
  val commit = Output(UInt(32.W))
19
  val thisPC = Output(UInt(XLEN.W))
W
William Wang 已提交
20
  val thisINST = Output(UInt(32.W))
21 22
  val skip = Output(UInt(32.W))
  val wen = Output(UInt(32.W))
23 24
  val wdata = Output(Vec(CommitWidth, UInt(XLEN.W))) // set difftest width to 6
  val wdst = Output(Vec(CommitWidth, UInt(32.W))) // set difftest width to 6
25
  val wpc = Output(Vec(CommitWidth, UInt(XLEN.W))) // set difftest width to 6
26
  val isRVC = Output(UInt(32.W))
Z
Zihao Yu 已提交
27
  val intrNO = Output(UInt(64.W))
28
  val cause = Output(UInt(64.W))
29

30 31 32 33 34
  val priviledgeMode = Output(UInt(2.W))
  val mstatus = Output(UInt(64.W))
  val sstatus = Output(UInt(64.W))
  val mepc = Output(UInt(64.W))
  val sepc = Output(UInt(64.W))
W
William Wang 已提交
35 36
  val mtval = Output(UInt(64.W))
  val stval = Output(UInt(64.W))
W
William Wang 已提交
37 38
  val mtvec = Output(UInt(64.W))
  val stvec = Output(UInt(64.W))
39 40
  val mcause = Output(UInt(64.W))
  val scause = Output(UInt(64.W))
41 42 43 44 45 46 47 48

  val satp = Output(UInt(64.W))
  val mip = Output(UInt(64.W))
  val mie = Output(UInt(64.W))
  val mscratch = Output(UInt(64.W))
  val sscratch = Output(UInt(64.W))
  val mideleg = Output(UInt(64.W))
  val medeleg = Output(UInt(64.W))
49

50
  val scFailed = Output(Bool())
Z
Zihao Yu 已提交
51
}
Z
Zihao Yu 已提交
52

53
class LogCtrlIO extends Bundle {
54 55
  val log_begin, log_end = Input(UInt(64.W))
  val log_level = Input(UInt(64.W)) // a cpp uint
56 57
}

Z
Zihao Yu 已提交
58 59 60 61 62 63 64 65
class TrapIO extends XSBundle {
  val valid = Output(Bool())
  val code = Output(UInt(3.W))
  val pc = Output(UInt(VAddrBits.W))
  val cycleCnt = Output(UInt(XLEN.W))
  val instrCnt = Output(UInt(XLEN.W))
}

66 67 68

class XSSimTop()(implicit p: config.Parameters) extends LazyModule {

69 70
  val memAddressSet = AddressSet(0x0L, 0xffffffffffL)

71 72
  val soc = LazyModule(new XSSoc())
  val axiRam = LazyModule(new AXI4RAM(
73
    memAddressSet,
74 75 76 77 78 79 80 81
    memByte = 128 * 1024 * 1024,
    useBlackBox = true
  ))
  val axiMMIO = LazyModule(new SimMMIO())

  axiRam.node :=
    AXI4UserYanker() :=
    TLToAXI4() :=
L
linjiawei 已提交
82
    TLBuffer(BufferParams.default) :=
L
linjiawei 已提交
83
    DebugIdentityNode() :=
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
    soc.mem

  axiMMIO.axiBus :=
    AXI4UserYanker() :=
    TLToAXI4() :=
    soc.extDev

  lazy val module = new LazyModuleImp(this) {
    val io = IO(new Bundle {
      val difftest = new DiffTestIO
      val logCtrl = new LogCtrlIO
      val trap = new TrapIO
      val uart = new UARTIO
    })

    io.uart <> axiMMIO.module.io.uart
    soc.module.io.meip := false.B

    val difftest = WireInit(0.U.asTypeOf(new DiffTestIO))
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
    ExcitingUtils.addSink(difftest.commit, "difftestCommit", Debug)
    ExcitingUtils.addSink(difftest.thisPC, "difftestThisPC", Debug)
    ExcitingUtils.addSink(difftest.thisINST, "difftestThisINST", Debug)
    ExcitingUtils.addSink(difftest.skip, "difftestSkip", Debug)
    ExcitingUtils.addSink(difftest.isRVC, "difftestIsRVC", Debug)
    ExcitingUtils.addSink(difftest.wen, "difftestWen", Debug)
    ExcitingUtils.addSink(difftest.wdata, "difftestWdata", Debug)
    ExcitingUtils.addSink(difftest.wdst, "difftestWdst", Debug)
    ExcitingUtils.addSink(difftest.wpc, "difftestWpc", Debug)
    ExcitingUtils.addSink(difftest.intrNO, "difftestIntrNO", Debug)
    ExcitingUtils.addSink(difftest.cause, "difftestCause", Debug)
    ExcitingUtils.addSink(difftest.r, "difftestRegs", Debug)
    ExcitingUtils.addSink(difftest.priviledgeMode, "difftestMode", Debug)
    ExcitingUtils.addSink(difftest.mstatus, "difftestMstatus", Debug)
    ExcitingUtils.addSink(difftest.sstatus, "difftestSstatus", Debug)
    ExcitingUtils.addSink(difftest.mepc, "difftestMepc", Debug)
    ExcitingUtils.addSink(difftest.sepc, "difftestSepc", Debug)
    ExcitingUtils.addSink(difftest.mtval, "difftestMtval", Debug)
    ExcitingUtils.addSink(difftest.stval, "difftestStval", Debug)
    ExcitingUtils.addSink(difftest.mtvec, "difftestMtvec", Debug)
    ExcitingUtils.addSink(difftest.stvec, "difftestStvec", Debug)
    ExcitingUtils.addSink(difftest.mcause, "difftestMcause", Debug)
    ExcitingUtils.addSink(difftest.scause, "difftestScause", Debug)
    ExcitingUtils.addSink(difftest.satp, "difftestSatp", Debug)
    ExcitingUtils.addSink(difftest.mip, "difftestMip", Debug)
    ExcitingUtils.addSink(difftest.mie, "difftestMie", Debug)
    ExcitingUtils.addSink(difftest.mscratch, "difftestMscratch", Debug)
    ExcitingUtils.addSink(difftest.sscratch, "difftestSscratch", Debug)
    ExcitingUtils.addSink(difftest.mideleg, "difftestMideleg", Debug)
    ExcitingUtils.addSink(difftest.medeleg, "difftestMedeleg", Debug)
    ExcitingUtils.addSink(difftest.scFailed, "difftestScFailed", Debug)
134
    // BoringUtils.addSink(difftest.lrscAddr, "difftestLrscAddr")
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
    io.difftest := difftest

    val trap = WireInit(0.U.asTypeOf(new TrapIO))
    ExcitingUtils.addSink(trap.valid, "trapValid")
    ExcitingUtils.addSink(trap.code, "trapCode")
    ExcitingUtils.addSink(trap.pc, "trapPC")
    ExcitingUtils.addSink(trap.cycleCnt, "trapCycleCnt")
    ExcitingUtils.addSink(trap.instrCnt, "trapInstrCnt")
    io.trap := trap

    val timer = GTimer()
    val logEnable = (timer >= io.logCtrl.log_begin) && (timer < io.logCtrl.log_end)
    ExcitingUtils.addSource(logEnable, "DISPLAY_LOG_ENABLE")
    ExcitingUtils.addSource(timer, "logTimestamp")

    // Check and dispaly all source and sink connections
    ExcitingUtils.checkAndDisplay()
  }
Z
Zihao Yu 已提交
153
}
Z
Zihao Yu 已提交
154 155

object TestMain extends App {
L
LinJiawei 已提交
156 157 158 159 160
  // set parameters
  Parameters.set(
    if(args.contains("--disable-log")) Parameters.simParameters // sim only, disable log
    else Parameters.debugParameters // open log
  )
161
  implicit val p = config.Parameters.empty
L
LinJiawei 已提交
162
  // generate verilog
163
  XiangShanStage.execute(
164
    args.filterNot(_ == "--disable-log"),
165
    Seq(
L
linjiawei 已提交
166
      ChiselGeneratorAnnotation(() => LazyModule(new XSSimTop).module)
167
    )
168
  )
Z
Zihao Yu 已提交
169
}