[libre-riscv-dev] buffered pipeline
Luke Kenneth Casson Leighton
lkcl at lkcl.net
Sat Mar 23 06:29:59 GMT 2019
this works, jacob: i took a look at the unit test test_simulation.py
(btw can i recommend using run_simulation, it does exactly the same job?)
key differences:
* moved the explicit combinatorial setting of the ports outside to a
time-sync'd setup
* removed the "synchronous=False" argument
* set the write-enable to zero *AFTER* writing
* then set the read address
this now passes.
* setting "sychronous=False" causes a failure
* setting the read address early causes a failure
* failing to set the write-enable back to zero causes a failure
* failing to allow the clock to run for one cycle where write-enable
is high causes a failure
i'm trying some other experiments (which are failing).
l.
from nmigen import Module, Memory
from nmigen.compat.sim import run_simulation
import unittest
class TestMemory(unittest.TestCase):
def test(self) -> None:
class TestModule:
def __init__(self):
self.mem = Memory(8, 16, name="mem", init=[0, 0])
self.mem_rd0 = self.mem.read_port()
self.mem_rd1 = self.mem.read_port()
self.mem_wr0 = self.mem.write_port(priority=0)
self.mem_wr1 = self.mem.write_port(priority=1)
def elaborate(self, platform):
m = Module()
m.submodules.mem_rd0 = self.mem_rd0
m.submodules.mem_rd1 = self.mem_rd1
m.submodules.mem_wr0 = self.mem_wr0
m.submodules.mem_wr1 = self.mem_wr1
return m
module = TestModule()
def async_process(module):
self.assertEqual((yield module.mem_rd0.data), 0)
self.assertEqual((yield module.mem_rd1.data), 0)
yield module.mem_wr0.addr.eq(0)
yield module.mem_wr0.data.eq(1)
yield module.mem_wr0.en.eq(1)
yield module.mem_wr1.addr.eq(1)
yield module.mem_wr1.data.eq(1)
yield module.mem_wr1.en.eq(1)
yield
yield module.mem_wr0.en.eq(0)
yield module.mem_wr1.en.eq(0)
yield module.mem_rd0.addr.eq(0)
yield module.mem_rd1.addr.eq(1)
yield
self.assertEqual((yield module.mem_rd0.data), 1)
self.assertEqual((yield module.mem_rd1.data), 1)
# ports=[module.mem_rd0.data,
# module.mem_rd1.data],
run_simulation(module,
async_process(module),
vcd_name = "test.vcd")
On Sat, Mar 23, 2019 at 4:54 AM Luke Kenneth Casson Leighton
<lkcl at lkcl.net> wrote:
>
> ---
> crowd-funded eco-conscious hardware: https://www.crowdsupply.com/eoma68
>
> On Sat, Mar 23, 2019 at 1:10 AM Jacob Lifshay <programmerjake at gmail.com> wrote:
> >
> > On Fri, Mar 22, 2019 at 1:46 AM Jacob Lifshay <programmerjake at gmail.com>
> > wrote:
> >
> > > implemented rc4, but I'm getting a test failure, will debug in the morning
> > >
> > nmigen appears to not support simulation of memory with multiple write
> > ports: https://github.com/m-labs/nmigen/issues/47
> > no wonder my rc4 implementation was failing.
>
> okaay, so we have our first candidate that would justify donations to
> the nmigen team.
>
> can you back-port it to migen and see if that works?
>
> l.
More information about the libre-riscv-dev
mailing list