From 8c10caeef9ba773afb537c83f0ecb0bb8cbf268d Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Thu, 27 Apr 2017 14:31:50 -0700 Subject: [PATCH] Express PMP mask generation with incrementer, not adder DC apparently doesn't always pick up the ((x + 1) ^ x) idiom. Use (x + ~(x + 1)) instead. --- src/main/scala/rocket/PMP.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/rocket/PMP.scala b/src/main/scala/rocket/PMP.scala index cec4f25e..3337da0a 100644 --- a/src/main/scala/rocket/PMP.scala +++ b/src/main/scala/rocket/PMP.scala @@ -42,7 +42,7 @@ class PMP(implicit p: Parameters) extends PMPReg { val mask = UInt(width = paddrBits) import PMP._ - def computeMask = Cat((Cat(addr, cfg.a(0)) + 1) ^ Cat(addr, cfg.a(0)), UInt((BigInt(1) << (lgAlign-1)) - 1, lgAlign-1)) + def computeMask = Cat(Cat(addr, cfg.a(0)) & ~(Cat(addr, cfg.a(0)) + 1), UInt((BigInt(1) << lgAlign) - 1, lgAlign)) private def comparand = addr << lgAlign private def pow2Match(x: UInt, lgSize: UInt, lgMaxSize: Int) = {