self.lsui_busy = Signal()
self.valid_l = SRLatch(False, name="valid")
- def set_wr_addr(self, m, addr, mask, misalign):
+ def set_wr_addr(self, m, addr, mask, misalign, msr_pr):
m.d.comb += self.valid_l.s.eq(1)
m.d.comb += self.lsui.x_mask_i.eq(mask)
m.d.comb += self.lsui.x_addr_i.eq(addr)
- def set_rd_addr(self, m, addr, mask, misalign):
+ def set_rd_addr(self, m, addr, mask, misalign, msr_pr):
m.d.comb += self.valid_l.s.eq(1)
m.d.comb += self.lsui.x_mask_i.eq(mask)
m.d.comb += self.lsui.x_addr_i.eq(addr)
def connect_port(self, inport):
return self.pi.connect_port(inport)
- def set_wr_addr(self, m, addr, mask, misalign): pass
- def set_rd_addr(self, m, addr, mask, misalign): pass
+ def set_wr_addr(self, m, addr, mask, misalign, msr_pr): pass
+ def set_rd_addr(self, m, addr, mask, misalign, msr_pr): pass
def set_wr_data(self, m, data, wen): pass
def get_rd_data(self, m): pass
pi = self.pi
comb += lds.eq(pi.is_ld_i) # ld-req signals
comb += sts.eq(pi.is_st_i) # st-req signals
+ pr = pi.msr_pr # MSR problem state: PR=1 ==> virt, PR==0 ==> priv
# detect busy "edge"
busy_delay = Signal()
misalign = Signal()
comb += misalign.eq(lenexp.lexp_o[8:].bool())
+
# activate mode: only on "edge"
comb += ld_active.s.eq(rising_edge(m, lds)) # activate LD mode
comb += st_active.s.eq(rising_edge(m, sts)) # activate ST mode
comb += lenexp.len_i.eq(pi.data_len)
comb += lenexp.addr_i.eq(lsbaddr)
with m.If(pi.addr.ok & adrok_l.qn):
- self.set_rd_addr(m, pi.addr.data, lenexp.lexp_o, misalign)
+ self.set_rd_addr(m, pi.addr.data, lenexp.lexp_o, misalign, pr)
comb += pi.addr_ok_o.eq(1) # acknowledge addr ok
sync += adrok_l.s.eq(1) # and pull "ack" latch
comb += lenexp.len_i.eq(pi.data_len)
comb += lenexp.addr_i.eq(lsbaddr)
with m.If(pi.addr.ok):
- self.set_wr_addr(m, pi.addr.data, lenexp.lexp_o, misalign)
+ self.set_wr_addr(m, pi.addr.data, lenexp.lexp_o, misalign, pr)
with m.If(adrok_l.qn):
comb += pi.addr_ok_o.eq(1) # acknowledge addr ok
sync += adrok_l.s.eq(1) # and pull "ack" latch
# hard-code memory addressing width to 6 bits
self.mem = TestMemory(regwid, 5, granularity=regwid//8, init=False)
- def set_wr_addr(self, m, addr, mask, misalign):
+ def set_wr_addr(self, m, addr, mask, misalign, msr_pr):
lsbaddr, msbaddr = self.splitaddr(addr)
m.d.comb += self.mem.wrport.addr.eq(msbaddr)
- def set_rd_addr(self, m, addr, mask, misalign):
+ def set_rd_addr(self, m, addr, mask, misalign, msr_pr):
lsbaddr, msbaddr = self.splitaddr(addr)
m.d.comb += self.mem.rdport.addr.eq(msbaddr)
super().__init__(regwid, addrwid)
self.ldst = LDSTSplitter(32, 48, 4)
- def set_wr_addr(self, m, addr, mask, misalign):
+ def set_wr_addr(self, m, addr, mask, misalign, msr_pr):
m.d.comb += self.ldst.addr_i.eq(addr)
- def set_rd_addr(self, m, addr, mask, misalign):
+ def set_rd_addr(self, m, addr, mask, misalign, msr_pr):
m.d.comb += self.ldst.addr_i.eq(addr)
def set_wr_data(self, m, data, wen):
# will take at least one week (10.10.2020)
# many unconnected signals
+
class TestMicrowattMemoryPortInterface(PortInterfaceBase):
"""TestMicrowattMemoryPortInterface
This is a Test Class for MMU and DCache conforming to PortInterface
"""
- def __init__(self, mmu, dcache, regwid=64, addrwid=4,):
+ def __init__(self, mmu, dcache, regwid=64, addrwid=4):
super().__init__(regwid, addrwid)
self.mmu = mmu
self.dcache = dcache
- def set_wr_addr(self, m, addr, mask, misalign):
+ def set_wr_addr(self, m, addr, mask, misalign, msr_pr):
m.d.comb += self.dcache.d_in.addr.eq(addr)
m.d.comb += self.mmu.l_in.addr.eq(addr)
m.d.comb += self.mmu.l_in.load.eq(0)
- m.d.comb += self.mmu.l_in.priv.eq(1)
+ m.d.comb += self.mmu.l_in.priv.eq(1) # TODO put msr_pr here
m.d.comb += self.mmu.l_in.valid.eq(1)
- def set_rd_addr(self, m, addr, mask, misalign):
+ def set_rd_addr(self, m, addr, mask, misalign, msr_pr):
m.d.comb += self.dcache.d_in.addr.eq(addr)
m.d.comb += self.mmu.l_in.addr.eq(addr)
m.d.comb += self.mmu.l_in.load.eq(1)
- m.d.comb += self.mmu.l_in.priv.eq(1)
+ m.d.comb += self.mmu.l_in.priv.eq(1) # TODO put msr_pr here
m.d.comb += self.mmu.l_in.valid.eq(1)
def set_wr_data(self, m, data, wen):
#self.nia = Signal(64)
#self.srr1 = Signal(16)
- def set_wr_addr(self, m, addr, mask, misalign):
+ def set_wr_addr(self, m, addr, mask, misalign, msr_pr):
m.d.comb += self.load.eq(0) # store operation
m.d.comb += self.d_out.load.eq(0)
m.d.comb += self.byte_sel.eq(mask)
m.d.comb += self.addr.eq(addr)
+ m.d.comb += self.priv_mode.eq(~msr_pr) # not-problem ==> priv
+ m.d.comb += self.virt_mode.eq(msr_pr) # problem-state ==> virt
m.d.comb += self.align_intr.eq(misalign)
# option to disable the cache entirely for write
if self.disable_cache:
m.d.comb += self.nc.eq(1)
return None
- def set_rd_addr(self, m, addr, mask, misalign):
+ def set_rd_addr(self, m, addr, mask, misalign, msr_pr):
m.d.comb += self.d_valid.eq(1)
m.d.comb += self.d_out.valid.eq(self.d_validblip)
m.d.comb += self.load.eq(1) # load operation
m.d.comb += self.byte_sel.eq(mask)
m.d.comb += self.align_intr.eq(misalign)
m.d.comb += self.addr.eq(addr)
+ m.d.comb += self.priv_mode.eq(~msr_pr) # not-problem ==> priv
+ m.d.comb += self.virt_mode.eq(msr_pr) # problem-state ==> virt
# BAD HACK! disable cacheing on LD when address is 0xCxxx_xxxx
# this is for peripherals. same thing done in Microwatt loadstore1.vhdl
with m.If(addr[28:] == Const(0xc, 4)):