1 from nmigen
import (C
, Module
, Signal
, Elaboratable
, Mux
, Cat
, Repl
, Signal
,
3 from nmigen
.cli
import main
4 from nmigen
.cli
import rtlil
5 from nmutil
.mask
import Mask
, masked
6 from nmutil
.util
import Display
7 from random
import randint
, seed
8 from nmigen
.sim
import Simulator
, Delay
, Settle
9 from nmutil
.util
import wrap
11 from soc
.config
.test
.test_pi2ls
import (pi_ld
, pi_st
, pi_ldst
, wait_busy
,
13 #from soc.config.test.test_pi2ls import pi_st_debug
14 from soc
.config
.test
.test_loadstore
import TestMemPspec
15 from soc
.config
.loadstore
import ConfigMemoryPortInterface
17 from soc
.fu
.ldst
.loadstore
import LoadStore1
18 from soc
.experiment
.mmu
import MMU
19 from soc
.experiment
.test
import pagetables
21 from nmigen
.compat
.sim
import run_simulation
22 from random
import random
23 from openpower
.test
.wb_get
import wb_get
24 from openpower
.test
import wb_get
as wbget
25 from openpower
.exceptions
import LDSTExceptionTuple
27 from soc
.config
.test
.test_fetch
import read_from_addr
28 from openpower
.decoder
.power_enums
import MSRSpec
35 pspec
= TestMemPspec(ldst_ifacetype
='mmu_cache_wb',
38 #disable_cache=True, # hmmm...
44 cmpi
= ConfigMemoryPortInterface(pspec
)
45 m
.submodules
.ldst
= ldst
= cmpi
.pi
46 m
.submodules
.mmu
= mmu
= MMU()
50 l_in
, l_out
= mmu
.l_in
, mmu
.l_out
51 d_in
, d_out
= dcache
.d_in
, dcache
.d_out
52 i_in
, i_out
= icache
.i_in
, icache
.i_out
# FetchToICache, ICacheToDecode
54 # link mmu, dcache and icache together
55 m
.d
.comb
+= dcache
.m_in
.eq(mmu
.d_out
) # MMUToDCacheType
56 m
.d
.comb
+= icache
.m_in
.eq(mmu
.i_out
) # MMUToICacheType
57 m
.d
.comb
+= mmu
.d_in
.eq(dcache
.m_out
) # DCacheToMMUType
59 # link ldst and MMU together
60 comb
+= l_in
.eq(ldst
.m_out
)
61 comb
+= ldst
.m_in
.eq(l_out
)
63 # add a debug status Signal: use "msg.str = "blah"
64 # then toggle with yield msg.eq(0); yield msg.eq(1)
65 debug_status
= Signal(8, decoder
=lambda _
: debug_status
.str)
66 m
.debug_status
= debug_status
72 def icache_read(dut
,addr
,priv
,virt
):
74 icache
= dut
.submodules
.ldst
.icache
78 yield i_in
.priv_mode
.eq(priv
)
79 yield i_in
.virt_mode
.eq(virt
)
81 yield i_in
.nia
.eq(addr
)
82 yield i_in
.stop_mark
.eq(0)
85 yield i_in
.nia
.eq(addr
)
87 valid
= yield i_out
.valid
88 failed
= yield i_out
.fetch_failed
89 while not valid
and not failed
:
91 valid
= yield i_out
.valid
92 failed
= yield i_out
.fetch_failed
96 insn
= yield i_out
.insn
100 return nia
, insn
, valid
, failed
103 test_exceptions
= True
109 print ("set debug message", msg
)
110 dut
.debug_status
.str = msg
# set the message
111 yield dut
.debug_status
.eq(0) # trigger an update
112 yield dut
.debug_status
.eq(1)
115 def _test_loadstore1_ifetch_iface(dut
, mem
):
116 """test_loadstore1_ifetch_iface
118 read in priv mode, non-virtual. tests the FetchUnitInterface
122 mmu
= dut
.submodules
.mmu
123 ldst
= dut
.submodules
.ldst
125 icache
= dut
.submodules
.ldst
.icache
128 print("=== test loadstore instruction (real) ===")
134 yield from debug(dut
, "real mem instruction")
135 # set address to 0x8, update mem[0x8] to 01234 | 0x5678<<32
136 # (have to do 64-bit writes into the dictionary-memory-emulated-thing)
139 expected_insn2
= 0x5678
140 expected_insn
= 0x1234
141 mem
[addr
] = expected_insn | expected_insn2
<<32
143 yield i_in
.priv_mode
.eq(1)
144 insn
= yield from read_from_addr(icache
, addr
, stall
=False)
146 nia
= yield i_out
.nia
# NO, must use FetchUnitInterface
147 print ("fetched %x from addr %x" % (insn
, nia
))
148 assert insn
== expected_insn
150 print("=== test loadstore instruction (2nd, real) ===")
151 yield from debug(dut
, "real mem 2nd (addr 0xc)")
153 insn2
= yield from read_from_addr(icache
, addr2
, stall
=False)
155 nia
= yield i_out
.nia
# NO, must use FetchUnitInterface
156 print ("fetched %x from addr2 %x" % (insn2
, nia
))
157 assert insn2
== expected_insn2
159 print("=== test loadstore instruction (done) ===")
161 yield from debug(dut
, "test done")
165 print ("fetched %x from addr %x" % (insn
, nia
))
166 assert insn
== expected_insn
171 def write_mem2(mem
, addr
, i1
, i2
):
172 mem
[addr
] = i1 | i2
<<32
175 #TODO: use fetch interface here
176 def lookup_virt(dut
,addr
):
177 icache
= dut
.submodules
.ldst
.icache
180 yield i_in
.priv_mode
.eq(0)
181 yield i_in
.virt_mode
.eq(1)
183 yield i_in
.stop_mark
.eq(0)
185 yield icache
.a_i_valid
.eq(1)
186 yield icache
.a_pc_i
.eq(addr
)
188 valid
= yield i_out
.valid
189 failed
= yield i_out
.fetch_failed
190 while not valid
and not failed
:
192 valid
= yield i_out
.valid
193 failed
= yield i_out
.fetch_failed
194 yield icache
.a_i_valid
.eq(0)
199 def mmu_lookup(dut
,addr
):
200 ldst
= dut
.submodules
.ldst
202 yield from debug(dut
, "instr fault "+hex(addr
))
203 yield ldst
.priv_mode
.eq(0)
204 yield ldst
.instr_fault
.eq(1)
205 yield ldst
.maddr
.eq(addr
)
207 yield ldst
.instr_fault
.eq(0)
209 done
= yield (ldst
.done
)
210 exc_info
= yield from get_exception_info(pi
.exc_o
)
211 if done
or exc_info
.happened
:
215 assert exc_info
.happened
== 0 # assert just before doing the fault set zero
216 yield ldst
.instr_fault
.eq(0)
217 yield from debug(dut
, "instr fault done "+hex(addr
))
223 def _test_loadstore1_ifetch_multi(dut
, mem
):
224 mmu
= dut
.submodules
.mmu
225 ldst
= dut
.submodules
.ldst
227 icache
= dut
.submodules
.ldst
.icache
228 assert wbget
.stop
== False
230 print ("set process table")
231 yield from debug(dut
, "set prtble")
232 yield mmu
.rin
.prtbl
.eq(0x1000000) # set process table
239 # fetch instructions from multiple addresses
240 # should cope with some addresses being invalid
241 real_addrs
= [0,4,8,0,8,4,0,0,12]
242 write_mem2(mem
,0,0xF0,0xF4)
243 write_mem2(mem
,8,0xF8,0xFC)
245 yield i_in
.priv_mode
.eq(1)
246 for addr
in real_addrs
:
247 yield from debug(dut
, "real_addr "+hex(addr
))
248 insn
= yield from read_from_addr(icache
, addr
, stall
=False)
249 nia
= yield i_out
.nia
# NO, must use FetchUnitInterface
250 print ("TEST_MULTI: fetched %x from addr %x == %x" % (insn
, nia
,addr
))
251 assert insn
==0xF0+addr
253 # now with virtual memory enabled
254 yield i_in
.virt_mode
.eq(1)
256 virt_addrs
= [0x10200,0x10204,0x10208,0x10200,
257 0x102008,0x10204,0x10200,0x10200,0x10200C]
259 write_mem2(mem
,0x10200,0xF8,0xFC)
261 for addr
in virt_addrs
:
262 yield from debug(dut
, "virt_addr "+hex(addr
))
264 valid
, failed
= yield from lookup_virt(dut
,addr
)
266 print("TEST_MULTI: failed=",failed
) # this is reported wrong
267 if failed
==1: # test one first
268 yield from mmu_lookup(dut
,addr
)
269 valid
, failed
= yield from lookup_virt(dut
,addr
)
275 def _test_loadstore1_ifetch(dut
, mem
):
276 """test_loadstore1_ifetch
278 this is quite a complex multi-step test.
280 * first (just because, as a demo) read in priv mode, non-virtual.
281 just like in experiment/icache.py itself.
283 * second, using the (usual) PTE for these things (which came originally
284 from gem5-experimental experiment/radix_walk_example.txt) do a
285 virtual-memory read through the *instruction* cache.
286 this is expected to FAIL
288 * third: mess about with the MMU, setting "iside" (instruction-side),
289 requesting an MMU RADIX LOOKUP. this triggers an itlb_load
290 (instruction-cache TLB entry-insertion)
292 * fourth and finally: retry the read of the instruction through i-cache.
293 this is now expected to SUCCEED
298 mmu
= dut
.submodules
.mmu
299 ldst
= dut
.submodules
.ldst
301 icache
= dut
.submodules
.ldst
.icache
304 print("=== test loadstore instruction (real) ===")
310 # first virtual memory test
312 print ("set process table")
313 yield from debug(dut
, "set prtble")
314 yield mmu
.rin
.prtbl
.eq(0x1000000) # set process table
317 yield from debug(dut
, "real mem instruction")
318 # set address to zero, update mem[0] to 01234
320 expected_insn
= 0x1234
321 mem
[addr
] = expected_insn
323 yield i_in
.priv_mode
.eq(1)
325 yield i_in
.nia
.eq(addr
)
326 yield i_in
.stop_mark
.eq(0)
327 yield i_m_in
.tlbld
.eq(0)
328 yield i_m_in
.tlbie
.eq(0)
329 yield i_m_in
.addr
.eq(0)
330 yield i_m_in
.pte
.eq(0)
335 # miss, stalls for a bit -- this one is different here
336 ##nia, insn, valid, failed = yield from icache_read(dut,addr,0,0)
341 yield i_in
.nia
.eq(addr
)
343 valid
= yield i_out
.valid
346 valid
= yield i_out
.valid
349 nia
= yield i_out
.nia
350 insn
= yield i_out
.insn
354 print ("fetched %x from addr %x" % (insn
, nia
))
355 assert insn
== expected_insn
357 print("=== test loadstore instruction (virtual) ===")
359 # look up i-cache expecting it to fail
361 yield from debug(dut
, "virtual instr req")
362 # set address to 0x10200, update mem[] to 5678
364 real_addr
= virt_addr
365 expected_insn
= 0x5678
366 mem
[real_addr
] = expected_insn
368 yield i_in
.priv_mode
.eq(0)
369 yield i_in
.virt_mode
.eq(1)
371 yield i_in
.nia
.eq(virt_addr
)
372 yield i_in
.stop_mark
.eq(0)
373 yield i_m_in
.tlbld
.eq(0)
374 yield i_m_in
.tlbie
.eq(0)
375 yield i_m_in
.addr
.eq(0)
376 yield i_m_in
.pte
.eq(0)
381 # miss, stalls for a bit
383 yield i_in
.nia
.eq(virt_addr
)
385 valid
= yield i_out
.valid
386 failed
= yield i_out
.fetch_failed
387 while not valid
and not failed
:
389 valid
= yield i_out
.valid
390 failed
= yield i_out
.fetch_failed
393 print ("failed?", "yes" if failed
else "no")
398 print("=== test loadstore instruction (instruction fault) ===")
400 yield from debug(dut
, "instr fault")
404 yield ldst
.priv_mode
.eq(0)
405 yield ldst
.instr_fault
.eq(1)
406 yield ldst
.maddr
.eq(virt_addr
)
407 # still broken -- investigate
408 # msr = MSRSpec(pr=?, dr=?, sf=0)
409 # ld_data, exctype, exc = yield from pi_ld(pi, virt_addr, 8, msr=msr)
411 yield ldst
.instr_fault
.eq(0)
413 done
= yield (ldst
.done
)
414 exc_info
= yield from get_exception_info(pi
.exc_o
)
415 if done
or exc_info
.happened
:
418 assert exc_info
.happened
== 0 # assert just before doing the fault set zero
419 yield ldst
.instr_fault
.eq(0)
424 print("=== test loadstore instruction (try instruction again) ===")
425 yield from debug(dut
, "instr virt retry")
426 # set address to 0x10200, update mem[] to 5678
428 real_addr
= virt_addr
429 expected_insn
= 0x5678
431 yield i_in
.priv_mode
.eq(0)
432 yield i_in
.virt_mode
.eq(1)
434 yield i_in
.nia
.eq(virt_addr
)
435 yield i_in
.stop_mark
.eq(0)
436 yield i_m_in
.tlbld
.eq(0)
437 yield i_m_in
.tlbie
.eq(0)
438 yield i_m_in
.addr
.eq(0)
439 yield i_m_in
.pte
.eq(0)
444 # miss, stalls for a bit
447 yield i_in.nia.eq(virt_addr)
449 valid = yield i_out.valid
450 failed = yield i_out.fetch_failed
451 while not valid and not failed:
453 valid = yield i_out.valid
454 failed = yield i_out.fetch_failed
456 nia = yield i_out.nia
457 insn = yield i_out.insn
461 nia
, insn
, valid
, failed
= yield from icache_read(dut
,virt_addr
,0,1)
463 yield from debug(dut
, "test done")
467 print ("failed?", "yes" if failed
else "no")
470 print ("fetched %x from addr %x" % (insn
, nia
))
471 assert insn
== expected_insn
476 def _test_loadstore1_invalid(dut
, mem
):
477 mmu
= dut
.submodules
.mmu
478 pi
= dut
.submodules
.ldst
.pi
481 print("=== test invalid ===")
484 msr
= MSRSpec(pr
=1, dr
=0, sf
=0) # set problem-state
485 ld_data
, exctype
, exc
= yield from pi_ld(pi
, addr
, 8, msr
=msr
)
486 print("ld_data", ld_data
, exctype
, exc
)
487 assert (exctype
== "slow")
488 invalid
= exc
.invalid
489 assert (invalid
== 1)
491 print("=== test invalid done ===")
496 def _test_loadstore1_microwatt_mmu_bin_test2(dut
, mem
):
497 mmu
= dut
.submodules
.mmu
498 pi
= dut
.submodules
.ldst
.pi
499 ldst
= dut
.submodules
.ldst
# to get at DAR (NOT part of PortInterface)
502 yield mmu
.rin
.prtbl
.eq(0x12000) # set process table
503 yield mmu
.rin
.pid
.eq(0x1) # set PID=1
507 msr
= MSRSpec(pr
=1, dr
=1, sf
=1)
509 print("=== alignment error (ld) ===")
511 ld_data
, exctype
, exc
= yield from pi_ld(pi
, addr
, 8, msr
=msr
)
512 print("ld_data after mmu.bin test2")
514 assert ld_data
== 0x0000000badc0ffee
515 assert exctype
is None
519 def test_pi_ld_misalign(pi
,addr
,data_len
,msr
):
520 for i
in range(0,data_len
):
521 ld_data
, exctype
, exc
= yield from pi_ld(pi
, addr
+i
, data_len
, msr
=msr
)
525 print("MISALIGN: test_pi_ld_misalign returned",hex(ld_data
))
527 assert exc
.alignment
== 1
529 def _test_loadstore1_misalign(dut
, mem
):
530 mmu
= dut
.submodules
.mmu
531 pi
= dut
.submodules
.ldst
.pi
532 ldst
= dut
.submodules
.ldst
# to get at DAR (NOT part of PortInterface)
535 yield mmu
.rin
.prtbl
.eq(0x12000) # set process table
536 yield mmu
.rin
.pid
.eq(0x1) # set PID=1
540 msr
= MSRSpec(pr
=0, dr
=0, sf
=1)
542 yield from test_pi_ld_misalign(pi
,0,8,msr
)
547 def _test_loadstore1(dut
, mem
):
548 mmu
= dut
.submodules
.mmu
549 pi
= dut
.submodules
.ldst
.pi
550 ldst
= dut
.submodules
.ldst
# to get at DAR (NOT part of PortInterface)
553 yield mmu
.rin
.prtbl
.eq(0x1000000) # set process table
557 data
= 0xf553b658ba7e1f51
558 msr
= MSRSpec(pr
=0, dr
=0, sf
=0)
561 yield from pi_st(pi
, addr
, data
, 8, msr
=msr
)
564 ld_data
, exctype
, exc
= yield from pi_ld(pi
, addr
, 8, msr
=msr
)
565 assert ld_data
== 0xf553b658ba7e1f51
566 assert exctype
is None
568 ld_data
, exctype
, exc
= yield from pi_ld(pi
, addr
, 8, msr
=msr
)
569 assert ld_data
== 0xf553b658ba7e1f51
570 assert exctype
is None
572 print("do_dcbz ===============")
573 yield from pi_st(pi
, addr
, data
, 8, msr
=msr
, is_dcbz
=1)
574 print("done_dcbz ===============")
577 ld_data
, exctype
, exc
= yield from pi_ld(pi
, addr
, 8, msr
=msr
)
578 print("ld_data after dcbz")
581 assert exctype
is None
584 print("=== alignment error (ld) ===")
586 ld_data
, exctype
, exc
= yield from pi_ld(pi
, addr
, 8, msr
=msr
)
588 alignment
= exc
.alignment
589 happened
= exc
.happened
590 yield # wait for dsr to update
596 assert (happened
== 1)
597 assert (alignment
== 1)
599 assert (exctype
== "fast")
600 yield from wait_busy(pi
, debug
="pi_ld_E_alignment_error")
601 # wait is only needed in case of in exception here
602 print("=== alignment error test passed (ld) ===")
604 # take some cycles in between so that gtkwave separates out
611 print("=== alignment error (st) ===")
613 exctype
, exc
= yield from pi_st(pi
, addr
,0, 8, msr
=msr
)
615 alignment
= exc
.alignment
616 happened
= exc
.happened
620 assert (happened
== 1)
621 assert (alignment
==1)
623 assert (exctype
== "fast")
624 #???? yield from wait_busy(pi, debug="pi_st_E_alignment_error")
625 # wait is only needed in case of in exception here
626 print("=== alignment error test passed (st) ===")
630 print("=== no alignment error (ld) ===")
632 ld_data
, exctype
, exc
= yield from pi_ld(pi
, addr
, 8, msr
=msr
)
633 print("ld_data", ld_data
, exctype
, exc
)
635 alignment
= exc
.alignment
636 happened
= exc
.happened
640 assert (happened
== 0)
641 assert (alignment
== 0)
642 print("=== no alignment error done (ld) ===")
645 addrs
= [0x456920,0xa7a180,0x299420,0x1d9d60]
648 print("== RANDOM addr ==",hex(addr
))
649 ld_data
, exctype
, exc
= yield from pi_ld(pi
, addr
, 8, msr
=msr
)
650 print("ld_data[RANDOM]",ld_data
,exc
,addr
)
651 assert (exctype
== None)
654 print("== RANDOM addr ==",hex(addr
))
655 exc
= yield from pi_st(pi
, addr
,0xFF*addr
, 8, msr
=msr
)
656 assert (exctype
== None)
658 # readback written data and compare
660 print("== RANDOM addr ==",hex(addr
))
661 ld_data
, exctype
, exc
= yield from pi_ld(pi
, addr
, 8, msr
=msr
)
662 print("ld_data[RANDOM_READBACK]",ld_data
,exc
,addr
)
663 assert (exctype
== None)
664 assert (ld_data
== 0xFF*addr
)
666 print("== RANDOM addr done ==")
671 def _test_loadstore1_ifetch_invalid(dut
, mem
):
672 mmu
= dut
.submodules
.mmu
673 ldst
= dut
.submodules
.ldst
675 icache
= dut
.submodules
.ldst
.icache
678 print("=== test loadstore instruction (invalid) ===")
684 # first virtual memory test
686 print ("set process table")
687 yield from debug(dut
, "set prtbl")
688 yield mmu
.rin
.prtbl
.eq(0x1000000) # set process table
691 yield from debug(dut
, "real mem instruction")
692 # set address to zero, update mem[0] to 01234
694 expected_insn
= 0x1234
695 mem
[addr
] = expected_insn
697 yield i_in
.priv_mode
.eq(1)
699 yield i_in
.nia
.eq(addr
)
700 yield i_in
.stop_mark
.eq(0)
701 yield i_m_in
.tlbld
.eq(0)
702 yield i_m_in
.tlbie
.eq(0)
703 yield i_m_in
.addr
.eq(0)
704 yield i_m_in
.pte
.eq(0)
709 # miss, stalls for a bit
711 yield i_in
.nia
.eq(addr
)
713 valid
= yield i_out
.valid
714 nia
= yield i_out
.nia
717 valid
= yield i_out
.valid
720 nia
= yield i_out
.nia
721 insn
= yield i_out
.insn
726 print ("fetched %x from addr %x" % (insn
, nia
))
727 assert insn
== expected_insn
729 print("=== test loadstore instruction (virtual) ===")
730 yield from debug(dut
, "virtual instr req")
732 # look up i-cache expecting it to fail
734 # set address to 0x10200, update mem[] to 5678
736 real_addr
= virt_addr
737 expected_insn
= 0x5678
738 mem
[real_addr
] = expected_insn
740 yield i_in
.priv_mode
.eq(1)
741 yield i_in
.virt_mode
.eq(1)
743 yield i_in
.nia
.eq(virt_addr
)
744 yield i_in
.stop_mark
.eq(0)
745 yield i_m_in
.tlbld
.eq(0)
746 yield i_m_in
.tlbie
.eq(0)
747 yield i_m_in
.addr
.eq(0)
748 yield i_m_in
.pte
.eq(0)
753 # miss, stalls for a bit
755 yield i_in
.nia
.eq(virt_addr
)
757 valid
= yield i_out
.valid
758 failed
= yield i_out
.fetch_failed
759 while not valid
and not failed
:
761 valid
= yield i_out
.valid
762 failed
= yield i_out
.fetch_failed
765 print ("failed?", "yes" if failed
else "no")
770 print("=== test invalid loadstore instruction (instruction fault) ===")
772 yield from debug(dut
, "instr fault (perm err expected)")
775 yield ldst
.priv_mode
.eq(0)
776 yield ldst
.instr_fault
.eq(1)
777 yield ldst
.maddr
.eq(virt_addr
)
778 #ld_data, exctype, exc = yield from pi_ld(pi, virt_addr, 8, msr=msr)
780 yield ldst
.instr_fault
.eq(0)
782 done
= yield (ldst
.done
)
783 exc_info
= yield from get_exception_info(pi
.exc_o
)
784 if done
or exc_info
.happened
:
787 assert exc_info
.happened
== 1 # different here as expected
789 # TODO: work out what kind of exception occurred and check it's
790 # the right one. we *expect* it to be a permissions error because
791 # the RPTE leaf node in pagetables.test2 is marked as "non-executable"
792 # but we also expect instr_fault to be set because it is an instruction
794 print (" MMU lookup exception type?")
795 for fname
in LDSTExceptionTuple
._fields
:
796 print (" fname %20s %d" % (fname
, getattr(exc_info
, fname
)))
798 # ok now printed them out and visually inspected: check them with asserts
799 assert exc_info
.instr_fault
== 1 # instruction fault (yes!)
800 assert exc_info
.perm_error
== 1 # permissions (yes!)
801 assert exc_info
.rc_error
== 0
802 assert exc_info
.alignment
== 0
803 assert exc_info
.invalid
== 0
804 assert exc_info
.segment_fault
== 0
805 assert exc_info
.rc_error
== 0
807 yield from debug(dut
, "test done")
808 yield ldst
.instr_fault
.eq(0)
816 def test_loadstore1_ifetch_unit_iface():
818 m
, cmpi
= setup_mmu()
820 mem
= pagetables
.test1
822 # set this up before passing to Simulator (which calls elaborate)
823 icache
= m
.submodules
.ldst
.icache
824 icache
.use_fetch_interface() # this is the function which converts
825 # to FetchUnitInterface. *including*
826 # rewiring the Wishbone Bus to ibus
832 sim
.add_sync_process(wrap(_test_loadstore1_ifetch_iface(m
, mem
)))
833 # add two wb_get processes onto the *same* memory dictionary.
834 # this shouuuld work.... cross-fingers...
835 sim
.add_sync_process(wrap(wb_get(cmpi
.wb_bus(), mem
)))
836 sim
.add_sync_process(wrap(wb_get(icache
.ibus
, mem
))) # ibus not bus
837 with sim
.write_vcd('test_loadstore1_ifetch_iface.vcd',
838 traces
=[m
.debug_status
]): # include extra debug
842 def test_loadstore1_ifetch():
844 m
, cmpi
= setup_mmu()
846 mem
= pagetables
.test1
852 icache
= m
.submodules
.ldst
.icache
853 sim
.add_sync_process(wrap(_test_loadstore1_ifetch(m
, mem
)))
854 # add two wb_get processes onto the *same* memory dictionary.
855 # this shouuuld work.... cross-fingers...
856 sim
.add_sync_process(wrap(wb_get(cmpi
.wb_bus(), mem
)))
857 sim
.add_sync_process(wrap(wb_get(icache
.bus
, mem
)))
858 with sim
.write_vcd('test_loadstore1_ifetch.vcd',
859 traces
=[m
.debug_status
]): # include extra debug
863 def test_loadstore1():
865 m
, cmpi
= setup_mmu()
867 mem
= pagetables
.test1
873 sim
.add_sync_process(wrap(_test_loadstore1(m
, mem
)))
874 sim
.add_sync_process(wrap(wb_get(cmpi
.wb_bus(), mem
)))
875 with sim
.write_vcd('test_loadstore1.vcd'):
879 def test_loadstore1_microwatt_mmu_bin_test2():
881 m
, cmpi
= setup_mmu()
883 mem
= pagetables
.microwatt_test2
889 sim
.add_sync_process(wrap(_test_loadstore1_microwatt_mmu_bin_test2(m
, mem
)))
890 sim
.add_sync_process(wrap(wb_get(cmpi
.wb_bus(), mem
)))
891 with sim
.write_vcd('test_loadstore1.vcd'):
894 def test_loadstore1_misalign():
896 m
, cmpi
= setup_mmu()
898 mem
= pagetables
.microwatt_test2
904 ###########1122334455667788
905 mem
[0] = 0x0102030405060708
907 sim
.add_sync_process(wrap(_test_loadstore1_misalign(m
, mem
)))
908 sim
.add_sync_process(wrap(wb_get(cmpi
.wb_bus(), mem
)))
909 with sim
.write_vcd('test_loadstore1_misalign.vcd'):
913 def test_loadstore1_invalid():
915 m
, cmpi
= setup_mmu()
923 sim
.add_sync_process(wrap(_test_loadstore1_invalid(m
, mem
)))
924 sim
.add_sync_process(wrap(wb_get(cmpi
.wb_bus(), mem
)))
925 with sim
.write_vcd('test_loadstore1_invalid.vcd'):
929 def test_loadstore1_ifetch_invalid():
930 m
, cmpi
= setup_mmu()
932 # this is a specially-arranged page table which has the permissions
933 # barred for execute on the leaf node (EAA=0x2 instead of EAA=0x3)
934 mem
= pagetables
.test2
940 icache
= m
.submodules
.ldst
.icache
941 sim
.add_sync_process(wrap(_test_loadstore1_ifetch_invalid(m
, mem
)))
942 # add two wb_get processes onto the *same* memory dictionary.
943 # this shouuuld work.... cross-fingers...
944 sim
.add_sync_process(wrap(wb_get(cmpi
.wb_bus(), mem
)))
945 sim
.add_sync_process(wrap(wb_get(icache
.bus
, mem
)))
946 with sim
.write_vcd('test_loadstore1_ifetch_invalid.vcd',
947 traces
=[m
.debug_status
]): # include extra debug
951 def test_loadstore1_ifetch_multi():
952 m
, cmpi
= setup_mmu()
955 # this is a specially-arranged page table which has the permissions
956 # barred for execute on the leaf node (EAA=0x2 instead of EAA=0x3)
957 mem
= pagetables
.test1
959 # set this up before passing to Simulator (which calls elaborate)
960 icache
= m
.submodules
.ldst
.icache
961 icache
.use_fetch_interface() # this is the function which converts
962 # to FetchUnitInterface. *including*
963 # rewiring the Wishbone Bus to ibus
969 sim
.add_sync_process(wrap(_test_loadstore1_ifetch_multi(m
, mem
)))
970 # add two wb_get processes onto the *same* memory dictionary.
971 # this shouuuld work.... cross-fingers...
972 sim
.add_sync_process(wrap(wb_get(cmpi
.wb_bus(), mem
)))
973 sim
.add_sync_process(wrap(wb_get(icache
.ibus
, mem
))) # ibus not bus
974 with sim
.write_vcd('test_loadstore1_ifetch_multi.vcd',
975 traces
=[m
.debug_status
]): # include extra debug
978 if __name__
== '__main__':
980 #test_loadstore1_microwatt_mmu_bin_test2()
981 #test_loadstore1_invalid()
982 #test_loadstore1_ifetch() #FIXME
983 #test_loadstore1_ifetch_invalid()
984 #test_loadstore1_ifetch_unit_iface() # guess: should be working
985 #test_loadstore1_ifetch_multi()
986 test_loadstore1_misalign()