feat: 修改并成功生成无cache的axi
This commit is contained in:
parent
347def990a
commit
f229789a12
|
@ -1,161 +1,161 @@
|
||||||
package cpu
|
// package cpu
|
||||||
|
|
||||||
import chisel3._
|
// import chisel3._
|
||||||
import chisel3.util._
|
// import chisel3.util._
|
||||||
import chisel3.internal.DontCareBinding
|
// import chisel3.internal.DontCareBinding
|
||||||
|
|
||||||
import defines._
|
// import defines._
|
||||||
import defines.Const._
|
// import defines.Const._
|
||||||
import pipeline.fetch._
|
// import pipeline.fetch._
|
||||||
import pipeline.decoder._
|
// import pipeline.decoder._
|
||||||
import pipeline.execute._
|
// import pipeline.execute._
|
||||||
import pipeline.memory._
|
// import pipeline.memory._
|
||||||
import pipeline.writeback._
|
// import pipeline.writeback._
|
||||||
import ctrl._
|
// import ctrl._
|
||||||
import mmu._
|
// import mmu._
|
||||||
import chisel3.util.experimental.decode.decoder
|
// import chisel3.util.experimental.decode.decoder
|
||||||
import cpu.pipeline.fetch.InstFifo
|
// import cpu.pipeline.fetch.InstFifo
|
||||||
|
|
||||||
class Core(implicit val config: CpuConfig) extends Module {
|
// class Core(implicit val config: CpuConfig) extends Module {
|
||||||
val io = IO(new Bundle {
|
// val io = IO(new Bundle {
|
||||||
val ext_int = Input(UInt(6.W))
|
// val ext_int = Input(UInt(6.W))
|
||||||
val inst = new Cache_ICache()
|
// val inst = new Cache_ICache()
|
||||||
val data = new Cache_DCache()
|
// val data = new Cache_DCache()
|
||||||
val debug = new DEBUG()
|
// val debug = new DEBUG()
|
||||||
val statistic = if (!config.build) Some(new CPUStatistic()) else None
|
// val statistic = if (!config.build) Some(new CPUStatistic()) else None
|
||||||
})
|
// })
|
||||||
|
|
||||||
val ctrl = Module(new Ctrl()).io
|
// val ctrl = Module(new Ctrl()).io
|
||||||
val fetchUnit = Module(new FetchUnit()).io
|
// val fetchUnit = Module(new FetchUnit()).io
|
||||||
val bpu = Module(new BranchPredictorUnit()).io
|
// val bpu = Module(new BranchPredictorUnit()).io
|
||||||
val instFifo = Module(new InstFifo()).io
|
// val instFifo = Module(new InstFifo()).io
|
||||||
val decoderUnit = Module(new DecoderUnit()).io
|
// val decoderUnit = Module(new DecoderUnit()).io
|
||||||
val regfile = Module(new ARegFile()).io
|
// val regfile = Module(new ARegFile()).io
|
||||||
val executeStage = Module(new ExecuteStage()).io
|
// val executeStage = Module(new ExecuteStage()).io
|
||||||
val executeUnit = Module(new ExecuteUnit()).io
|
// val executeUnit = Module(new ExecuteUnit()).io
|
||||||
val cp0 = Module(new Cp0()).io
|
// val cp0 = Module(new Cp0()).io
|
||||||
val memoryStage = Module(new MemoryStage()).io
|
// val memoryStage = Module(new MemoryStage()).io
|
||||||
val memoryUnit = Module(new MemoryUnit()).io
|
// val memoryUnit = Module(new MemoryUnit()).io
|
||||||
val writeBackStage = Module(new WriteBackStage()).io
|
// val writeBackStage = Module(new WriteBackStage()).io
|
||||||
val writeBackUnit = Module(new WriteBackUnit()).io
|
// val writeBackUnit = Module(new WriteBackUnit()).io
|
||||||
|
|
||||||
ctrl.instFifo.has2insts := !(instFifo.empty || instFifo.almost_empty)
|
// ctrl.instFifo.has2insts := !(instFifo.empty || instFifo.almost_empty)
|
||||||
ctrl.decoderUnit <> decoderUnit.ctrl
|
// ctrl.decoderUnit <> decoderUnit.ctrl
|
||||||
ctrl.executeUnit <> executeUnit.ctrl
|
// ctrl.executeUnit <> executeUnit.ctrl
|
||||||
ctrl.memoryUnit <> memoryUnit.ctrl
|
// ctrl.memoryUnit <> memoryUnit.ctrl
|
||||||
ctrl.writeBackUnit <> writeBackUnit.ctrl
|
// ctrl.writeBackUnit <> writeBackUnit.ctrl
|
||||||
ctrl.cacheCtrl.iCache_stall := io.inst.icache_stall
|
// ctrl.cacheCtrl.iCache_stall := io.inst.icache_stall
|
||||||
ctrl.cacheCtrl.dCache_stall := io.data.dcache_stall
|
// ctrl.cacheCtrl.dCache_stall := io.data.dcache_stall
|
||||||
|
|
||||||
fetchUnit.memory <> memoryUnit.fetchUnit
|
// fetchUnit.memory <> memoryUnit.fetchUnit
|
||||||
fetchUnit.execute <> executeUnit.fetchUnit
|
// fetchUnit.execute <> executeUnit.fetchUnit
|
||||||
fetchUnit.decoder <> decoderUnit.fetchUnit
|
// fetchUnit.decoder <> decoderUnit.fetchUnit
|
||||||
fetchUnit.instFifo.full := instFifo.full
|
// fetchUnit.instFifo.full := instFifo.full
|
||||||
fetchUnit.iCache.inst_valid := io.inst.inst_valid
|
// fetchUnit.iCache.inst_valid := io.inst.inst_valid
|
||||||
io.inst.addr(0) := fetchUnit.iCache.pc
|
// io.inst.addr(0) := fetchUnit.iCache.pc
|
||||||
io.inst.addr(1) := fetchUnit.iCache.pc_next
|
// io.inst.addr(1) := fetchUnit.iCache.pc_next
|
||||||
for (i <- 2 until config.instFetchNum) {
|
// for (i <- 2 until config.instFetchNum) {
|
||||||
io.inst.addr(i) := fetchUnit.iCache.pc_next + ((i - 1) * 4).U
|
// io.inst.addr(i) := fetchUnit.iCache.pc_next + ((i - 1) * 4).U
|
||||||
}
|
// }
|
||||||
|
|
||||||
bpu.decoder.ena := ctrl.decoderUnit.allow_to_go
|
// bpu.decoder.ena := ctrl.decoderUnit.allow_to_go
|
||||||
bpu.decoder.op := decoderUnit.bpu.decoded_inst0.op
|
// bpu.decoder.op := decoderUnit.bpu.decoded_inst0.op
|
||||||
bpu.decoder.inst := decoderUnit.bpu.decoded_inst0.inst
|
// bpu.decoder.inst := decoderUnit.bpu.decoded_inst0.inst
|
||||||
bpu.decoder.rs1 := decoderUnit.bpu.decoded_inst0.reg1_raddr
|
// bpu.decoder.rs1 := decoderUnit.bpu.decoded_inst0.reg1_raddr
|
||||||
bpu.decoder.rs2 := decoderUnit.bpu.decoded_inst0.reg2_raddr
|
// bpu.decoder.rs2 := decoderUnit.bpu.decoded_inst0.reg2_raddr
|
||||||
bpu.decoder.pc := decoderUnit.bpu.pc
|
// bpu.decoder.pc := decoderUnit.bpu.pc
|
||||||
bpu.decoder.pc_plus4 := decoderUnit.bpu.pc + 4.U
|
// bpu.decoder.pc_plus4 := decoderUnit.bpu.pc + 4.U
|
||||||
bpu.decoder.pht_index := decoderUnit.bpu.pht_index
|
// bpu.decoder.pht_index := decoderUnit.bpu.pht_index
|
||||||
decoderUnit.bpu.update_pht_index := bpu.decoder.update_pht_index
|
// decoderUnit.bpu.update_pht_index := bpu.decoder.update_pht_index
|
||||||
bpu.execute <> executeUnit.bpu
|
// bpu.execute <> executeUnit.bpu
|
||||||
if (config.branchPredictor == "pesudo") {
|
// if (config.branchPredictor == "pesudo") {
|
||||||
bpu.regfile.get <> regfile.bpu.get
|
// bpu.regfile.get <> regfile.bpu.get
|
||||||
}
|
// }
|
||||||
decoderUnit.bpu.branch_inst := bpu.decoder.branch_inst
|
// decoderUnit.bpu.branch_inst := bpu.decoder.branch_inst
|
||||||
decoderUnit.bpu.pred_branch := bpu.decoder.pred_branch
|
// decoderUnit.bpu.pred_branch := bpu.decoder.pred_branch
|
||||||
decoderUnit.bpu.branch_target := bpu.decoder.branch_target
|
// decoderUnit.bpu.branch_target := bpu.decoder.branch_target
|
||||||
|
|
||||||
instFifo.do_flush := ctrl.decoderUnit.do_flush
|
// instFifo.do_flush := ctrl.decoderUnit.do_flush
|
||||||
instFifo.icache_stall := io.inst.icache_stall
|
// instFifo.icache_stall := io.inst.icache_stall
|
||||||
instFifo.jump_branch_inst := decoderUnit.instFifo.jump_branch_inst
|
// instFifo.jump_branch_inst := decoderUnit.instFifo.jump_branch_inst
|
||||||
instFifo.ren <> decoderUnit.instFifo.allow_to_go
|
// instFifo.ren <> decoderUnit.instFifo.allow_to_go
|
||||||
decoderUnit.instFifo.inst <> instFifo.read
|
// decoderUnit.instFifo.inst <> instFifo.read
|
||||||
|
|
||||||
for (i <- 0 until config.instFetchNum) {
|
// for (i <- 0 until config.instFetchNum) {
|
||||||
instFifo.write(i).pht_index := bpu.instBuffer.pht_index(i)
|
// instFifo.write(i).pht_index := bpu.instBuffer.pht_index(i)
|
||||||
bpu.instBuffer.pc(i) := instFifo.write(i).pc
|
// bpu.instBuffer.pc(i) := instFifo.write(i).pc
|
||||||
instFifo.wen(i) := io.inst.inst_valid(i)
|
// instFifo.wen(i) := io.inst.inst_valid(i)
|
||||||
instFifo.write(i).pc := io.inst.addr(0) + (i * 4).U
|
// instFifo.write(i).pc := io.inst.addr(0) + (i * 4).U
|
||||||
instFifo.write(i).inst := io.inst.inst(i)
|
// instFifo.write(i).inst := io.inst.inst(i)
|
||||||
}
|
// }
|
||||||
|
|
||||||
decoderUnit.instFifo.info.empty := instFifo.empty
|
// decoderUnit.instFifo.info.empty := instFifo.empty
|
||||||
decoderUnit.instFifo.info.almost_empty := instFifo.almost_empty
|
// decoderUnit.instFifo.info.almost_empty := instFifo.almost_empty
|
||||||
decoderUnit.regfile <> regfile.read
|
// decoderUnit.regfile <> regfile.read
|
||||||
for (i <- 0 until (config.fuNum)) {
|
// for (i <- 0 until (config.fuNum)) {
|
||||||
decoderUnit.forward(i).exe := executeUnit.decoderUnit.forward(i).exe
|
// decoderUnit.forward(i).exe := executeUnit.decoderUnit.forward(i).exe
|
||||||
decoderUnit.forward(i).mem_wreg := executeUnit.decoderUnit.forward(i).exe_mem_wreg
|
// decoderUnit.forward(i).mem_wreg := executeUnit.decoderUnit.forward(i).exe_mem_wreg
|
||||||
decoderUnit.forward(i).mem := memoryUnit.decoderUnit(i)
|
// decoderUnit.forward(i).mem := memoryUnit.decoderUnit(i)
|
||||||
}
|
// }
|
||||||
decoderUnit.cp0 <> cp0.decoderUnit
|
// decoderUnit.cp0 <> cp0.decoderUnit
|
||||||
decoderUnit.executeStage <> executeStage.decoderUnit
|
// decoderUnit.executeStage <> executeStage.decoderUnit
|
||||||
|
|
||||||
executeStage.ctrl.clear(0) := ctrl.memoryUnit.flush_req ||
|
// executeStage.ctrl.clear(0) := ctrl.memoryUnit.flush_req ||
|
||||||
!decoderUnit.executeStage.inst0.ex.bd && ctrl.executeUnit.do_flush && ctrl.executeUnit.allow_to_go ||
|
// !decoderUnit.executeStage.inst0.ex.bd && ctrl.executeUnit.do_flush && ctrl.executeUnit.allow_to_go ||
|
||||||
!ctrl.decoderUnit.allow_to_go && ctrl.executeUnit.allow_to_go
|
// !ctrl.decoderUnit.allow_to_go && ctrl.executeUnit.allow_to_go
|
||||||
executeStage.ctrl.clear(1) := ctrl.memoryUnit.flush_req ||
|
// executeStage.ctrl.clear(1) := ctrl.memoryUnit.flush_req ||
|
||||||
(ctrl.executeUnit.do_flush && decoderUnit.executeStage.inst1.allow_to_go) ||
|
// (ctrl.executeUnit.do_flush && decoderUnit.executeStage.inst1.allow_to_go) ||
|
||||||
(ctrl.executeUnit.allow_to_go && !decoderUnit.executeStage.inst1.allow_to_go)
|
// (ctrl.executeUnit.allow_to_go && !decoderUnit.executeStage.inst1.allow_to_go)
|
||||||
executeStage.ctrl.inst0_allow_to_go := ctrl.executeUnit.allow_to_go
|
// executeStage.ctrl.inst0_allow_to_go := ctrl.executeUnit.allow_to_go
|
||||||
|
|
||||||
executeUnit.decoderUnit.inst0_bd := decoderUnit.executeStage.inst0.ex.bd
|
// executeUnit.decoderUnit.inst0_bd := decoderUnit.executeStage.inst0.ex.bd
|
||||||
executeUnit.executeStage <> executeStage.executeUnit
|
// executeUnit.executeStage <> executeStage.executeUnit
|
||||||
executeUnit.cp0 <> cp0.executeUnit
|
// executeUnit.cp0 <> cp0.executeUnit
|
||||||
executeUnit.memoryStage <> memoryStage.executeUnit
|
// executeUnit.memoryStage <> memoryStage.executeUnit
|
||||||
|
|
||||||
cp0.ctrl.exe_stall := !ctrl.executeUnit.allow_to_go
|
// cp0.ctrl.exe_stall := !ctrl.executeUnit.allow_to_go
|
||||||
cp0.ctrl.mem_stall := !ctrl.memoryUnit.allow_to_go
|
// cp0.ctrl.mem_stall := !ctrl.memoryUnit.allow_to_go
|
||||||
cp0.ext_int := io.ext_int
|
// cp0.ext_int := io.ext_int
|
||||||
|
|
||||||
|
|
||||||
memoryStage.ctrl.allow_to_go := ctrl.memoryUnit.allow_to_go
|
// memoryStage.ctrl.allow_to_go := ctrl.memoryUnit.allow_to_go
|
||||||
memoryStage.ctrl.clear := ctrl.memoryUnit.do_flush
|
// memoryStage.ctrl.clear := ctrl.memoryUnit.do_flush
|
||||||
|
|
||||||
memoryUnit.memoryStage <> memoryStage.memoryUnit
|
// memoryUnit.memoryStage <> memoryStage.memoryUnit
|
||||||
memoryUnit.cp0 <> cp0.memoryUnit
|
// memoryUnit.cp0 <> cp0.memoryUnit
|
||||||
memoryUnit.writeBackStage <> writeBackStage.memoryUnit
|
// memoryUnit.writeBackStage <> writeBackStage.memoryUnit
|
||||||
|
|
||||||
memoryUnit.dataMemory.in.rdata := io.data.rdata
|
// memoryUnit.dataMemory.in.rdata := io.data.rdata
|
||||||
io.data.en := memoryUnit.dataMemory.out.en
|
// io.data.en := memoryUnit.dataMemory.out.en
|
||||||
io.data.rlen := memoryUnit.dataMemory.out.rlen
|
// io.data.rlen := memoryUnit.dataMemory.out.rlen
|
||||||
io.data.wen := memoryUnit.dataMemory.out.wen
|
// io.data.wen := memoryUnit.dataMemory.out.wen
|
||||||
io.data.wdata := memoryUnit.dataMemory.out.wdata
|
// io.data.wdata := memoryUnit.dataMemory.out.wdata
|
||||||
io.data.addr := memoryUnit.dataMemory.out.addr
|
// io.data.addr := memoryUnit.dataMemory.out.addr
|
||||||
|
|
||||||
writeBackStage.memoryUnit <> memoryUnit.writeBackStage
|
// writeBackStage.memoryUnit <> memoryUnit.writeBackStage
|
||||||
writeBackStage.ctrl.allow_to_go := ctrl.writeBackUnit.allow_to_go
|
// writeBackStage.ctrl.allow_to_go := ctrl.writeBackUnit.allow_to_go
|
||||||
writeBackStage.ctrl.clear := ctrl.writeBackUnit.do_flush
|
// writeBackStage.ctrl.clear := ctrl.writeBackUnit.do_flush
|
||||||
|
|
||||||
writeBackUnit.writeBackStage <> writeBackStage.writeBackUnit
|
// writeBackUnit.writeBackStage <> writeBackStage.writeBackUnit
|
||||||
writeBackUnit.ctrl <> ctrl.writeBackUnit
|
// writeBackUnit.ctrl <> ctrl.writeBackUnit
|
||||||
regfile.write <> writeBackUnit.regfile
|
// regfile.write <> writeBackUnit.regfile
|
||||||
|
|
||||||
io.debug <> writeBackUnit.debug
|
// io.debug <> writeBackUnit.debug
|
||||||
|
|
||||||
io.inst.fence := executeUnit.executeStage.inst0.inst_info.ifence
|
// io.inst.fence := executeUnit.executeStage.inst0.inst_info.ifence
|
||||||
io.inst.fence_addr := executeUnit.executeStage.inst0.inst_info.mem_addr
|
// io.inst.fence_addr := executeUnit.executeStage.inst0.inst_info.mem_addr
|
||||||
io.data.fence := memoryUnit.memoryStage.inst0.inst_info.dfence
|
// io.data.fence := memoryUnit.memoryStage.inst0.inst_info.dfence
|
||||||
io.data.fence_addr := memoryUnit.memoryStage.inst0.inst_info.mem_addr
|
// io.data.fence_addr := memoryUnit.memoryStage.inst0.inst_info.mem_addr
|
||||||
io.data.execute_addr := executeUnit.memoryStage.inst0.mem.addr
|
// io.data.execute_addr := executeUnit.memoryStage.inst0.mem.addr
|
||||||
io.inst.req := !instFifo.full
|
// io.inst.req := !instFifo.full
|
||||||
io.inst.cpu_stall := !ctrl.fetchUnit.allow_to_go
|
// io.inst.cpu_stall := !ctrl.fetchUnit.allow_to_go
|
||||||
io.data.cpu_stall := !ctrl.memoryUnit.allow_to_go
|
// io.data.cpu_stall := !ctrl.memoryUnit.allow_to_go
|
||||||
|
|
||||||
// ===----------------------------------------------------------------===
|
// // ===----------------------------------------------------------------===
|
||||||
// statistic
|
// // statistic
|
||||||
// ===----------------------------------------------------------------===
|
// // ===----------------------------------------------------------------===
|
||||||
if (!config.build) {
|
// if (!config.build) {
|
||||||
io.statistic.get.soc <> writeBackUnit.statistic.get
|
// io.statistic.get.soc <> writeBackUnit.statistic.get
|
||||||
io.statistic.get.bpu <> executeUnit.statistic.get
|
// io.statistic.get.bpu <> executeUnit.statistic.get
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
|
@ -21,12 +21,4 @@ class PuaMips extends Module {
|
||||||
io.ext_int <> core.io.ext_int
|
io.ext_int <> core.io.ext_int
|
||||||
io.debug <> core.io.debug
|
io.debug <> core.io.debug
|
||||||
io.axi <> cache.io.axi
|
io.axi <> cache.io.axi
|
||||||
|
|
||||||
// ===----------------------------------------------------------------===
|
|
||||||
// statistic
|
|
||||||
// ===----------------------------------------------------------------===
|
|
||||||
if (!config.build) {
|
|
||||||
io.statistic.get.cpu <> core.io.statistic.get
|
|
||||||
io.statistic.get.cache <> cache.io.statistic.get
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,6 @@ package cache
|
||||||
import chisel3._
|
import chisel3._
|
||||||
import chisel3.util._
|
import chisel3.util._
|
||||||
import cpu.defines._
|
import cpu.defines._
|
||||||
import cpu.CacheConfig
|
|
||||||
import cpu.CpuConfig
|
import cpu.CpuConfig
|
||||||
|
|
||||||
class Cache(implicit config: CpuConfig) extends Module {
|
class Cache(implicit config: CpuConfig) extends Module {
|
||||||
|
@ -11,13 +10,10 @@ class Cache(implicit config: CpuConfig) extends Module {
|
||||||
val inst = Flipped(new Cache_ICache())
|
val inst = Flipped(new Cache_ICache())
|
||||||
val data = Flipped(new Cache_DCache())
|
val data = Flipped(new Cache_DCache())
|
||||||
val axi = new AXI()
|
val axi = new AXI()
|
||||||
val statistic = if (!config.build) Some(new CacheStatistic()) else None
|
|
||||||
})
|
})
|
||||||
implicit val iCacheConfig = CacheConfig(nset = 64, nbank = 4, bankWidth = 16)
|
|
||||||
implicit val dCacheConfig = CacheConfig(nset = 128, bankWidth = 4)
|
|
||||||
|
|
||||||
val icache = Module(new ICache(iCacheConfig))
|
val icache = Module(new ICache())
|
||||||
val dcache = Module(new DCache(dCacheConfig))
|
val dcache = Module(new DCache())
|
||||||
val axi_interface = Module(new CacheAXIInterface())
|
val axi_interface = Module(new CacheAXIInterface())
|
||||||
|
|
||||||
icache.io.axi <> axi_interface.io.icache
|
icache.io.axi <> axi_interface.io.icache
|
||||||
|
@ -26,12 +22,4 @@ class Cache(implicit config: CpuConfig) extends Module {
|
||||||
io.inst <> icache.io.cpu
|
io.inst <> icache.io.cpu
|
||||||
io.data <> dcache.io.cpu
|
io.data <> dcache.io.cpu
|
||||||
io.axi <> axi_interface.io.axi
|
io.axi <> axi_interface.io.axi
|
||||||
|
|
||||||
// ===----------------------------------------------------------------===
|
|
||||||
// statistic
|
|
||||||
// ===----------------------------------------------------------------===
|
|
||||||
if (!config.build) {
|
|
||||||
io.statistic.get.icache <> icache.io.statistic.get
|
|
||||||
io.statistic.get.dcache <> dcache.io.statistic.get
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ class CacheAXIInterface extends Module {
|
||||||
// we need to lock ar to avoid signals change during handshake
|
// we need to lock ar to avoid signals change during handshake
|
||||||
val ar_sel_lock = RegInit(false.B)
|
val ar_sel_lock = RegInit(false.B)
|
||||||
val ar_sel_val = RegInit(false.B)
|
val ar_sel_val = RegInit(false.B)
|
||||||
val ar_sel = Mux(ar_sel_lock, ar_sel_val, io.dcache.ar.valid)
|
val ar_sel = Mux(ar_sel_lock, ar_sel_val, !io.icache.ar.valid && io.dcache.ar.valid)
|
||||||
|
|
||||||
when(io.axi.ar.valid) {
|
when(io.axi.ar.valid) {
|
||||||
when(io.axi.ar.ready) {
|
when(io.axi.ar.ready) {
|
||||||
|
|
|
@ -9,7 +9,7 @@ import cpu.defines._
|
||||||
import cpu.CpuConfig
|
import cpu.CpuConfig
|
||||||
import cpu.defines.Const._
|
import cpu.defines.Const._
|
||||||
|
|
||||||
class DCache(cacheConfig: CacheConfig)(implicit config: CpuConfig) extends Module {
|
class DCache(implicit config: CpuConfig) extends Module {
|
||||||
val io = IO(new Bundle {
|
val io = IO(new Bundle {
|
||||||
val cpu = Flipped(new Cache_DCache())
|
val cpu = Flipped(new Cache_DCache())
|
||||||
val axi = new DCache_AXIInterface()
|
val axi = new DCache_AXIInterface()
|
||||||
|
@ -34,24 +34,36 @@ class DCache(cacheConfig: CacheConfig)(implicit config: CpuConfig) extends Modul
|
||||||
val addr_err = io.cpu.addr(63, 32).orR
|
val addr_err = io.cpu.addr(63, 32).orR
|
||||||
|
|
||||||
// default
|
// default
|
||||||
|
io.axi.aw.id := 1.U
|
||||||
io.axi.aw.addr := 0.U
|
io.axi.aw.addr := 0.U
|
||||||
io.axi.aw.len := 0.U
|
io.axi.aw.len := 0.U
|
||||||
io.axi.aw.size := 0.U
|
io.axi.aw.size := 0.U
|
||||||
io.axi.aw.burst := BURST_FIXED.U
|
io.axi.aw.burst := BURST_FIXED.U
|
||||||
io.axi.aw.valid := 0.U
|
io.axi.aw.valid := 0.U
|
||||||
|
io.axi.aw.prot := 0.U
|
||||||
|
io.axi.aw.lock := 0.U
|
||||||
|
io.axi.aw.cache := 0.U
|
||||||
|
io.axi.w.id := 1.U
|
||||||
io.axi.w.data := 0.U
|
io.axi.w.data := 0.U
|
||||||
io.axi.w.strb := 0.U
|
io.axi.w.strb := 0.U
|
||||||
io.axi.w.last := 1.U
|
io.axi.w.last := 1.U
|
||||||
io.axi.w.valid := 0.U
|
io.axi.w.valid := 0.U
|
||||||
io.axi.b.ready := 1.U
|
io.axi.b.ready := 1.U
|
||||||
|
io.axi.ar.id := 1.U
|
||||||
io.axi.ar.addr := 0.U
|
io.axi.ar.addr := 0.U
|
||||||
io.axi.ar.len := 0.U
|
io.axi.ar.len := 0.U
|
||||||
io.axi.ar.size := 0.U
|
io.axi.ar.size := 0.U
|
||||||
io.axi.ar.burst := BURST_FIXED.U
|
io.axi.ar.burst := BURST_FIXED.U
|
||||||
io.axi.ar.valid := 0.U
|
val arvalid = RegInit(false.B)
|
||||||
io.axi.r.ready := 1.U
|
io.axi.ar.valid := arvalid
|
||||||
|
io.axi.ar.prot := 0.U
|
||||||
|
io.axi.ar.cache := 0.U
|
||||||
|
io.axi.ar.lock := 0.U
|
||||||
|
io.axi.r.ready := true.B
|
||||||
io.cpu.rdata := 0.U
|
io.cpu.rdata := 0.U
|
||||||
|
|
||||||
|
io.cpu.acc_err := false.B
|
||||||
|
|
||||||
switch(status) {
|
switch(status) {
|
||||||
is(s_idle) {
|
is(s_idle) {
|
||||||
when(io.cpu.en) {
|
when(io.cpu.en) {
|
||||||
|
@ -70,7 +82,7 @@ class DCache(cacheConfig: CacheConfig)(implicit config: CpuConfig) extends Modul
|
||||||
}.otherwise {
|
}.otherwise {
|
||||||
io.axi.ar.addr := io.cpu.addr(31, 0)
|
io.axi.ar.addr := io.cpu.addr(31, 0)
|
||||||
io.axi.ar.size := Cat(false.B, io.cpu.size)
|
io.axi.ar.size := Cat(false.B, io.cpu.size)
|
||||||
io.axi.ar.valid := true.B
|
arvalid := true.B
|
||||||
status := s_read
|
status := s_read
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,7 +90,7 @@ class DCache(cacheConfig: CacheConfig)(implicit config: CpuConfig) extends Modul
|
||||||
}
|
}
|
||||||
is(s_read) {
|
is(s_read) {
|
||||||
when(io.axi.ar.ready) {
|
when(io.axi.ar.ready) {
|
||||||
io.axi.ar.valid := false.B
|
arvalid := false.B
|
||||||
}
|
}
|
||||||
when(io.axi.r.valid) {
|
when(io.axi.r.valid) {
|
||||||
io.cpu.rdata := io.axi.r.data
|
io.cpu.rdata := io.axi.r.data
|
||||||
|
@ -117,7 +129,7 @@ class DCache(cacheConfig: CacheConfig)(implicit config: CpuConfig) extends Modul
|
||||||
}.otherwise {
|
}.otherwise {
|
||||||
io.axi.ar.addr := io.cpu.addr(31, 0)
|
io.axi.ar.addr := io.cpu.addr(31, 0)
|
||||||
io.axi.ar.size := Cat(false.B, io.cpu.size)
|
io.axi.ar.size := Cat(false.B, io.cpu.size)
|
||||||
io.axi.ar.valid := true.B
|
arvalid := true.B
|
||||||
status := s_read
|
status := s_read
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,11 +21,16 @@ class ICache(implicit config: CpuConfig) extends Module {
|
||||||
val addr_err = io.cpu.addr.orR
|
val addr_err = io.cpu.addr.orR
|
||||||
|
|
||||||
// default
|
// default
|
||||||
|
io.axi.ar.id := 0.U
|
||||||
io.axi.ar.addr := 0.U
|
io.axi.ar.addr := 0.U
|
||||||
io.axi.ar.len := 0.U
|
io.axi.ar.len := 0.U
|
||||||
io.axi.ar.size := 2.U
|
io.axi.ar.size := 2.U
|
||||||
|
io.axi.ar.lock := 0.U
|
||||||
io.axi.ar.burst := BURST_FIXED.U
|
io.axi.ar.burst := BURST_FIXED.U
|
||||||
io.axi.ar.valid := false.B
|
val arvalid = RegInit(false.B)
|
||||||
|
io.axi.ar.valid := arvalid
|
||||||
|
io.axi.ar.prot := 0.U
|
||||||
|
io.axi.ar.cache := 0.U
|
||||||
io.axi.r.ready := true.B
|
io.axi.r.ready := true.B
|
||||||
io.cpu.rdata := 0.U
|
io.cpu.rdata := 0.U
|
||||||
io.cpu.acc_err := false.B
|
io.cpu.acc_err := false.B
|
||||||
|
@ -38,14 +43,14 @@ class ICache(implicit config: CpuConfig) extends Module {
|
||||||
status := s_finishwait
|
status := s_finishwait
|
||||||
}.otherwise {
|
}.otherwise {
|
||||||
io.axi.ar.addr := Cat(io.cpu.addr(31, 2), 0.U(2.W))
|
io.axi.ar.addr := Cat(io.cpu.addr(31, 2), 0.U(2.W))
|
||||||
io.axi.ar.valid := true.B
|
arvalid := true.B
|
||||||
status := s_read
|
status := s_read
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is(s_read) {
|
is(s_read) {
|
||||||
when(io.axi.ar.ready) {
|
when(io.axi.ar.ready) {
|
||||||
io.axi.ar.valid := false.B
|
arvalid := false.B
|
||||||
}
|
}
|
||||||
when(io.axi.r.valid) {
|
when(io.axi.r.valid) {
|
||||||
io.cpu.rdata := Mux(io.axi.ar.addr(2), io.axi.r.data(63, 32), io.axi.r.data(31, 0))
|
io.cpu.rdata := Mux(io.axi.ar.addr(2), io.axi.r.data(63, 32), io.axi.r.data(31, 0))
|
||||||
|
@ -62,7 +67,7 @@ class ICache(implicit config: CpuConfig) extends Module {
|
||||||
status := s_finishwait
|
status := s_finishwait
|
||||||
}.otherwise {
|
}.otherwise {
|
||||||
io.axi.ar.addr := Cat(io.cpu.addr(31, 2), 0.U(2.W))
|
io.axi.ar.addr := Cat(io.cpu.addr(31, 2), 0.U(2.W))
|
||||||
io.axi.ar.valid := true.B
|
arvalid := true.B
|
||||||
status := s_read
|
status := s_read
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -163,7 +163,7 @@ class R extends Bundle {
|
||||||
val ready = Output(Bool())
|
val ready = Output(Bool())
|
||||||
|
|
||||||
val id = Input(UInt(4.W))
|
val id = Input(UInt(4.W))
|
||||||
val data = Input(UInt(32.W))
|
val data = Input(UInt(DATA_WID.W))
|
||||||
val resp = Input(UInt(2.W))
|
val resp = Input(UInt(2.W))
|
||||||
val last = Input(Bool())
|
val last = Input(Bool())
|
||||||
val valid = Input(Bool())
|
val valid = Input(Bool())
|
||||||
|
@ -185,7 +185,7 @@ class AW extends Bundle {
|
||||||
|
|
||||||
class W extends Bundle {
|
class W extends Bundle {
|
||||||
val id = Output(UInt(4.W))
|
val id = Output(UInt(4.W))
|
||||||
val data = Output(UInt(32.W))
|
val data = Output(UInt(DATA_WID.W))
|
||||||
val strb = Output(UInt(4.W))
|
val strb = Output(UInt(4.W))
|
||||||
val last = Output(Bool())
|
val last = Output(Bool())
|
||||||
val valid = Output(Bool())
|
val valid = Output(Bool())
|
||||||
|
@ -206,7 +206,7 @@ class ICache_AXIInterface extends Bundle {
|
||||||
val r = new R()
|
val r = new R()
|
||||||
}
|
}
|
||||||
|
|
||||||
class DCache_AXIInterface extends ICache_AXIInterface {
|
class DCache_AXIInterface extends Bundle {
|
||||||
val aw = new AW()
|
val aw = new AW()
|
||||||
val w = new W()
|
val w = new W()
|
||||||
val b = new B()
|
val b = new B()
|
||||||
|
@ -220,59 +220,13 @@ class Cache_AXIInterface extends Bundle {
|
||||||
val dcache = new DCache_AXIInterface()
|
val dcache = new DCache_AXIInterface()
|
||||||
}
|
}
|
||||||
|
|
||||||
// AXI read address channel
|
|
||||||
class AXI_AR extends Bundle {
|
|
||||||
val id = UInt(4.W) // transaction ID
|
|
||||||
val addr = UInt(32.W) // address
|
|
||||||
val len = UInt(8.W) // burst length
|
|
||||||
val size = UInt(3.W) // transfer size
|
|
||||||
val burst = UInt(2.W) // burst type
|
|
||||||
val lock = UInt(2.W) // lock type
|
|
||||||
val cache = UInt(4.W) // cache type
|
|
||||||
val prot = UInt(3.W) // protection type
|
|
||||||
}
|
|
||||||
|
|
||||||
// AXI read data channel
|
|
||||||
class AXI_R extends Bundle {
|
|
||||||
val id = UInt(4.W) // transaction ID
|
|
||||||
val data = UInt(32.W) // read data
|
|
||||||
val resp = UInt(2.W) // response type
|
|
||||||
val last = Bool() // last beat of burst
|
|
||||||
}
|
|
||||||
|
|
||||||
// AXI write address channel
|
|
||||||
class AXI_AW extends Bundle {
|
|
||||||
val id = UInt(4.W) // transaction ID
|
|
||||||
val addr = UInt(32.W) // address
|
|
||||||
val len = UInt(8.W) // burst length
|
|
||||||
val size = UInt(3.W) // transfer size
|
|
||||||
val burst = UInt(2.W) // burst type
|
|
||||||
val lock = UInt(2.W) // lock type
|
|
||||||
val cache = UInt(4.W) // cache type
|
|
||||||
val prot = UInt(3.W) // protection type
|
|
||||||
}
|
|
||||||
|
|
||||||
// AXI write data channel
|
|
||||||
class AXI_W extends Bundle {
|
|
||||||
val id = UInt(4.W) // transaction ID
|
|
||||||
val data = UInt(32.W) // write data
|
|
||||||
val strb = UInt(4.W) // byte enable
|
|
||||||
val last = Bool() // last beat of burst
|
|
||||||
}
|
|
||||||
|
|
||||||
// AXI write response channel
|
|
||||||
class AXI_B extends Bundle {
|
|
||||||
val id = UInt(4.W) // transaction ID
|
|
||||||
val resp = UInt(2.W) // response type
|
|
||||||
}
|
|
||||||
|
|
||||||
// AXI interface
|
// AXI interface
|
||||||
class AXI extends Bundle {
|
class AXI extends Bundle {
|
||||||
val ar = Decoupled(new AXI_AR()) // read address channel
|
val ar = new AR() // read address channel
|
||||||
val r = Flipped(Decoupled(new AXI_R())) // read data channel
|
val r = new R() // read data channel
|
||||||
val aw = Decoupled(new AXI_AW()) // write address channel
|
val aw = new AW() // write address channel
|
||||||
val w = Decoupled(new AXI_W()) // write data channel
|
val w = new W() // write data channel
|
||||||
val b = Flipped(Decoupled(new AXI_B())) // write response channel
|
val b = new B() // write response channel
|
||||||
}
|
}
|
||||||
|
|
||||||
class DEBUG(implicit config: CpuConfig) extends Bundle {
|
class DEBUG(implicit config: CpuConfig) extends Bundle {
|
||||||
|
|
|
@ -7,11 +7,13 @@ import cpu.CpuConfig
|
||||||
|
|
||||||
trait Constants {
|
trait Constants {
|
||||||
val config = new CpuConfig
|
val config = new CpuConfig
|
||||||
|
val XLEN = 64
|
||||||
// 全局
|
// 全局
|
||||||
val PC_WID = 64
|
val PC_WID = XLEN
|
||||||
val PC_INIT = "h60000000".U(PC_WID.W)
|
val PC_INIT = "h60000000".U(PC_WID.W)
|
||||||
|
|
||||||
val EXT_INT_WID = 6
|
val EXT_INT_WID = 6
|
||||||
|
val HILO_WID = 64
|
||||||
|
|
||||||
val WRITE_ENABLE = true.B
|
val WRITE_ENABLE = true.B
|
||||||
val WRITE_DISABLE = false.B
|
val WRITE_DISABLE = false.B
|
||||||
|
@ -151,7 +153,7 @@ trait Constants {
|
||||||
// GPR RegFile
|
// GPR RegFile
|
||||||
val AREG_NUM = 32
|
val AREG_NUM = 32
|
||||||
val REG_ADDR_WID = 5
|
val REG_ADDR_WID = 5
|
||||||
val DATA_WID = 64
|
val DATA_WID = XLEN
|
||||||
|
|
||||||
// CP0寄存器
|
// CP0寄存器
|
||||||
// CP0 Register (5.w), Select (3.w)
|
// CP0 Register (5.w), Select (3.w)
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import cpu._
|
import cpu._
|
||||||
import circt.stage._
|
import circt.stage._
|
||||||
import cache.CacheAXIInterface
|
import cache.Cache
|
||||||
|
|
||||||
object TestMain extends App {
|
object TestMain extends App {
|
||||||
implicit val config = new CpuConfig()
|
implicit val config = new CpuConfig()
|
||||||
def top = new CacheAXIInterface()
|
def top = new Cache()
|
||||||
val useMFC = false // use MLIR-based firrtl compiler
|
val useMFC = false // use MLIR-based firrtl compiler
|
||||||
val generator = Seq(chisel3.stage.ChiselGeneratorAnnotation(() => top))
|
val generator = Seq(chisel3.stage.ChiselGeneratorAnnotation(() => top))
|
||||||
if (useMFC) {
|
if (useMFC) {
|
||||||
|
|
Loading…
Reference in New Issue