Add PLIC covers (#1229)
* Add another FPU hazard cover * Add some PLIC covers
This commit is contained in:
		| @@ -12,6 +12,8 @@ import freechips.rocketchip.tile.XLen | ||||
| import freechips.rocketchip.tilelink._ | ||||
| import freechips.rocketchip.interrupts._ | ||||
| import freechips.rocketchip.util._ | ||||
| import freechips.rocketchip.util.property._ | ||||
| import chisel3.internal.sourceinfo.SourceInfo | ||||
| import scala.math.min | ||||
|  | ||||
| class GatewayPLICIO extends Bundle { | ||||
| @@ -231,6 +233,25 @@ class TLPLIC(params: PLICParams)(implicit p: Parameters) extends LazyModule | ||||
|     pending(0) := false | ||||
|     for (e <- enables) | ||||
|       e(0) := false | ||||
|  | ||||
|     if (nDevices >= 2) { | ||||
|       val claimed = claimer(0) && maxDevs(0) > 0 | ||||
|       val completed = completer(0) | ||||
|       cover(claimed && RegEnable(claimed, false.B, claimed || completed), "TWO_CLAIMS", "two claims with no intervening complete") | ||||
|       cover(completed && RegEnable(completed, false.B, claimed || completed), "TWO_COMPLETES", "two completes with no intervening claim") | ||||
|  | ||||
|       val ep = enables(0).asUInt & pending.asUInt | ||||
|       val ep2 = RegNext(ep) | ||||
|       val diff = ep & ~ep2 | ||||
|       cover((diff & (diff - 1)) =/= 0, "TWO_INTS_PENDING", "two enabled interrupts became pending on same cycle") | ||||
|  | ||||
|       if (nPriorities > 0) | ||||
|         ccover(maxDevs(0) > (UInt(1) << priority(0).getWidth) && maxDevs(0) <= Cat(UInt(1), threshold(0)), | ||||
|                "THRESHOLD", "interrupt pending but less than threshold") | ||||
|     } | ||||
|  | ||||
|     def ccover(cond: Bool, label: String, desc: String)(implicit sourceInfo: SourceInfo) = | ||||
|       cover(cond, s"PLIC_$label", "Interrupts;;" + desc) | ||||
|   } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -823,6 +823,7 @@ class FPU(cfg: FPUParams)(implicit p: Parameters) extends FPUModule()(p) { | ||||
|   io.sboard_set := wb_reg_valid && !wb_cp_valid && Reg(next=useScoreboard(_._1.cond(mem_ctrl)) || mem_ctrl.div || mem_ctrl.sqrt) | ||||
|   io.sboard_clr := !wb_cp_valid && (divSqrt_wen || (wen(0) && useScoreboard(x => wbInfo(0).pipeid === UInt(x._2)))) | ||||
|   io.sboard_clra := waddr | ||||
|   ccover(io.sboard_clr && load_wb, "DUAL_WRITEBACK", "load and FMA writeback on same cycle") | ||||
|   // we don't currently support round-max-magnitude (rm=4) | ||||
|   io.illegal_rm := io.inst(14,12).isOneOf(5, 6) || io.inst(14,12) === 7 && io.fcsr_rm >= 5 | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user