feat: implement privileged mode support

This commit is contained in:
abnerhexu
2026-06-29 07:00:55 +00:00
parent a32db39c80
commit b6afa61e66
89 changed files with 49571 additions and 43647 deletions

View File

@@ -47,6 +47,24 @@ class Decoder(p: CoreParams = CoreParams()) extends Module {
))
d.memSigned := !funct3(2)
d.illegal := false.B
val isSystemOpcode = opcode === "b1110011".U
val isFenceOpcode = opcode === "b0001111".U
val isEcall = io.inst === "h00000073".U
val isEbreak = io.inst === "h00100073".U
val isMret = io.inst === "h30200073".U
val isSret = io.inst === "h10200073".U
val isUret = io.inst === "h00200073".U
val isWfi = io.inst === "h10500073".U
val isSfenceVma = isSystemOpcode && funct3 === 0.U && funct7 === "b0001001".U
val isKnownPrivInst = isEcall || isEbreak || isMret || isSret || isSfenceVma || isWfi
d.isEcall := isEcall
d.isEbreak := isEbreak
d.isMret := isMret
d.isSret := isSret
d.isUret := isUret
d.isSfenceVma := isSfenceVma
d.isXret := isMret || isSret
d.isWfi := isWfi
switch(opcode) {
is("b0110111".U) {
@@ -128,11 +146,15 @@ class Decoder(p: CoreParams = CoreParams()) extends Module {
is("b0001111".U) {
d.opClass := Consts.OP_SYSTEM
d.isFenceI := funct3 === "b001".U
d.illegal := funct3 =/= 0.U && funct3 =/= "b001".U
}
is("b1110011".U) {
d.isSystem := true.B
d.writesRd := rd =/= 0.U && funct3 =/= 0.U
d.opClass := Consts.OP_SYSTEM
when(funct3 === 0.U) {
d.illegal := !(isKnownPrivInst && !isUret)
}
}
is("b0101111".U) {
d.isLoad := true.B
@@ -151,5 +173,9 @@ class Decoder(p: CoreParams = CoreParams()) extends Module {
d.illegal := true.B
}
when(isSystemOpcode && isUret) {
d.illegal := true.B
}
io.out := d
}