From c3e2389532d21216d6c3f50d9b0029ae4b585ded Mon Sep 17 00:00:00 2001
From: Kia <kia@special-circumstanc.es>
Date: Sat, 13 Mar 2021 15:13:31 -0700
Subject: [PATCH] arbitrary_width_memory.py

---
 arbitrary_width_memory.py | 58 +++++++++++++++++++++++++--------------
 1 file changed, 37 insertions(+), 21 deletions(-)

diff --git a/arbitrary_width_memory.py b/arbitrary_width_memory.py
index 2528c07..24aab10 100644
--- a/arbitrary_width_memory.py
+++ b/arbitrary_width_memory.py
@@ -41,12 +41,12 @@ class ArbitraryWidthMemoryBus(Record):
 
 
 
-class ArbitraryGearbox(Elaboratable):
+class ArbitraryWidthMemory(Elaboratable):
         def __init__(self, *, data_width, address_width):
             self.data_width = data_width
             self.address_width = address_width
 
-            self.bus = ArbitraryWidthMemoryBus(data_width=data_width, address_width=address_width)
+            self.bus = ArbitraryWidthMemoryBus(data_width=data_width, address_width=data_width)
 
         def elaborate(self, platform):
             m = Module()
@@ -58,24 +58,37 @@ class ArbitraryGearbox(Elaboratable):
 
 # This is non-synthesizable but is intended to provide a model for formal verification.
 
-class GoldenAWModel(Elaboratable):
-        def __init__(self, *, in_width, out_width, sim_memory_size):
-            self.in_width = in_width
-            self.out_width = out_width
-            assert(in_width == out_width)
-
-            self.memory = Signal(sim_memory_size)
+class GoldenArbitraryWidthMemory(Elaboratable):
+        def __init__(self, *, data_width, address_width, sim_memory_size):
+            self.data_width = data_width
+            self.address_width = address_width
+            self.sim_memory_size = sim_memory_size
+            self.memory = Memory(width=data_width, depth=sim_memory_size, init=[0x40,0x41,0x42, 0x43, 0x44, 0x45,0x46,0x47])
 
-            self.bus = ArbitraryWidthMemoryBus(in_width=in_width, out_width=out_width)
+            self.bus = ArbitraryWidthMemoryBus(data_width=data_width, address_width=address_width)
 
         def elaborate(self, platform):
+            m = Module()
 
+            write_ptr = Signal(range(self.sim_memory_size))
+            read_ptr  = Signal(range(self.sim_memory_size))
 
-            write_ptr = Signal(range(sim_memory_size))
-            read_ptr = Signal(range(sim_memory_size))
+            m.submodules.read_port  = read_port  = self.memory.read_port()
+            m.submodules.write_port = write_port = self.memory.write_port()
+            bus = self.bus
+
+            with m.If(bus.valid_in == 1):
+                with m.If(bus.write_enable == 1):
+                    m.d.comb += write_port.en.eq(1)
+                    m.d.comb += write_port.addr.eq(bus.w_addr)
+                    m.d.comb += write_port.data.eq(bus.w_data)
+                with m.Else():
+                    #m.d.comb += read_port.en.eq(0)
+                    m.d.comb += read_port.addr.eq(bus.r_addr)
+                    m.d.comb += bus.r_data.eq(read_port.data)
+                    m.d.sync += bus.valid_out.eq(1)
 
 
-            m = Module()
             return m
 
 
@@ -89,15 +102,18 @@ class DummyPlug(Elaboratable):
     def elaborate(self, platform):
         m = Module()
 
-        m.submodules.gearbox = gearbox = IdempotentGearbox(in_width=(3), out_width=3)
-        #counter = Signal(8)
-        #m.d.sync += counter.eq(counter+1)
+        m.submodules.AWMem = AWMem = GoldenArbitraryWidthMemory(data_width=7, address_width=8, sim_memory_size=8)
+        counter = Signal(8)
+
+
+        m.d.sync += counter.eq(counter+1)
 
-#        with m.If(counter == 3):
-#            m.d.comb += gearbox.bus.valid_in.eq(1)
-        m.d.comb += gearbox.bus.data_in.eq(AnySeq(3))
-        m.d.comb += gearbox.bus.ready_in.eq(AnySeq(1))
-        m.d.comb += gearbox.bus.valid_in.eq(AnySeq(1))
+        with m.If(counter == 4):
+            m.d.comb += AWMem.bus.valid_in.eq(1)
+        m.d.comb += AWMem.bus.write_enable.eq(0)
+        m.d.comb += AWMem.bus.r_addr.eq(counter)
+        #m.d.comb += AWMem.bus.w_addr.eq(counter)
+        #m.d.comb += AWMem.bus.w_data.eq(counter)
 
 
         return m
-- 
GitLab