add debugging and buffering to CacheRam
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 22 Apr 2021 22:59:56 +0000 (23:59 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 22 Apr 2021 22:59:56 +0000 (23:59 +0100)
src/soc/experiment/cache_ram.py
src/soc/experiment/dcache.py

index b2456fd8bd3ffab2b75b52099218d0aa58613565..4f7e47057ade0135948814caebccc036cf99d42f 100644 (file)
@@ -1,9 +1,10 @@
 # TODO: replace with Memory at some point
 from nmigen import Elaboratable, Signal, Array, Module
+from nmutil.util import Display
 
 class CacheRam(Elaboratable):
 
-    def __init__(self, ROW_BITS=16, WIDTH = 64, TRACE=False, ADD_BUF=False):
+    def __init__(self, ROW_BITS=16, WIDTH = 64, TRACE=True, ADD_BUF=False):
         self.ROW_BITS = ROW_BITS
         self.WIDTH = WIDTH
         self.TRACE = TRACE
@@ -34,24 +35,24 @@ class CacheRam(Elaboratable):
 
         with m.If(TRACE):
             with m.If(self.wr_sel != sel0):
-                #Display( "write a:" & to_hstring(wr_addr) &
-                #    " sel:" & to_hstring(wr_sel) &
-                #    " dat:" & to_hstring(wr_data))
-               pass
+                sync += Display( "write a: %x sel: %x dat: %x",
+                                self.wr_addr, self.wr_sel, self.wr_data)
         for i in range(WIDTH//8):
             lbit = i * 8;
             mbit = lbit + 8;
             with m.If(self.wr_sel[i]):
                 sync += ram[self.wr_addr][lbit:mbit].eq(self.wr_data[lbit:mbit])
         with m.If(self.rd_en):
-            if ADD_BUF:
-                sync += self.rd_data_o.eq(ram[self.rd_addr])
-            else:
-                comb += self.rd_data_o.eq(ram[self.rd_addr])
+            sync += rd_data0.eq(ram[self.rd_addr])
+            if TRACE:
+                sync += Display("read a: %x dat: %x",
+                                self.rd_addr, ram[self.rd_addr])
+                pass
 
-        if TRACE:
-            # Display( "read a:" & to_hstring(rd_addr) &
-            #" dat:" & to_hstring(ram(to_integer(unsigned(rd_addr))));
-            pass
+
+        if ADD_BUF:
+            sync += self.rd_data_o.eq(rd_data0)
+        else:
+            comb += self.rd_data_o.eq(rd_data0)
 
         return m
index 15c73cc8a45e2e3262f6183ddb306761c7394f91..af6da937410156e3db28925b78c7ff96fefa5bd2 100644 (file)
@@ -1613,8 +1613,9 @@ class DCache(Elaboratable):
         comb += self.stall_out.eq(r0_stall)
 
         # Wire up wishbone request latch out of stage 1
-        comb += r1.wb.adr.eq(r1.real_adr[ROW_OFF_BITS:]) # truncate LSBs
+        comb += r1.wb.adr.eq(r1.real_adr)
         comb += self.wb_out.eq(r1.wb)
+        comb += self.wb_out.adr.eq(r1.wb.adr[3:]) # truncate LSBs
 
         # call sub-functions putting everything together, using shared
         # signals established above
@@ -1847,13 +1848,13 @@ if __name__ == '__main__':
 
     mem = []
     for i in range(0, 512):
-        mem.append(i)
+        mem.append((i*2)| ((i*2+1)<<32))
 
-    test_dcache(mem, dcache_random_sim, "random")
+    test_dcache(mem, dcache_sim, "")
 
     mem = []
     for i in range(0, 512):
-        mem.append((i*2)| ((i*2+1)<<32))
+        mem.append(i)
 
-    test_dcache(mem, dcache_sim, "")
+    test_dcache(mem, dcache_random_sim, "random")