yield port1.st.ok.eq(0)
yield from wait_busy(port1, True) # wait while busy
+# copy of pi_st
+def pi_dcbz(port1, addr, data, datalen, msr_pr=0):
+
+ # have to wait until not busy
+ yield from wait_busy(port1, no=False) # wait until not busy
+
+ # set up a ST on the port. address first:
+ yield port1.is_st_i.eq(1) # indicate ST
+ yield port1.data_len.eq(datalen) # ST length (1/2/4/8)
+ yield port1.msr_pr.eq(msr_pr) # MSR PR bit (1==>virt, 0==>real)
+
+ yield port1.is_dcbz.eq(1) # set dcbz
+
+ yield port1.addr.data.eq(addr) # set address
+ yield port1.addr.ok.eq(1) # set ok
+ yield Settle()
+ yield from wait_addr(port1) # wait until addr ok
+ # yield # not needed, just for checking
+ # yield # not needed, just for checking
+ # assert "ST" for one cycle (required by the API)
+ yield port1.st.data.eq(data)
+ yield port1.st.ok.eq(1)
+ yield
+ yield port1.st.ok.eq(0)
+ yield from wait_busy(port1, True) # wait while busy
+
# can go straight to reset.
yield port1.is_st_i.eq(0) # end
yield port1.addr.ok.eq(0) # set !ok
+ yield port1.is_dcbz.eq(0) # reset dcbz too
def pi_ld(port1, addr, datalen, msr_pr=0):
from nmigen.sim.cxxsim import Simulator, Delay, Settle
from nmutil.util import wrap
-from soc.config.test.test_pi2ls import pi_ld, pi_st, pi_ldst
+from soc.config.test.test_pi2ls import pi_ld, pi_st, pi_ldst, pi_dcbz
from soc.config.test.test_loadstore import TestMemPspec
from soc.config.loadstore import ConfigMemoryPortInterface
yield mmu.rin.prtbl.eq(0x1000000) # set process table
yield
- ###### TODO
- #yield from pi_dcbz(pi, addr, data, 8, msr_pr=1)
- #yield
+ addr = 0
+ data = 0 # FIXME
+ # size ==, msr_pr TODO
+
+ yield from pi_dcbz(pi, addr, data, 8, msr_pr=1)
+ yield
yield
stop = True
sim.add_sync_process(wrap(_test_dcbz_addr_zero(m, mem)))
sim.add_sync_process(wrap(wb_get(cmpi.wb_bus(), mem)))
- with sim.write_vcd('test_ldst_pi_random2.vcd'):
+ with sim.write_vcd('test_dcbz_addr_zero.vcd'):
sim.run()
if __name__ == '__main__':