增加sfence.vma

This commit is contained in:
Liphen 2024-01-15 14:59:55 +08:00
parent 2f3ff6e5dd
commit cd4345690b
5 changed files with 80 additions and 16 deletions

View File

@ -40,6 +40,7 @@ class Core(implicit val cpuConfig: CpuConfig) extends Module {
tlb.icache <> io.inst.tlb tlb.icache <> io.inst.tlb
tlb.dcache <> io.data.tlb tlb.dcache <> io.data.tlb
tlb.csr <> csr.tlb tlb.csr <> csr.tlb
tlb.sfence_vma <> memoryUnit.ctrl.sfence_vma
ctrl.decodeUnit <> decodeUnit.ctrl ctrl.decodeUnit <> decodeUnit.ctrl
ctrl.executeUnit <> executeUnit.ctrl ctrl.executeUnit <> executeUnit.ctrl

View File

@ -49,13 +49,10 @@ class Tlb_DCache extends Tlb_ICache {
class Tlb extends Module with HasTlbConst with HasCSRConst { class Tlb extends Module with HasTlbConst with HasCSRConst {
val io = IO(new Bundle { val io = IO(new Bundle {
val icache = new Tlb_ICache() val icache = new Tlb_ICache()
val dcache = new Tlb_DCache() val dcache = new Tlb_DCache()
val csr = Flipped(new CsrTlb()) val csr = Flipped(new CsrTlb())
// val fence_vma = Input(new Bundle { val sfence_vma = Input(new MouTlb())
// val src1 = UInt(XLEN.W)
// val src2 = UInt(XLEN.W)
// })
}) })
val satp = io.csr.satp.asTypeOf(satpBundle) val satp = io.csr.satp.asTypeOf(satpBundle)
@ -302,6 +299,58 @@ class Tlb extends Module with HasTlbConst with HasCSRConst {
} }
} }
val src1 = io.sfence_vma.src_info.src1_data
val src2 = io.sfence_vma.src_info.src2_data
when(io.sfence_vma.valid) {
when(!src1.orR && !src2.orR) {
// 将所有tlb的有效位置为0
itlb.flag.v := false.B
dtlb.flag.v := false.B
for (i <- 0 until cpuConfig.tlbEntries) {
tlbl2(i).flag.v := false.B
}
}.elsewhen(!src1.orR && src2.orR) {
// 将asid一致的且g不为1的tlb的有效位置为0
when(itlb.asid === src2 && !itlb.flag.g) {
itlb.flag.v := false.B
}
when(dtlb.asid === src2 && !dtlb.flag.g) {
dtlb.flag.v := false.B
}
for (i <- 0 until cpuConfig.tlbEntries) {
when(tlbl2(i).asid === src2 && !tlbl2(i).flag.g) {
tlbl2(i).flag.v := false.B
}
}
}.elsewhen(src1.orR && !src2.orR) {
// 将vpn一致的tlb的有效位置为0
when(itlb.vpn === src1) {
itlb.flag.v := false.B
}
when(dtlb.vpn === src1) {
dtlb.flag.v := false.B
}
for (i <- 0 until cpuConfig.tlbEntries) {
when(tlbl2(i).vpn === src1) {
tlbl2(i).flag.v := false.B
}
}
}.elsewhen(src1.orR && src2.orR) {
// 将asid一致的且vpn一致的tlb的有效位置为0g为1的除外
when(itlb.asid === src2 && itlb.vpn === src1 && !itlb.flag.g) {
itlb.flag.v := false.B
}
when(dtlb.asid === src2 && dtlb.vpn === src1 && !dtlb.flag.g) {
dtlb.flag.v := false.B
}
for (i <- 0 until cpuConfig.tlbEntries) {
when(tlbl2(i).asid === src2 && tlbl2(i).vpn === src1 && !tlbl2(i).flag.g) {
tlbl2(i).flag.v := false.B
}
}
}
}
io.icache.uncached := AddressSpace.isMMIO(io.icache.addr) io.icache.uncached := AddressSpace.isMMIO(io.icache.addr)
io.icache.ptag := Mux(vm_enabled, itlb.ppn, io.icache.addr(PADDR_WID - 1, pageOffsetLen)) io.icache.ptag := Mux(vm_enabled, itlb.ppn, io.icache.addr(PADDR_WID - 1, pageOffsetLen))
io.icache.paddr := Cat(io.icache.ptag, io.icache.addr(pageOffsetLen - 1, 0)) io.icache.paddr := Cat(io.icache.ptag, io.icache.addr(pageOffsetLen - 1, 0))

View File

@ -6,6 +6,7 @@ import cpu.defines._
import cpu.defines.Const._ import cpu.defines.Const._
import cpu.CpuConfig import cpu.CpuConfig
import icache.mmu.{Tlb_DCache, Tlb_ICache} import icache.mmu.{Tlb_DCache, Tlb_ICache}
import cpu.pipeline.memory.Mou
class ExceptionInfo extends Bundle { class ExceptionInfo extends Bundle {
val exception = Vec(EXC_WID, Bool()) val exception = Vec(EXC_WID, Bool())
@ -88,6 +89,11 @@ class ExecuteCtrl(implicit val cpuConfig: CpuConfig) extends Bundle {
val fu = new ExecuteFuCtrl() val fu = new ExecuteFuCtrl()
} }
class MouTlb extends Bundle {
val valid = Bool()
val src_info = new SrcInfo()
}
class MemoryCtrl extends Bundle { class MemoryCtrl extends Bundle {
val flush = Output(Bool()) val flush = Output(Bool())
val mem_stall = Output(Bool()) val mem_stall = Output(Bool())
@ -98,6 +104,8 @@ class MemoryCtrl extends Bundle {
// to cache // to cache
val fence_i = Output(Bool()) val fence_i = Output(Bool())
val complete_single_request = Output(Bool()) // to dcache val complete_single_request = Output(Bool()) // to dcache
// to tlb
val sfence_vma = Output(new MouTlb())
} }
class WriteBackCtrl extends Bundle { class WriteBackCtrl extends Bundle {

View File

@ -17,7 +17,7 @@ class MemoryUnit(implicit val cpuConfig: CpuConfig) extends Module {
val flush = Bool() val flush = Bool()
val target = UInt(XLEN.W) val target = UInt(XLEN.W)
}) })
val decodeUnit = Output(Vec(cpuConfig.commitNum, new RegWrite())) val decodeUnit = Output(Vec(cpuConfig.commitNum, new RegWrite()))
val csr = Flipped(new CsrMemoryUnit()) val csr = Flipped(new CsrMemoryUnit())
val writeBackStage = Output(new MemoryUnitWriteBackUnit()) val writeBackStage = Output(new MemoryUnitWriteBackUnit())
val dataMemory = new Lsu_DataMemory() val dataMemory = new Lsu_DataMemory()
@ -128,6 +128,9 @@ class MemoryUnit(implicit val cpuConfig: CpuConfig) extends Module {
io.ctrl.fence_i := mou.out.fence_i io.ctrl.fence_i := mou.out.fence_i
io.ctrl.complete_single_request := lsu.memoryUnit.out.complete_single_request io.ctrl.complete_single_request := lsu.memoryUnit.out.complete_single_request
io.ctrl.sfence_vma.valid := mou.out.sfence_vma
io.ctrl.sfence_vma.src_info := io.memoryStage.inst0.src_info
io.fetchUnit.flush := io.ctrl.allow_to_go && (io.csr.out.flush || mou.out.flush) io.fetchUnit.flush := io.ctrl.allow_to_go && (io.csr.out.flush || mou.out.flush)
io.fetchUnit.target := Mux(io.csr.out.flush, io.csr.out.target, mou.out.target) io.fetchUnit.target := Mux(io.csr.out.flush, io.csr.out.target, mou.out.target)
} }

View File

@ -12,17 +12,20 @@ class Mou extends Module {
val pc = UInt(XLEN.W) val pc = UInt(XLEN.W)
}) })
val out = Output(new Bundle { val out = Output(new Bundle {
val flush = Bool() val flush = Bool()
val fence_i = Bool() val fence_i = Bool()
val target = UInt(XLEN.W) val sfence_vma = Bool()
val target = UInt(XLEN.W)
}) })
}) })
val valid = io.in.info.valid && io.in.info.fusel === FuType.mou val valid = io.in.info.valid && io.in.info.fusel === FuType.mou
val fence_i = valid && io.in.info.op === MOUOpType.fencei val fence_i = valid && io.in.info.op === MOUOpType.fencei
val sfence_vma = valid && io.in.info.op === MOUOpType.sfence_vma
io.out.flush := valid io.out.flush := valid
io.out.fence_i := fence_i io.out.fence_i := fence_i
io.out.target := io.in.pc + 4.U io.out.sfence_vma := sfence_vma
io.out.target := io.in.pc + 4.U
} }