parent
1be1433f04
commit
ba4eecc0f0
@ -51,7 +51,7 @@ class PMP(implicit p: Parameters) extends PMPReg {
|
|||||||
eval(x, comparand, mask)
|
eval(x, comparand, mask)
|
||||||
} else {
|
} else {
|
||||||
// break up the circuit; the MSB part will be CSE'd
|
// break up the circuit; the MSB part will be CSE'd
|
||||||
val lsbMask = mask | ~(((BigInt(1) << lgMaxSize) - 1).U << lgSize)
|
val lsbMask = mask | UIntToOH1(lgSize, lgMaxSize)
|
||||||
val msbMatch = eval(x >> lgMaxSize, comparand >> lgMaxSize, mask >> lgMaxSize)
|
val msbMatch = eval(x >> lgMaxSize, comparand >> lgMaxSize, mask >> lgMaxSize)
|
||||||
val lsbMatch = eval(x(lgMaxSize-1, 0), comparand(lgMaxSize-1, 0), lsbMask(lgMaxSize-1, 0))
|
val lsbMatch = eval(x(lgMaxSize-1, 0), comparand(lgMaxSize-1, 0), lsbMask(lgMaxSize-1, 0))
|
||||||
msbMatch && lsbMatch
|
msbMatch && lsbMatch
|
||||||
@ -71,7 +71,7 @@ class PMP(implicit p: Parameters) extends PMPReg {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private def lowerBoundMatch(x: UInt, lgSize: UInt, lgMaxSize: Int) =
|
private def lowerBoundMatch(x: UInt, lgSize: UInt, lgMaxSize: Int) =
|
||||||
!boundMatch(x, ~(((BigInt(1) << lgMaxSize) - 1).U << lgSize)(lgMaxSize-1, 0), lgMaxSize)
|
!boundMatch(x, UIntToOH1(lgSize, lgMaxSize), lgMaxSize)
|
||||||
|
|
||||||
private def upperBoundMatch(x: UInt, lgMaxSize: Int) =
|
private def upperBoundMatch(x: UInt, lgMaxSize: Int) =
|
||||||
boundMatch(x, 0.U, lgMaxSize)
|
boundMatch(x, 0.U, lgMaxSize)
|
||||||
@ -105,7 +105,7 @@ class PMP(implicit p: Parameters) extends PMPReg {
|
|||||||
|
|
||||||
// returns whether this matching PMP fully contains the access
|
// returns whether this matching PMP fully contains the access
|
||||||
def aligned(x: UInt, lgSize: UInt, lgMaxSize: Int, prev: PMP): Bool = if (lgMaxSize <= lgAlign) true.B else {
|
def aligned(x: UInt, lgSize: UInt, lgMaxSize: Int, prev: PMP): Bool = if (lgMaxSize <= lgAlign) true.B else {
|
||||||
val lsbMask = ~(((BigInt(1) << lgMaxSize) - 1).U << lgSize)(lgMaxSize-1, 0)
|
val lsbMask = UIntToOH1(lgSize, lgMaxSize)
|
||||||
val straddlesLowerBound = ((x >> lgMaxSize) ^ (prev.comparand >> lgMaxSize)) === 0 && (prev.comparand(lgMaxSize-1, 0) & ~x(lgMaxSize-1, 0)) =/= 0
|
val straddlesLowerBound = ((x >> lgMaxSize) ^ (prev.comparand >> lgMaxSize)) === 0 && (prev.comparand(lgMaxSize-1, 0) & ~x(lgMaxSize-1, 0)) =/= 0
|
||||||
val straddlesUpperBound = ((x >> lgMaxSize) ^ (comparand >> lgMaxSize)) === 0 && (comparand(lgMaxSize-1, 0) & (x(lgMaxSize-1, 0) | lsbMask)) =/= 0
|
val straddlesUpperBound = ((x >> lgMaxSize) ^ (comparand >> lgMaxSize)) === 0 && (comparand(lgMaxSize-1, 0) & (x(lgMaxSize-1, 0) | lsbMask)) =/= 0
|
||||||
val rangeAligned = !(straddlesLowerBound || straddlesUpperBound)
|
val rangeAligned = !(straddlesLowerBound || straddlesUpperBound)
|
||||||
|
Loading…
Reference in New Issue
Block a user