f6f0901a2efc95df35beb3a20affb47f89874655
1 from soc
.minerva
.units
.fetch
import FetchUnitInterface
2 from nmigen
import Signal
, Module
, Elaboratable
, Mux
3 from nmigen
.utils
import log2_int
5 from nmigen
.back
.pysim
import Simulator
, Settle
6 from soc
.config
.ifetch
import ConfigFetchUnit
7 from collections
import namedtuple
8 from nmigen
.cli
import rtlil
10 from soc
.config
.test
.test_loadstore
import TestMemPspec
13 sys
.setrecursionlimit(10**6)
15 def read_from_addr(dut
, addr
):
16 yield dut
.a_pc_i
.eq(addr
)
17 yield dut
.a_valid_i
.eq(1)
18 yield dut
.f_valid_i
.eq(1)
19 yield dut
.a_stall_i
.eq(1)
21 yield dut
.a_stall_i
.eq(0)
24 while (yield dut
.f_busy_o
):
26 res
= (yield dut
.f_instr_o
)
28 yield dut
.a_valid_i
.eq(0)
29 yield dut
.f_valid_i
.eq(0)
34 def tst_lsmemtype(ifacetype
, sram_depth
=32):
36 pspec
= TestMemPspec(ldst_ifacetype
=ifacetype
,
37 imem_ifacetype
=ifacetype
, addr_wid
=64,
40 imem_test_depth
=sram_depth
)
41 dut
= ConfigFetchUnit(pspec
).fu
42 vl
= rtlil
.convert(dut
, ports
=[]) # TODOdut.ports())
43 with
open("test_fetch_%s.il" % ifacetype
, "w") as f
:
46 m
.submodules
.dut
= dut
51 mem
= dut
._get
_memory
()
55 values
= [random
.randint(0, (1<<32)-1) for x
in range(16)]
56 for addr
, val
in enumerate(values
):
57 yield mem
._array
[addr
].eq(val
)
60 for addr
, val
in enumerate(values
):
61 x
= yield from read_from_addr(dut
, addr
<< 2)
62 print ("addr, val", addr
, hex(val
), hex(x
))
65 sim
.add_sync_process(process
)
66 with sim
.write_vcd("test_fetch_%s.vcd" % ifacetype
, traces
=[]):
69 if __name__
== '__main__':
70 tst_lsmemtype('test_bare_wb', sram_depth
=32768)
71 tst_lsmemtype('testmem')