put mbits back into segment_check (like it is in microwatt)
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 16 Apr 2021 00:28:29 +0000 (01:28 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 16 Apr 2021 00:28:29 +0000 (01:28 +0100)
src/soc/decoder/isa/radixmmu.py

index db8c8b2086d36f6f0d1db9a960d08fc65fc1b077..f460360486386a0e8392445d4332b2a6517bbb26 100644 (file)
@@ -451,8 +451,7 @@ class RADIX:
 
         print("calling segment_check")
 
-        mbits = selectconcat(SelectableInt(0,1), mask_size)
-        shift = self._segment_check(addr, mbits, shift)
+        shift = self._segment_check(addr, mask_size, shift)
         print("shift", shift)
 
         if isinstance(addr, str):
@@ -558,9 +557,9 @@ class RADIX:
 
         return rts, mbits
 
-    def _segment_check(self, addr, mbits, shift):
+    def _segment_check(self, addr, mask_size, shift):
         """checks segment valid
-                    mbits := '0' & r.mask_size;
+            mbits := '0' & r.mask_size;
             v.shift := r.shift + (31 - 12) - mbits;
             nonzero := or(r.addr(61 downto 31) and not finalmask(30 downto 0));
             if r.addr(63) /= r.addr(62) or nonzero = '1' then
@@ -575,6 +574,7 @@ class RADIX:
         # note that SelectableInt does big-endian!  so the indices
         # below *directly* match the spec, unlike microwatt which
         # has to turn them around (to LE)
+        mbits = selectconcat(SelectableInt(0,1), mask_size)
         mask = genmask(shift, 44)
         nonzero = addr[2:33] & mask[13:44] # mask 31 LSBs (BE numbered 13:44)
         print ("RADIX _segment_check nonzero", bin(nonzero.value))
@@ -584,7 +584,7 @@ class RADIX:
         limit = shift + (31 - 12)
         if mbits.value < 5 or mbits.value > 16 or mbits.value > limit.value:
             return "badtree"
-        new_shift = shift + (31 - 12) - mbits
+        new_shift = limit - mbits
         # TODO verify that returned result is correct
         return new_shift