Add cover properties for ECALL exceptions.
This commit is contained in:
		| @@ -8,6 +8,7 @@ import Chisel.ImplicitConversions._ | ||||
| import freechips.rocketchip.config.Parameters | ||||
| import freechips.rocketchip.tile._ | ||||
| import freechips.rocketchip.util._ | ||||
| import freechips.rocketchip.util.property._ | ||||
| import scala.collection.mutable.LinkedHashMap | ||||
| import Instructions._ | ||||
|  | ||||
| @@ -532,6 +533,9 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param | ||||
|     Causes.load_page_fault, Causes.store_page_fault, Causes.fetch_page_fault) | ||||
|   val badaddr_value = Mux(write_badaddr, io.badaddr, 0.U) | ||||
|  | ||||
|   val noCause :: mCause :: hCause :: sCause :: uCause :: Nil = Enum(5) | ||||
|   val xcause_dest = Wire(init = noCause) | ||||
|  | ||||
|   when (exception) { | ||||
|     when (trapToDebug) { | ||||
|       when (!reg_debug) { | ||||
| @@ -544,6 +548,7 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param | ||||
|     }.elsewhen (delegate) { | ||||
|       reg_sepc := formEPC(epc) | ||||
|       reg_scause := cause | ||||
|       xcause_dest := sCause | ||||
|       reg_sbadaddr := badaddr_value | ||||
|       reg_mstatus.spie := reg_mstatus.sie | ||||
|       reg_mstatus.spp := reg_mstatus.prv | ||||
| @@ -552,6 +557,7 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param | ||||
|     }.otherwise { | ||||
|       reg_mepc := formEPC(epc) | ||||
|       reg_mcause := cause | ||||
|       xcause_dest := mCause | ||||
|       reg_mbadaddr := badaddr_value | ||||
|       reg_mstatus.mpie := reg_mstatus.mie | ||||
|       reg_mstatus.mpp := trimPrivilege(reg_mstatus.prv) | ||||
| @@ -560,6 +566,22 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   for ( | ||||
|     (cover_reg, cover_reg_label) <- List( | ||||
|       (mCause, "MCAUSE"), | ||||
|       (sCause, "SCAUSE") | ||||
|     ); | ||||
|     (cover_cause_code, cover_cause_label) <- List( | ||||
|       (Causes.user_ecall, "ECALL_USER"), | ||||
|       (Causes.supervisor_ecall, "ECALL_SUPERVISOR"), | ||||
|       (Causes.hypervisor_ecall, "ECALL_HYPERVISOR"), | ||||
|       (Causes.machine_ecall, "ECALL_MACHINE") | ||||
|     ) | ||||
|   ) { | ||||
|     cover((xcause_dest === cover_reg) && (cause === UInt(cover_cause_code)), | ||||
|           s"${cover_reg_label}_${cover_cause_label}") | ||||
|   } | ||||
|  | ||||
|   when (insn_ret) { | ||||
|     when (Bool(usingVM) && !io.rw.addr(9)) { | ||||
|       reg_mstatus.sie := reg_mstatus.spie | ||||
|   | ||||
		Reference in New Issue
	
	Block a user