|
| 1 | +import chisel3._ |
| 2 | +import chisel3.util.experimental._ |
| 3 | +import difftest._ |
| 4 | + |
| 5 | +class Core extends Module { |
| 6 | + val io = IO(new Bundle { |
| 7 | + val imem = new RomIO |
| 8 | + val dmem = new RamIO |
| 9 | + }) |
| 10 | + |
| 11 | + val fetch = Module(new InstFetch) |
| 12 | + fetch.io.imem <> io.imem |
| 13 | + |
| 14 | + val decode = Module(new Decode) |
| 15 | + decode.io.inst := fetch.io.inst |
| 16 | + |
| 17 | + val rf = Module(new RegFile) |
| 18 | + rf.io.rs1_addr := decode.io.rs1_addr |
| 19 | + rf.io.rs2_addr := decode.io.rs2_addr |
| 20 | + rf.io.rd_addr := decode.io.rd_addr |
| 21 | + rf.io.rd_en := decode.io.rd_en |
| 22 | + |
| 23 | + val execution = Module(new Execution) |
| 24 | + execution.io.opcode := decode.io.opcode |
| 25 | + execution.io.in1 := Mux(decode.io.rs1_en, rf.io.rs1_data, 0.U) |
| 26 | + execution.io.in2 := Mux(decode.io.rs2_en, rf.io.rs2_data, decode.io.imm) |
| 27 | + execution.io.dmem <> io.dmem |
| 28 | + rf.io.rd_data := execution.io.out |
| 29 | + |
| 30 | + /* ----- Difftest ------------------------------ */ |
| 31 | + |
| 32 | + val dt_ic = Module(new DifftestInstrCommit) |
| 33 | + dt_ic.io.clock := clock |
| 34 | + dt_ic.io.coreid := 0.U |
| 35 | + dt_ic.io.index := 0.U |
| 36 | + dt_ic.io.valid := true.B |
| 37 | + dt_ic.io.pc := RegNext(fetch.io.pc) |
| 38 | + dt_ic.io.instr := RegNext(fetch.io.inst) |
| 39 | + dt_ic.io.skip := false.B |
| 40 | + dt_ic.io.isRVC := false.B |
| 41 | + dt_ic.io.scFailed := false.B |
| 42 | + dt_ic.io.wen := RegNext(decode.io.rd_en) |
| 43 | + dt_ic.io.wdata := RegNext(execution.io.out) |
| 44 | + dt_ic.io.wdest := RegNext(decode.io.rd_addr) |
| 45 | + |
| 46 | + val dt_ae = Module(new DifftestArchEvent) |
| 47 | + dt_ae.io.clock := clock |
| 48 | + dt_ae.io.coreid := 0.U |
| 49 | + dt_ae.io.intrNO := 0.U |
| 50 | + dt_ae.io.cause := 0.U |
| 51 | + dt_ae.io.exceptionPC := 0.U |
| 52 | + |
| 53 | + val cycle_cnt = RegInit(0.U(64.W)) |
| 54 | + val instr_cnt = RegInit(0.U(64.W)) |
| 55 | + |
| 56 | + cycle_cnt := cycle_cnt + 1.U |
| 57 | + instr_cnt := instr_cnt + 1.U |
| 58 | + |
| 59 | + val rf_a0 = WireInit(0.U(64.W)) |
| 60 | + BoringUtils.addSink(rf_a0, "rf_a0") |
| 61 | + |
| 62 | + val dt_te = Module(new DifftestTrapEvent) |
| 63 | + dt_te.io.clock := clock |
| 64 | + dt_te.io.coreid := 0.U |
| 65 | + dt_te.io.valid := (fetch.io.inst === "h0000006b".U) |
| 66 | + dt_te.io.code := rf_a0(2, 0) |
| 67 | + dt_te.io.pc := fetch.io.pc |
| 68 | + dt_te.io.cycleCnt := cycle_cnt |
| 69 | + dt_te.io.instrCnt := instr_cnt |
| 70 | + |
| 71 | + val dt_cs = Module(new DifftestCSRState) |
| 72 | + dt_cs.io.clock := clock |
| 73 | + dt_cs.io.coreid := 0.U |
| 74 | + dt_cs.io.priviledgeMode := 3.U // Machine mode |
| 75 | + dt_cs.io.mstatus := 0.U |
| 76 | + dt_cs.io.sstatus := 0.U |
| 77 | + dt_cs.io.mepc := 0.U |
| 78 | + dt_cs.io.sepc := 0.U |
| 79 | + dt_cs.io.mtval := 0.U |
| 80 | + dt_cs.io.stval := 0.U |
| 81 | + dt_cs.io.mtvec := 0.U |
| 82 | + dt_cs.io.stvec := 0.U |
| 83 | + dt_cs.io.mcause := 0.U |
| 84 | + dt_cs.io.scause := 0.U |
| 85 | + dt_cs.io.satp := 0.U |
| 86 | + dt_cs.io.mip := 0.U |
| 87 | + dt_cs.io.mie := 0.U |
| 88 | + dt_cs.io.mscratch := 0.U |
| 89 | + dt_cs.io.sscratch := 0.U |
| 90 | + dt_cs.io.mideleg := 0.U |
| 91 | + dt_cs.io.medeleg := 0.U |
| 92 | +} |
0 commit comments