1 # test case for LOAD / STORE Computation Unit using MMU
3 from nmigen
.back
.pysim
import Simulator
, Delay
, Settle
, Tick
4 from nmigen
.cli
import verilog
, rtlil
5 from nmigen
import Module
, Signal
, Mux
, Cat
, Elaboratable
, Array
, Repl
6 from nmigen
.hdl
.rec
import Record
, Layout
8 from nmutil
.latch
import SRLatch
, latchregister
9 from nmutil
.byterev
import byte_reverse
10 from nmutil
.extend
import exts
11 from nmutil
.util
import wrap
12 from soc
.fu
.regspec
import RegSpecAPI
14 from openpower
.decoder
.power_enums
import MicrOp
, Function
, LDSTMode
15 from soc
.fu
.ldst
.ldst_input_record
import CompLDSTOpSubset
16 from openpower
.decoder
.power_decoder2
import Data
17 from openpower
.consts
import MSR
19 from soc
.experiment
.compalu_multi
import go_record
, CompUnitRecord
20 from soc
.experiment
.l0_cache
import PortInterface
21 from soc
.experiment
.pimem
import LDSTException
22 from soc
.experiment
.compldst_multi
import LDSTCompUnit
, load
, store
23 from soc
.config
.test
.test_loadstore
import TestMemPspec
25 from soc
.experiment
.mmu
import MMU
26 from nmutil
.util
import Display
28 from soc
.config
.loadstore
import ConfigMemoryPortInterface
29 from soc
.experiment
.test
import pagetables
30 from soc
.experiment
.test
.test_wishbone
import wb_get
32 ########################################
34 def wait_for_debug(sig
, wait
=True, test1st
=False):
37 print("wait for", sig
, v
, wait
, test1st
)
38 if test1st
and bool(v
) == wait
:
47 #print("...wait for", sig, v)
51 def store_debug(dut
, src1
, src2
, src3
, imm
, imm_ok
=True, update
=False,
52 byterev
=True,dcbz
=False):
53 print("ST", src1
, src2
, src3
, imm
, imm_ok
, update
)
55 yield dut
.oper_i
.insn_type
.eq(MicrOp
.OP_DCBZ
)
57 yield dut
.oper_i
.insn_type
.eq(MicrOp
.OP_STORE
)
58 yield dut
.oper_i
.data_len
.eq(2) # half-word
59 yield dut
.oper_i
.byte_reverse
.eq(byterev
)
60 yield dut
.src1_i
.eq(src1
)
61 yield dut
.src2_i
.eq(src2
)
62 yield dut
.src3_i
.eq(src3
)
63 yield dut
.oper_i
.imm_data
.data
.eq(imm
)
64 yield dut
.oper_i
.imm_data
.ok
.eq(imm_ok
)
65 #guess: this one was removed -- yield dut.oper_i.update.eq(update)
66 yield dut
.issue_i
.eq(1)
68 yield dut
.issue_i
.eq(0)
74 # wait for all active rel signals to come up
77 rel
= yield dut
.rd
.rel_o
80 print("hang in -- wait for all active rel signals to come up")
85 yield dut
.rd
.go_i
.eq(active_rel
)
87 yield dut
.rd
.go_i
.eq(0)
89 yield from wait_for_debug(dut
.adr_rel_o
, False, test1st
=True)
90 # yield from wait_for(dut.adr_rel_o)
91 # yield dut.ad.go.eq(1)
93 # yield dut.ad.go.eq(0)
96 yield from wait_for_debug(dut
.wr
.rel_o
[1])
97 yield dut
.wr
.go
.eq(0b10)
99 addr
= yield dut
.addr_o
101 yield dut
.wr
.go
.eq(0)
105 yield from wait_for_debug(dut
.sto_rel_o
)
106 yield dut
.go_st_i
.eq(1)
108 yield dut
.go_st_i
.eq(0)
109 yield from wait_for_debug(dut
.busy_o
, False)
110 # wait_for(dut.stwd_mem_o)
114 # same thing as soc/src/soc/experiment/test/test_dcbz_pi.py
116 yield dut
.mmu
.rin
.prtbl
.eq(0x1000000) # set process table
118 data
= 0xFF #just a single byte for this test
119 #data = 0xf553b658ba7e1f51
121 yield from store(dut
, addr
, 0, data
, 0)
123 ld_data
, data_ok
, ld_addr
= yield from load(dut
, addr
, 0, 0)
124 print(data
,data_ok
,ld_addr
)
125 assert(ld_data
==data
)
130 print("doing dcbz/store with data 0 .....")
131 yield from store_debug(dut
, addr
, 0, data
, 0, dcbz
=True) #hangs
134 ld_data
, data_ok
, ld_addr
= yield from load(dut
, addr
, 0, 0)
135 print(data
,data_ok
,ld_addr
)
138 assert(ld_data
==data
)
139 print("dzbz test passed")
141 dut
.stop
= True # stop simulation
143 ########################################
146 class TestLDSTCompUnitMMU(LDSTCompUnit
):
148 def __init__(self
, rwid
, pspec
):
149 from soc
.experiment
.l0_cache
import TstL0CacheBuffer
150 self
.l0
= l0
= TstL0CacheBuffer(pspec
)
152 LDSTCompUnit
.__init
__(self
, pi
, rwid
, 4)
154 def elaborate(self
, platform
):
155 m
= LDSTCompUnit
.elaborate(self
, platform
)
156 m
.submodules
.l0
= self
.l0
157 # link addr-go direct to rel
158 m
.d
.comb
+= self
.ad
.go_i
.eq(self
.ad
.rel_o
)
162 def test_scoreboard_mmu():
165 pspec
= TestMemPspec(ldst_ifacetype
='mmu_cache_wb',
166 imem_ifacetype
='bare_wb',
172 dut
= TestLDSTCompUnitMMU(16,pspec
)
173 vl
= rtlil
.convert(dut
, ports
=dut
.ports())
174 with
open("test_ldst_comp_mmu1.il", "w") as f
:
177 run_simulation(dut
, ldst_sim(dut
), vcd_name
='test_ldst_comp.vcd')
179 ########################################
180 class TestLDSTCompUnitRegSpecMMU(LDSTCompUnit
):
182 def __init__(self
, pspec
):
183 from soc
.experiment
.l0_cache
import TstL0CacheBuffer
184 from soc
.fu
.ldst
.pipe_data
import LDSTPipeSpec
185 regspec
= LDSTPipeSpec
.regspec
187 # use a LoadStore1 here
189 cmpi
= ConfigMemoryPortInterface(pspec
)
195 LDSTCompUnit
.__init
__(self
, ldst
.pi
, regspec
, 4)
197 def elaborate(self
, platform
):
198 m
= LDSTCompUnit
.elaborate(self
, platform
)
199 m
.submodules
.l0
= self
.l0
200 m
.submodules
.mmu
= self
.mmu
201 # link addr-go direct to rel
202 m
.d
.comb
+= self
.ad
.go_i
.eq(self
.ad
.rel_o
)
204 # link mmu and dcache together
205 dcache
= self
.l0
.dcache
207 m
.d
.comb
+= dcache
.m_in
.eq(mmu
.d_out
) # MMUToDCacheType
208 m
.d
.comb
+= mmu
.d_in
.eq(dcache
.m_out
) # DCacheToMMUType
215 def test_scoreboard_regspec_mmu():
220 pspec
= TestMemPspec(ldst_ifacetype
='mmu_cache_wb',
221 imem_ifacetype
='bare_wb',
227 dut
= TestLDSTCompUnitRegSpecMMU(pspec
)
229 m
.submodules
.dut
= dut
234 dut
.mem
= pagetables
.test1
237 sim
.add_sync_process(wrap(ldst_sim(dut
)))
238 sim
.add_sync_process(wrap(wb_get(dut
)))
239 with sim
.write_vcd('test_scoreboard_regspec_mmu'):
243 if __name__
== '__main__':
244 test_scoreboard_regspec_mmu()
245 #only one test for now -- test_scoreboard_mmu()