LOG_ADDR = 0b0110 # Log buffer address register
LOG_DATA = 0b0111 # Log buffer data register
CR = 0b1000 # CR (read only)
+ XER = 0b1001 # XER (read only) - note this is a TEMPORARY hack
# CTRL register (direct actions, write 1 to act, read back 0)
class DMIInterface(RecordObject):
- def __init__(self, name):
+ def __init__(self, name=None):
super().__init__(name=name)
self.addr_i = Signal(4) # DMI register address
- self.din = Signal(64) # DMI data in (if we=1)
- self.dout = Signal(64) # DMI data out (if we=0)
+ self.din = Signal(64) # DMI data write in (if we=1)
+ self.dout = Signal(64) # DMI data read out (if we=0)
self.req_i = Signal() # DMI request valid (stb)
self.we_i = Signal() # DMI write-enable
self.ack_o = Signal() # DMI ack request
+ def connect_to(self, other):
+ return [self.addr_i.eq(other.addr_i),
+ self.req_i.eq(other.req_i),
+ self.we_i.eq(other.we_i),
+ self.din.eq(other.din),
+ other.ack_o.eq(self.ack_o),
+ other.dout.eq(self.dout),
+ ]
class DbgReg(RecordObject):
def __init__(self, name):
self.state = CoreState("core_dbg")
# GSPR register read port
- self.dbg_gpr = DbgReg("dbg_gpr")
+ self.d_gpr = DbgReg("d_gpr")
# CR register read port
- self.dbg_cr = DbgReg("dbg_cr")
+ self.d_cr = DbgReg("d_cr")
+
+ # XER register read port
+ self.d_xer = DbgReg("d_xer")
# Core logging data
self.log_data_i = Signal(256)
m = Module()
comb, sync = m.d.comb, m.d.sync
- dmi, dbg_gpr, dbg_cr = self.dmi, self.dbg_gpr, self.dbg_cr
+ dmi, d_gpr, d_cr, d_xer, = self.dmi, self.d_gpr, self.d_cr, self.d_xer
# DMI needs fixing... make a one clock pulse
dmi_req_i_1 = Signal()
do_icreset = Signal()
terminated = Signal()
do_gspr_rd = Signal()
- gspr_index = Signal.like(dbg_gpr.addr)
+ gspr_index = Signal.like(d_gpr.addr)
log_dmi_addr = Signal(32)
log_dmi_data = Signal(64)
# Single cycle register accesses on DMI except for GSPR data
with m.Switch(dmi.addr_i):
with m.Case(DBGCore.GSPR_DATA):
- comb += dmi.ack_o.eq(dbg_gpr.ack)
- comb += dbg_gpr.req.eq(dmi.req_i)
+ comb += dmi.ack_o.eq(d_gpr.ack)
+ comb += d_gpr.req.eq(dmi.req_i)
with m.Case(DBGCore.CR):
- comb += dmi.ack_o.eq(dbg_cr.ack)
- comb += dbg_cr.req.eq(dmi.req_i)
+ comb += dmi.ack_o.eq(d_cr.ack)
+ comb += d_cr.req.eq(dmi.req_i)
+ with m.Case(DBGCore.XER):
+ comb += dmi.ack_o.eq(d_xer.ack)
+ comb += d_xer.req.eq(dmi.req_i)
with m.Default():
comb += dmi.ack_o.eq(dmi.req_i)
with m.Case( DBGCore.MSR):
comb += dmi.dout.eq(self.state.msr)
with m.Case( DBGCore.GSPR_DATA):
- comb += dmi.dout.eq(dbg_gpr.data)
+ comb += dmi.dout.eq(d_gpr.data)
with m.Case( DBGCore.LOG_ADDR):
comb += dmi.dout.eq(Cat(log_dmi_addr, self.log_write_addr_o))
with m.Case( DBGCore.LOG_DATA):
comb += dmi.dout.eq(log_dmi_data)
with m.Case(DBGCore.CR):
- comb += dmi.dout.eq(dbg_cr.data)
+ comb += dmi.dout.eq(d_cr.data)
+ with m.Case(DBGCore.XER):
+ comb += dmi.dout.eq(d_xer.data)
# DMI writes
# Reset the 1-cycle "do" signals
sync += stopping.eq(1)
sync += terminated.eq(1)
- comb += dbg_gpr.addr.eq(gspr_index)
+ comb += d_gpr.addr.eq(gspr_index)
# Core control signals generated by the debug module
comb += self.core_stop_o.eq(stopping & ~do_step)
yield self.terminate_i
yield self.core_stopped_i
yield from self.state
- yield from self.dbg_gpr
+ yield from self.d_gpr
+ yield from self.d_cr
+ yield from self.d_xer
yield self.log_data_i
yield self.log_read_addr_i
yield self.log_read_data_o