53b92ebe0f1069ff56062908d56c7df66c7e3ffa
1 from nmigen
import Elaboratable
, Module
, Signal
, Record
4 from ...csr
import AutoCSR
, CSR
5 from ...wishbone
import wishbone_layout
6 from .controller
import DebugController
7 from .jtag
import JTAGReg
, dtmcs_layout
, dmi_layout
, jtag_layout
8 from .regfile
import DebugRegisterFile
9 from .wbmaster
import wishbone_layout
, DebugWishboneMaster
11 from jtagtap
import JTAGTap
13 __all__
= ["DebugUnit"]
17 JTAGReg
.IDCODE
: [("value", 32)],
18 JTAGReg
.DTMCS
: dtmcs_layout
,
19 JTAGReg
.DMI
: dmi_layout
23 class DebugUnit(Elaboratable
, AutoCSR
):
25 self
.jtag
= Record(jtag_layout
)
26 self
.dbus
= Record(wishbone_layout
)
28 self
.trigger_haltreq
= Signal()
30 self
.x_ebreak
= Signal()
31 self
.x_pc
= Signal(32)
32 self
.x_stall
= Signal()
34 self
.m_branch_taken
= Signal()
35 self
.m_branch_target
= Signal(32)
36 self
.m_mret
= Signal()
37 self
.m_exception
= Signal()
38 self
.m_pc
= Signal(32)
39 self
.m_valid
= Signal()
40 self
.mepc_r_base
= Signal(30)
41 self
.mtvec_r_base
= Signal(30)
43 self
.dcsr_step
= Signal()
44 self
.dcsr_ebreakm
= Signal()
45 self
.dpc_value
= Signal(32)
48 self
.halted
= Signal()
49 self
.killall
= Signal()
50 self
.resumereq
= Signal()
51 self
.resumeack
= Signal()
53 self
.dbus_busy
= Signal()
55 self
.csrf_addr
= Signal(12)
56 self
.csrf_re
= Signal()
57 self
.csrf_dat_r
= Signal(32)
58 self
.csrf_we
= Signal()
59 self
.csrf_dat_w
= Signal(32)
61 self
.gprf_addr
= Signal(5)
62 self
.gprf_re
= Signal()
63 self
.gprf_dat_r
= Signal(32)
64 self
.gprf_we
= Signal()
65 self
.gprf_dat_w
= Signal(32)
67 def elaborate(self
, platform
):
70 tap
= m
.submodules
.tap
= JTAGTap(jtag_regs
)
71 regfile
= m
.submodules
.regfile
= DebugRegisterFile(tap
.regs
[JTAGReg
.DMI
])
72 controller
= m
.submodules
.controller
= DebugController(regfile
)
73 wbmaster
= m
.submodules
.wbmaster
= DebugWishboneMaster(regfile
)
76 tap
.port
.connect(self
.jtag
),
77 tap
.regs
[JTAGReg
.IDCODE
].r
.eq(0x10e31913), # Usurpate a Spike core for now.
78 tap
.regs
[JTAGReg
.DTMCS
].r
.eq(0x61) # (abits=6, version=1) TODO
82 controller
.trigger_haltreq
.eq(self
.trigger_haltreq
),
84 controller
.x_ebreak
.eq(self
.x_ebreak
),
85 controller
.x_pc
.eq(self
.x_pc
),
86 controller
.x_stall
.eq(self
.x_stall
),
88 controller
.m_branch_taken
.eq(self
.m_branch_taken
),
89 controller
.m_branch_target
.eq(self
.m_branch_target
),
90 controller
.m_pc
.eq(self
.m_pc
),
91 controller
.m_valid
.eq(self
.m_valid
),
93 self
.halt
.eq(controller
.halt
),
94 controller
.halted
.eq(self
.halted
),
95 self
.killall
.eq(controller
.killall
),
96 self
.resumereq
.eq(controller
.resumereq
),
97 controller
.resumeack
.eq(self
.resumeack
),
99 self
.dcsr_step
.eq(controller
.dcsr
.r
.step
),
100 self
.dcsr_ebreakm
.eq(controller
.dcsr
.r
.ebreakm
),
101 self
.dpc_value
.eq(controller
.dpc
.r
.value
),
103 self
.csrf_addr
.eq(controller
.csrf_addr
),
104 self
.csrf_re
.eq(controller
.csrf_re
),
105 controller
.csrf_dat_r
.eq(self
.csrf_dat_r
),
106 self
.csrf_we
.eq(controller
.csrf_we
),
107 self
.csrf_dat_w
.eq(controller
.csrf_dat_w
),
109 self
.gprf_addr
.eq(controller
.gprf_addr
),
110 self
.gprf_re
.eq(controller
.gprf_re
),
111 controller
.gprf_dat_r
.eq(self
.gprf_dat_r
),
112 self
.gprf_we
.eq(controller
.gprf_we
),
113 self
.gprf_dat_w
.eq(controller
.gprf_dat_w
),
117 wbmaster
.bus
.connect(self
.dbus
),
118 self
.dbus_busy
.eq(wbmaster
.dbus_busy
)