1 |
11 |
dinesha |
/// Copyright by Syntacore LLC © 2016-2020. See LICENSE for details
|
2 |
|
|
/// @file
|
3 |
|
|
/// @brief Debug Module (DM)
|
4 |
|
|
///
|
5 |
|
|
|
6 |
|
|
//------------------------------------------------------------------------------
|
7 |
|
|
//
|
8 |
|
|
// Functionality:
|
9 |
|
|
// - Allows debugger to perform a system reset (ndm_rst)
|
10 |
|
|
// - Allows debugger to control the HART's state
|
11 |
|
|
// - Provides debugger with information about the current HART's state
|
12 |
|
|
// - Provides debugger with Abstract Command interface that allows to:
|
13 |
|
|
// - Access MPRF registers
|
14 |
|
|
// - Access CSR registers
|
15 |
|
|
// - Access memory with the same view and permission as the hart has
|
16 |
|
|
// - Provides debugger with Abstract Command status information (busy flag and error code)
|
17 |
|
|
// - Provides debugger with Program Buffer functionality that allows to execute
|
18 |
|
|
// small programs on a halted HART
|
19 |
|
|
//
|
20 |
|
|
// Structure:
|
21 |
|
|
// - DM <-> DMI interface
|
22 |
|
|
// - DM registers:
|
23 |
|
|
// - DMCONTROL
|
24 |
|
|
// - DMSTATUS
|
25 |
|
|
// - Abstract Command Control logic
|
26 |
|
|
// - Abstract Command FSM
|
27 |
|
|
// - Abstract Command Status logic
|
28 |
|
|
// - Abstract Instruction logic
|
29 |
|
|
// - Abstract registers:
|
30 |
|
|
// - COMMAND
|
31 |
|
|
// - ABSTRACTAUTO
|
32 |
|
|
// - PROGBUF0..5
|
33 |
|
|
// - DATA0..1
|
34 |
|
|
// - DHI FSM
|
35 |
|
|
// - HART command registers
|
36 |
|
|
// - DHI interface
|
37 |
|
|
//
|
38 |
|
|
//
|
39 |
|
|
|
40 |
|
|
`include "scr1_arch_description.svh"
|
41 |
|
|
|
42 |
|
|
`ifdef SCR1_DBG_EN
|
43 |
|
|
`include "scr1_csr.svh"
|
44 |
|
|
`include "scr1_dm.svh"
|
45 |
|
|
|
46 |
|
|
module scr1_dm (
|
47 |
|
|
// System
|
48 |
|
|
input logic rst_n, // DM reset
|
49 |
|
|
input logic clk, // DM clock
|
50 |
|
|
|
51 |
|
|
// DM internal interface
|
52 |
|
|
input logic dmi2dm_req_i, // DMI request
|
53 |
|
|
input logic dmi2dm_wr_i, // DMI write
|
54 |
|
|
input logic [SCR1_DBG_DMI_ADDR_WIDTH-1:0] dmi2dm_addr_i, // DMI address
|
55 |
|
|
input logic [SCR1_DBG_DMI_DATA_WIDTH-1:0] dmi2dm_wdata_i, // DMI write data
|
56 |
|
|
output logic dm2dmi_resp_o, // DMI response
|
57 |
|
|
output logic [SCR1_DBG_DMI_DATA_WIDTH-1:0] dm2dmi_rdata_o, // DMI read data
|
58 |
|
|
|
59 |
|
|
// DM <-> Pipeline: HART Run Control i/f
|
60 |
|
|
output logic ndm_rst_n_o, // Non-DM Reset output
|
61 |
|
|
output logic hart_rst_n_o, // HART reset output
|
62 |
|
|
output logic dm2pipe_active_o, // Debug Module active flag
|
63 |
|
|
output logic dm2pipe_cmd_req_o, // Request to pipe
|
64 |
|
|
output type_scr1_hdu_dbgstates_e dm2pipe_cmd_o, // Command to pipe
|
65 |
|
|
input logic pipe2dm_cmd_resp_i, // Response to Debug Module
|
66 |
|
|
input logic pipe2dm_cmd_rcode_i, // HART Command return code: 0 - Ok; 1 - Error
|
67 |
|
|
input logic pipe2dm_hart_event_i, // HART event flag
|
68 |
|
|
input type_scr1_hdu_hartstatus_s pipe2dm_hart_status_i, // HART Status
|
69 |
|
|
|
70 |
|
|
input logic [`SCR1_XLEN-1:0] soc2dm_fuse_mhartid_i, // RO MHARTID value
|
71 |
|
|
input logic [`SCR1_XLEN-1:0] pipe2dm_pc_sample_i, // RO PC value for sampling
|
72 |
|
|
|
73 |
|
|
// HART Abstract Command / Program Buffer i/f
|
74 |
|
|
input logic [SCR1_HDU_PBUF_ADDR_WIDTH-1:0] pipe2dm_pbuf_addr_i, // Program Buffer address
|
75 |
|
|
output logic [SCR1_HDU_CORE_INSTR_WIDTH-1:0] dm2pipe_pbuf_instr_o, // Program Buffer instruction
|
76 |
|
|
|
77 |
|
|
// HART Abstract Data regs i/f
|
78 |
|
|
input logic pipe2dm_dreg_req_i, // Abstract Data Register request
|
79 |
|
|
input logic pipe2dm_dreg_wr_i, // Abstract Data Register write
|
80 |
|
|
input logic [`SCR1_XLEN-1:0] pipe2dm_dreg_wdata_i, // Abstract Data Register write data
|
81 |
|
|
output logic dm2pipe_dreg_resp_o, // Abstract Data Register response
|
82 |
|
|
output logic dm2pipe_dreg_fail_o, // Abstract Data Register fail - possibly not needed ?
|
83 |
|
|
output logic [`SCR1_XLEN-1:0] dm2pipe_dreg_rdata_o // Abstract Data Register read data
|
84 |
|
|
);
|
85 |
|
|
|
86 |
|
|
//------------------------------------------------------------------------------
|
87 |
|
|
// Local types declaration
|
88 |
|
|
//------------------------------------------------------------------------------
|
89 |
|
|
|
90 |
|
|
typedef enum logic [3:0] {
|
91 |
|
|
ABS_STATE_IDLE,
|
92 |
|
|
ABS_STATE_ERR,
|
93 |
|
|
ABS_STATE_EXEC,
|
94 |
|
|
ABS_STATE_XREG_RW,
|
95 |
|
|
ABS_STATE_MEM_SAVE_XREG,
|
96 |
|
|
ABS_STATE_MEM_SAVE_XREG_FORADDR,
|
97 |
|
|
ABS_STATE_MEM_RW,
|
98 |
|
|
ABS_STATE_MEM_RETURN_XREG,
|
99 |
|
|
ABS_STATE_MEM_RETURN_XREG_FORADDR,
|
100 |
|
|
ABS_STATE_CSR_RO,
|
101 |
|
|
ABS_STATE_CSR_SAVE_XREG,
|
102 |
|
|
ABS_STATE_CSR_RW,
|
103 |
|
|
ABS_STATE_CSR_RETURN_XREG
|
104 |
|
|
} type_scr1_abs_fsm_e;
|
105 |
|
|
|
106 |
|
|
typedef enum logic [2:0] {
|
107 |
|
|
DHI_STATE_IDLE,
|
108 |
|
|
DHI_STATE_EXEC,
|
109 |
|
|
DHI_STATE_EXEC_RUN,
|
110 |
|
|
DHI_STATE_EXEC_HALT,
|
111 |
|
|
DHI_STATE_HALT_REQ,
|
112 |
|
|
DHI_STATE_RESUME_REQ,
|
113 |
|
|
DHI_STATE_RESUME_RUN
|
114 |
|
|
} type_scr1_dhi_fsm_e;
|
115 |
|
|
|
116 |
21 |
dinesha |
//typedef enum logic [SCR1_DBG_ABSTRACTCS_CMDERR_WDTH:0] {
|
117 |
|
|
parameter ABS_ERR_NONE = (SCR1_DBG_ABSTRACTCS_CMDERR_WDTH+1)'('d0);
|
118 |
|
|
parameter ABS_ERR_BUSY = (SCR1_DBG_ABSTRACTCS_CMDERR_WDTH+1)'('d1);
|
119 |
|
|
parameter ABS_ERR_CMD = (SCR1_DBG_ABSTRACTCS_CMDERR_WDTH+1)'('d2);
|
120 |
|
|
parameter ABS_ERR_EXCEPTION = (SCR1_DBG_ABSTRACTCS_CMDERR_WDTH+1)'('d3);
|
121 |
|
|
parameter ABS_ERR_NOHALT = (SCR1_DBG_ABSTRACTCS_CMDERR_WDTH+1)'('d4);
|
122 |
|
|
//} type_scr1_abs_err_e;
|
123 |
11 |
dinesha |
|
124 |
|
|
|
125 |
|
|
//------------------------------------------------------------------------------
|
126 |
|
|
// Local parameters declaration
|
127 |
|
|
//------------------------------------------------------------------------------
|
128 |
|
|
|
129 |
|
|
// Abstract instruction opcode parameters
|
130 |
|
|
localparam SCR1_OP_SYSTEM = 7'b111_0011;
|
131 |
|
|
localparam SCR1_OP_LOAD = 7'b000_0011;
|
132 |
|
|
localparam SCR1_OP_STORE = 7'b010_0011;
|
133 |
|
|
|
134 |
|
|
// Abstract instruction funct3 parameters
|
135 |
|
|
localparam SCR1_FUNCT3_CSRRW = 3'b001;
|
136 |
|
|
localparam SCR1_FUNCT3_CSRRS = 3'b010;
|
137 |
|
|
localparam SCR1_FUNCT3_SB = 3'b000;
|
138 |
|
|
localparam SCR1_FUNCT3_SH = 3'b001;
|
139 |
|
|
localparam SCR1_FUNCT3_SW = 3'b010;
|
140 |
|
|
localparam SCR1_FUNCT3_LW = 3'b010;
|
141 |
|
|
localparam SCR1_FUNCT3_LBU = 3'b100;
|
142 |
|
|
localparam SCR1_FUNCT3_LHU = 3'b101;
|
143 |
|
|
|
144 |
|
|
// DMCONTROL parameters
|
145 |
|
|
//------------------------------------------------------------------------------
|
146 |
|
|
localparam DMCONTROL_HARTRESET = 1'd0;
|
147 |
|
|
localparam DMCONTROL_RESERVEDB = 1'd0;
|
148 |
|
|
localparam DMCONTROL_HASEL = 1'd0;
|
149 |
|
|
localparam DMCONTROL_HARTSELLO = 1'd0;
|
150 |
|
|
localparam DMCONTROL_HARTSELHI = 1'd0;
|
151 |
|
|
localparam DMCONTROL_RESERVEDA = 1'd0;
|
152 |
|
|
|
153 |
|
|
// DMSTATUS parameters
|
154 |
|
|
//------------------------------------------------------------------------------
|
155 |
|
|
localparam DMSTATUS_RESERVEDC = 1'd0;
|
156 |
|
|
localparam DMSTATUS_IMPEBREAK = 1'd1;
|
157 |
|
|
localparam DMSTATUS_RESERVEDB = 1'd0;
|
158 |
|
|
localparam DMSTATUS_ALLUNAVAIL = 1'd0;
|
159 |
|
|
localparam DMSTATUS_ANYUNAVAIL = 1'd0;
|
160 |
|
|
localparam DMSTATUS_ALLANYUNAVAIL = 1'd0;
|
161 |
|
|
localparam DMSTATUS_ALLANYNONEXIST = 1'b0;
|
162 |
|
|
localparam DMSTATUS_AUTHENTICATED = 1'd1;
|
163 |
|
|
localparam DMSTATUS_AUTHBUSY = 1'd0;
|
164 |
|
|
localparam DMSTATUS_RESERVEDA = 1'd0;
|
165 |
|
|
localparam DMSTATUS_DEVTREEVALID = 1'd0;
|
166 |
|
|
localparam DMSTATUS_VERSION = 2'd2;
|
167 |
|
|
|
168 |
|
|
// HARTINFO parameters
|
169 |
|
|
//------------------------------------------------------------------------------
|
170 |
|
|
localparam HARTINFO_RESERVEDB = 1'd0;
|
171 |
|
|
localparam HARTINFO_NSCRATCH = 4'd1;
|
172 |
|
|
localparam HARTINFO_RESERVEDA = 1'd0;
|
173 |
|
|
localparam HARTINFO_DATAACCESS = 1'd0;
|
174 |
|
|
localparam HARTINFO_DATASIZE = 4'd1;
|
175 |
|
|
localparam HARTINFO_DATAADDR = 12'h7b2;
|
176 |
|
|
|
177 |
|
|
// ABSTRACTCS parameters
|
178 |
|
|
//------------------------------------------------------------------------------
|
179 |
|
|
localparam ABSTRACTCS_RESERVEDD = 1'd0;
|
180 |
|
|
localparam ABSTRACTCS_PROGBUFSIZE = 5'd6;
|
181 |
|
|
localparam ABSTRACTCS_RESERVEDC = 1'd0;
|
182 |
|
|
localparam ABSTRACTCS_RESERVEDB = 1'd0;
|
183 |
|
|
localparam ABSTRACTCS_RESERVEDA = 1'd0;
|
184 |
|
|
localparam ABSTRACTCS_DATACOUNT = 4'd2;
|
185 |
|
|
|
186 |
|
|
localparam ABS_CMD_HARTREG = 1'd0;
|
187 |
|
|
localparam ABS_CMD_HARTMEM = 2'd2;
|
188 |
|
|
localparam ABS_CMD_HARTREG_CSR = 4'b0000;
|
189 |
|
|
localparam ABS_CMD_HARTREG_INTFPU = 4'b0001;
|
190 |
|
|
localparam ABS_CMD_HARTREG_INT = 7'b000_0000;
|
191 |
|
|
localparam ABS_CMD_HARTREG_FPU = 7'b000_0001;
|
192 |
|
|
localparam ABS_EXEC_EBREAK = 32'b000000000001_00000_000_00000_1110011;
|
193 |
|
|
|
194 |
|
|
//------------------------------------------------------------------------------
|
195 |
|
|
// Local signals declaration
|
196 |
|
|
//------------------------------------------------------------------------------
|
197 |
|
|
|
198 |
|
|
// DM <-> DMI interface internal signals
|
199 |
|
|
//------------------------------------------------------------------------------
|
200 |
|
|
|
201 |
|
|
// Register selection signals
|
202 |
|
|
logic dmi_req_dmcontrol;
|
203 |
|
|
logic dmi_req_abstractcs;
|
204 |
|
|
logic dmi_req_abstractauto;
|
205 |
|
|
logic dmi_req_command;
|
206 |
|
|
logic dmi_rpt_command;
|
207 |
|
|
logic dmi_req_data0;
|
208 |
|
|
logic dmi_req_data1;
|
209 |
|
|
logic dmi_req_progbuf0;
|
210 |
|
|
logic dmi_req_progbuf1;
|
211 |
|
|
logic dmi_req_progbuf2;
|
212 |
|
|
logic dmi_req_progbuf3;
|
213 |
|
|
logic dmi_req_progbuf4;
|
214 |
|
|
logic dmi_req_progbuf5;
|
215 |
|
|
|
216 |
|
|
logic dmi_req_any;
|
217 |
|
|
|
218 |
|
|
// Registers write request signals
|
219 |
|
|
logic dmcontrol_wr_req;
|
220 |
|
|
logic abstractcs_wr_req;
|
221 |
|
|
logic data0_wr_req;
|
222 |
|
|
logic data1_wr_req;
|
223 |
|
|
logic dreg_wr_req;
|
224 |
|
|
logic command_wr_req;
|
225 |
|
|
logic autoexec_wr_req;
|
226 |
|
|
logic progbuf0_wr_req;
|
227 |
|
|
logic progbuf1_wr_req;
|
228 |
|
|
logic progbuf2_wr_req;
|
229 |
|
|
logic progbuf3_wr_req;
|
230 |
|
|
logic progbuf4_wr_req;
|
231 |
|
|
logic progbuf5_wr_req;
|
232 |
|
|
|
233 |
|
|
// DM registers
|
234 |
|
|
//------------------------------------------------------------------------------
|
235 |
|
|
|
236 |
|
|
// DM clock enable signals
|
237 |
|
|
logic clk_en_dm;
|
238 |
|
|
logic clk_en_dm_ff;
|
239 |
|
|
|
240 |
|
|
// DMCONTROL register signals
|
241 |
|
|
logic dmcontrol_haltreq_ff;
|
242 |
|
|
logic dmcontrol_haltreq_next;
|
243 |
|
|
logic dmcontrol_resumereq_ff;
|
244 |
|
|
logic dmcontrol_resumereq_next;
|
245 |
|
|
logic dmcontrol_ackhavereset_ff;
|
246 |
|
|
logic dmcontrol_ackhavereset_next;
|
247 |
|
|
logic dmcontrol_ndmreset_ff;
|
248 |
|
|
logic dmcontrol_ndmreset_next;
|
249 |
|
|
logic dmcontrol_dmactive_ff;
|
250 |
|
|
logic dmcontrol_dmactive_next;
|
251 |
|
|
|
252 |
|
|
// Auxilary Skip Reset On Powerup register
|
253 |
|
|
logic havereset_skip_pwrup_ff;
|
254 |
|
|
logic havereset_skip_pwrup_next;
|
255 |
|
|
|
256 |
|
|
// DMSTATUS register signals
|
257 |
|
|
logic dmstatus_allany_havereset_ff;
|
258 |
|
|
logic dmstatus_allany_havereset_next;
|
259 |
|
|
logic dmstatus_allany_resumeack_ff;
|
260 |
|
|
logic dmstatus_allany_resumeack_next;
|
261 |
|
|
logic dmstatus_allany_halted_ff;
|
262 |
|
|
logic dmstatus_allany_halted_next;
|
263 |
|
|
|
264 |
|
|
// Abstract command control logic signals
|
265 |
|
|
//------------------------------------------------------------------------------
|
266 |
|
|
|
267 |
|
|
logic [SCR1_DBG_DMI_DATA_WIDTH-1:0] abs_cmd;
|
268 |
|
|
|
269 |
|
|
logic abs_cmd_csr_ro;
|
270 |
|
|
logic [SCR1_DBG_COMMAND_TYPE_WDTH:0] abs_cmd_type;
|
271 |
|
|
logic abs_cmd_regacs;
|
272 |
|
|
logic [SCR1_DBG_COMMAND_ACCESSREG_REGNO_HI-12:0] abs_cmd_regtype;
|
273 |
|
|
logic [6:0] abs_cmd_regfile;
|
274 |
|
|
logic abs_cmd_regwr;
|
275 |
|
|
logic [SCR1_DBG_COMMAND_ACCESSREG_SIZE_WDTH:0] abs_cmd_regsize;
|
276 |
|
|
logic abs_cmd_execprogbuf;
|
277 |
|
|
logic abs_cmd_regvalid;
|
278 |
|
|
logic [2:0] abs_cmd_memsize;
|
279 |
|
|
logic abs_cmd_memwr;
|
280 |
|
|
logic abs_cmd_memvalid;
|
281 |
|
|
|
282 |
|
|
logic abs_cmd_regsize_vd;
|
283 |
|
|
logic abs_cmd_memsize_vd;
|
284 |
|
|
|
285 |
|
|
logic abs_cmd_wr_ff;
|
286 |
|
|
logic abs_cmd_wr_next;
|
287 |
|
|
logic abs_cmd_postexec_ff;
|
288 |
|
|
logic abs_cmd_postexec_next;
|
289 |
|
|
logic [11:0] abs_cmd_regno;
|
290 |
|
|
logic [11:0] abs_cmd_regno_ff;
|
291 |
|
|
logic [1:0] abs_cmd_size_ff;
|
292 |
|
|
logic [1:0] abs_cmd_size_next;
|
293 |
|
|
|
294 |
|
|
logic abs_reg_access_csr;
|
295 |
|
|
logic abs_reg_access_mprf;
|
296 |
|
|
|
297 |
|
|
logic abs_cmd_hartreg_vd;
|
298 |
|
|
logic abs_cmd_hartmem_vd;
|
299 |
|
|
|
300 |
|
|
logic abs_cmd_reg_access_req;
|
301 |
|
|
logic abs_cmd_csr_access_req;
|
302 |
|
|
logic abs_cmd_mprf_access_req;
|
303 |
|
|
logic abs_cmd_execprogbuf_req;
|
304 |
|
|
|
305 |
|
|
logic abs_cmd_csr_ro_access_vd;
|
306 |
|
|
logic abs_cmd_csr_rw_access_vd;
|
307 |
|
|
logic abs_cmd_mprf_access_vd;
|
308 |
|
|
logic abs_cmd_mem_access_vd;
|
309 |
|
|
|
310 |
|
|
// Abstract FSM signals
|
311 |
|
|
//------------------------------------------------------------------------------
|
312 |
|
|
|
313 |
|
|
type_scr1_abs_fsm_e abs_fsm_ff;
|
314 |
|
|
type_scr1_abs_fsm_e abs_fsm_next;
|
315 |
|
|
logic abs_fsm_idle;
|
316 |
|
|
logic abs_fsm_exec;
|
317 |
|
|
logic abs_fsm_csr_ro;
|
318 |
|
|
logic abs_fsm_err;
|
319 |
|
|
logic abs_fsm_use_addr;
|
320 |
|
|
|
321 |
|
|
// Abstract registers
|
322 |
|
|
//------------------------------------------------------------------------------
|
323 |
|
|
|
324 |
|
|
logic clk_en_abs;
|
325 |
|
|
|
326 |
|
|
// ABSTRACTCS register signals
|
327 |
|
|
logic abstractcs_busy;
|
328 |
|
|
logic abstractcs_ro_en;
|
329 |
|
|
|
330 |
|
|
// COMMAND register signals
|
331 |
|
|
logic [`SCR1_XLEN-1:0] abs_command_ff;
|
332 |
|
|
logic [`SCR1_XLEN-1:0] abs_command_next;
|
333 |
|
|
|
334 |
|
|
// ABSTRACTAUTO register signals
|
335 |
|
|
logic abs_autoexec_ff;
|
336 |
|
|
logic abs_autoexec_next;
|
337 |
|
|
|
338 |
|
|
// Program buffer registers
|
339 |
|
|
logic [`SCR1_XLEN-1:0] abs_progbuf0_ff;
|
340 |
|
|
logic [`SCR1_XLEN-1:0] abs_progbuf1_ff;
|
341 |
|
|
logic [`SCR1_XLEN-1:0] abs_progbuf2_ff;
|
342 |
|
|
logic [`SCR1_XLEN-1:0] abs_progbuf3_ff;
|
343 |
|
|
logic [`SCR1_XLEN-1:0] abs_progbuf4_ff;
|
344 |
|
|
logic [`SCR1_XLEN-1:0] abs_progbuf5_ff;
|
345 |
|
|
|
346 |
|
|
// Data 0/1 registers
|
347 |
|
|
logic data0_xreg_save;
|
348 |
|
|
logic [`SCR1_XLEN-1:0] abs_data0_ff;
|
349 |
|
|
logic [`SCR1_XLEN-1:0] abs_data0_next;
|
350 |
|
|
logic [`SCR1_XLEN-1:0] abs_data1_ff;
|
351 |
|
|
logic [`SCR1_XLEN-1:0] abs_data1_next;
|
352 |
|
|
|
353 |
|
|
// Abstract command status logic signals
|
354 |
|
|
//------------------------------------------------------------------------------
|
355 |
|
|
|
356 |
|
|
// Abstract error exception flag register
|
357 |
|
|
logic abs_err_exc_upd;
|
358 |
|
|
logic abs_err_exc_ff;
|
359 |
|
|
logic abs_err_exc_next;
|
360 |
|
|
|
361 |
|
|
logic abs_err_acc_busy_upd;
|
362 |
|
|
logic abs_err_acc_busy_ff;
|
363 |
|
|
logic abs_err_acc_busy_next;
|
364 |
|
|
|
365 |
21 |
dinesha |
logic [SCR1_DBG_ABSTRACTCS_CMDERR_WDTH:0] abstractcs_cmderr_ff;
|
366 |
|
|
logic [SCR1_DBG_ABSTRACTCS_CMDERR_WDTH:0] abstractcs_cmderr_next;
|
367 |
11 |
dinesha |
|
368 |
|
|
// Abstract instruction signals
|
369 |
|
|
//------------------------------------------------------------------------------
|
370 |
|
|
|
371 |
|
|
// Abstract instruction execution request register
|
372 |
|
|
logic abs_exec_req_next;
|
373 |
|
|
logic abs_exec_req_ff;
|
374 |
|
|
|
375 |
|
|
// Abstract instruction register
|
376 |
|
|
logic [4:0] abs_instr_rd;
|
377 |
|
|
logic [4:0] abs_instr_rs1;
|
378 |
|
|
logic [4:0] abs_instr_rs2;
|
379 |
|
|
logic [2:0] abs_instr_mem_funct3;
|
380 |
|
|
logic [`SCR1_XLEN-1:0] abs_exec_instr_next;
|
381 |
|
|
logic [`SCR1_XLEN-1:0] abs_exec_instr_ff;
|
382 |
|
|
|
383 |
|
|
// DHI FSM signals
|
384 |
|
|
//------------------------------------------------------------------------------
|
385 |
|
|
|
386 |
|
|
type_scr1_dhi_fsm_e dhi_fsm_next;
|
387 |
|
|
type_scr1_dhi_fsm_e dhi_fsm_ff;
|
388 |
|
|
type_scr1_dhi_fsm_e dhi_req;
|
389 |
|
|
|
390 |
|
|
logic dhi_fsm_idle;
|
391 |
|
|
logic dhi_fsm_exec;
|
392 |
|
|
logic dhi_fsm_exec_halt;
|
393 |
|
|
logic dhi_fsm_halt_req;
|
394 |
|
|
logic dhi_fsm_resume_req;
|
395 |
|
|
|
396 |
|
|
// DHI interface signals
|
397 |
|
|
//------------------------------------------------------------------------------
|
398 |
|
|
|
399 |
|
|
logic cmd_resp_ok;
|
400 |
|
|
logic hart_rst_unexp;
|
401 |
|
|
logic halt_req_vd;
|
402 |
|
|
logic resume_req_vd;
|
403 |
|
|
|
404 |
|
|
logic dhi_resp;
|
405 |
|
|
logic dhi_resp_exc;
|
406 |
|
|
|
407 |
|
|
logic hart_pbuf_ebreak_ff;
|
408 |
|
|
logic hart_pbuf_ebreak_next;
|
409 |
|
|
|
410 |
|
|
// HART command registers
|
411 |
|
|
//------------------------------------------------------------------------------
|
412 |
|
|
|
413 |
|
|
logic hart_cmd_req_ff;
|
414 |
|
|
logic hart_cmd_req_next;
|
415 |
|
|
|
416 |
|
|
type_scr1_hdu_dbgstates_e hart_cmd_ff;
|
417 |
|
|
type_scr1_hdu_dbgstates_e hart_cmd_next;
|
418 |
|
|
|
419 |
|
|
// HART state signals
|
420 |
|
|
//------------------------------------------------------------------------------
|
421 |
|
|
|
422 |
|
|
logic hart_state_reset;
|
423 |
|
|
logic hart_state_run;
|
424 |
|
|
logic hart_state_drun;
|
425 |
|
|
logic hart_state_dhalt;
|
426 |
|
|
|
427 |
|
|
//------------------------------------------------------------------------------
|
428 |
|
|
// DM <-> DMI interface
|
429 |
|
|
//------------------------------------------------------------------------------
|
430 |
|
|
|
431 |
|
|
// Register selection logic
|
432 |
|
|
//------------------------------------------------------------------------------
|
433 |
|
|
|
434 |
|
|
always_comb begin
|
435 |
|
|
dmi_req_dmcontrol = dmi2dm_req_i & (dmi2dm_addr_i == SCR1_DBG_DMCONTROL);
|
436 |
|
|
dmi_req_abstractcs = dmi2dm_req_i & (dmi2dm_addr_i == SCR1_DBG_ABSTRACTCS);
|
437 |
|
|
dmi_req_abstractauto = dmi2dm_req_i & (dmi2dm_addr_i == SCR1_DBG_ABSTRACTAUTO);
|
438 |
|
|
dmi_req_data0 = dmi2dm_req_i & (dmi2dm_addr_i == SCR1_DBG_DATA0);
|
439 |
|
|
dmi_req_data1 = dmi2dm_req_i & (dmi2dm_addr_i == SCR1_DBG_DATA1);
|
440 |
|
|
dmi_req_command = dmi2dm_req_i & (dmi2dm_addr_i == SCR1_DBG_COMMAND);
|
441 |
|
|
dmi_rpt_command = (abs_autoexec_ff & dmi_req_data0);
|
442 |
|
|
dmi_req_progbuf0 = dmi2dm_req_i & (dmi2dm_addr_i == SCR1_DBG_PROGBUF0);
|
443 |
|
|
dmi_req_progbuf1 = dmi2dm_req_i & (dmi2dm_addr_i == SCR1_DBG_PROGBUF1);
|
444 |
|
|
dmi_req_progbuf2 = dmi2dm_req_i & (dmi2dm_addr_i == SCR1_DBG_PROGBUF2);
|
445 |
|
|
dmi_req_progbuf3 = dmi2dm_req_i & (dmi2dm_addr_i == SCR1_DBG_PROGBUF3);
|
446 |
|
|
dmi_req_progbuf4 = dmi2dm_req_i & (dmi2dm_addr_i == SCR1_DBG_PROGBUF4);
|
447 |
|
|
dmi_req_progbuf5 = dmi2dm_req_i & (dmi2dm_addr_i == SCR1_DBG_PROGBUF5);
|
448 |
|
|
end
|
449 |
|
|
|
450 |
|
|
assign dmi_req_any = dmi_req_command | dmi_rpt_command | dmi_req_abstractauto
|
451 |
|
|
| dmi_req_data0 | dmi_req_data1 | dmi_req_progbuf0
|
452 |
|
|
| dmi_req_progbuf1 | dmi_req_progbuf2 | dmi_req_progbuf3
|
453 |
|
|
| dmi_req_progbuf4 | dmi_req_progbuf5;
|
454 |
|
|
|
455 |
|
|
|
456 |
|
|
// Read data multiplexer
|
457 |
|
|
//------------------------------------------------------------------------------
|
458 |
|
|
|
459 |
|
|
always_comb begin
|
460 |
|
|
dm2dmi_rdata_o = '0;
|
461 |
|
|
|
462 |
|
|
case (dmi2dm_addr_i)
|
463 |
|
|
SCR1_DBG_DMSTATUS: begin
|
464 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_RESERVEDC_HI:
|
465 |
|
|
SCR1_DBG_DMSTATUS_RESERVEDC_LO] = DMSTATUS_RESERVEDC;
|
466 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_IMPEBREAK] = DMSTATUS_IMPEBREAK;
|
467 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_RESERVEDB_HI:
|
468 |
|
|
SCR1_DBG_DMSTATUS_RESERVEDB_LO] = DMSTATUS_RESERVEDB;
|
469 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_ALLHAVERESET] = dmstatus_allany_havereset_ff;
|
470 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_ANYHAVERESET] = dmstatus_allany_havereset_ff;
|
471 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_ALLRESUMEACK] = dmstatus_allany_resumeack_ff;
|
472 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_ANYRESUMEACK] = dmstatus_allany_resumeack_ff;
|
473 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_ALLNONEXISTENT] = DMSTATUS_ALLANYNONEXIST;
|
474 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_ANYNONEXISTENT] = DMSTATUS_ALLANYNONEXIST;
|
475 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_ALLUNAVAIL] = DMSTATUS_ALLANYUNAVAIL;
|
476 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_ANYUNAVAIL] = DMSTATUS_ALLANYUNAVAIL;
|
477 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_ALLRUNNING] = ~dmstatus_allany_halted_ff;
|
478 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_ANYRUNNING] = ~dmstatus_allany_halted_ff;
|
479 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_ALLHALTED] = dmstatus_allany_halted_ff;
|
480 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_ANYHALTED] = dmstatus_allany_halted_ff;
|
481 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_AUTHENTICATED] = DMSTATUS_AUTHENTICATED;
|
482 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_AUTHBUSY] = DMSTATUS_AUTHBUSY;
|
483 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_RESERVEDA] = DMSTATUS_RESERVEDA;
|
484 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_DEVTREEVALID] = DMSTATUS_DEVTREEVALID;
|
485 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMSTATUS_VERSION_HI:
|
486 |
|
|
SCR1_DBG_DMSTATUS_VERSION_LO] = DMSTATUS_VERSION;;
|
487 |
|
|
end
|
488 |
|
|
|
489 |
|
|
SCR1_DBG_DMCONTROL: begin
|
490 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMCONTROL_HALTREQ] = dmcontrol_haltreq_ff;
|
491 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMCONTROL_RESUMEREQ] = dmcontrol_resumereq_ff;
|
492 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMCONTROL_HARTRESET] = DMCONTROL_HARTRESET;
|
493 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMCONTROL_ACKHAVERESET] = dmcontrol_ackhavereset_ff;
|
494 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMCONTROL_RESERVEDB] = DMCONTROL_RESERVEDB;
|
495 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMCONTROL_HASEL] = DMCONTROL_HASEL;
|
496 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMCONTROL_HARTSELLO_HI:
|
497 |
|
|
SCR1_DBG_DMCONTROL_HARTSELLO_LO] = DMCONTROL_HARTSELLO;
|
498 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMCONTROL_HARTSELHI_HI:
|
499 |
|
|
SCR1_DBG_DMCONTROL_HARTSELHI_LO] = DMCONTROL_HARTSELHI;
|
500 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMCONTROL_RESERVEDA_HI:
|
501 |
|
|
SCR1_DBG_DMCONTROL_RESERVEDA_LO] = DMCONTROL_RESERVEDA;
|
502 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMCONTROL_NDMRESET] = dmcontrol_ndmreset_ff;
|
503 |
|
|
dm2dmi_rdata_o[SCR1_DBG_DMCONTROL_DMACTIVE] = dmcontrol_dmactive_ff;
|
504 |
|
|
end
|
505 |
|
|
|
506 |
|
|
SCR1_DBG_ABSTRACTCS: begin
|
507 |
|
|
dm2dmi_rdata_o[SCR1_DBG_ABSTRACTCS_RESERVEDD_HI:
|
508 |
|
|
SCR1_DBG_ABSTRACTCS_RESERVEDD_LO] = ABSTRACTCS_RESERVEDD;
|
509 |
|
|
dm2dmi_rdata_o[SCR1_DBG_ABSTRACTCS_PROGBUFSIZE_HI:
|
510 |
|
|
SCR1_DBG_ABSTRACTCS_PROGBUFSIZE_LO] = ABSTRACTCS_PROGBUFSIZE;
|
511 |
|
|
dm2dmi_rdata_o[SCR1_DBG_ABSTRACTCS_RESERVEDC_HI:
|
512 |
|
|
SCR1_DBG_ABSTRACTCS_RESERVEDC_LO] = ABSTRACTCS_RESERVEDC;
|
513 |
|
|
dm2dmi_rdata_o[SCR1_DBG_ABSTRACTCS_BUSY] = abstractcs_busy;
|
514 |
|
|
dm2dmi_rdata_o[SCR1_DBG_ABSTRACTCS_RESERVEDB] = ABSTRACTCS_RESERVEDB;
|
515 |
|
|
dm2dmi_rdata_o[SCR1_DBG_ABSTRACTCS_CMDERR_HI:
|
516 |
|
|
SCR1_DBG_ABSTRACTCS_CMDERR_LO] = abstractcs_cmderr_ff;
|
517 |
|
|
dm2dmi_rdata_o[SCR1_DBG_ABSTRACTCS_RESERVEDA_HI:
|
518 |
|
|
SCR1_DBG_ABSTRACTCS_RESERVEDA_LO] = ABSTRACTCS_RESERVEDA;
|
519 |
|
|
dm2dmi_rdata_o[SCR1_DBG_ABSTRACTCS_DATACOUNT_HI:
|
520 |
|
|
SCR1_DBG_ABSTRACTCS_DATACOUNT_LO] = ABSTRACTCS_DATACOUNT;
|
521 |
|
|
end
|
522 |
|
|
|
523 |
|
|
SCR1_DBG_HARTINFO: begin
|
524 |
|
|
dm2dmi_rdata_o[SCR1_DBG_HARTINFO_RESERVEDB_HI:
|
525 |
|
|
SCR1_DBG_HARTINFO_RESERVEDB_LO] = HARTINFO_RESERVEDB;
|
526 |
|
|
dm2dmi_rdata_o[SCR1_DBG_HARTINFO_NSCRATCH_HI:
|
527 |
|
|
SCR1_DBG_HARTINFO_NSCRATCH_LO] = HARTINFO_NSCRATCH;
|
528 |
|
|
dm2dmi_rdata_o[SCR1_DBG_HARTINFO_RESERVEDA_HI:
|
529 |
|
|
SCR1_DBG_HARTINFO_RESERVEDA_LO] = HARTINFO_RESERVEDA;
|
530 |
|
|
dm2dmi_rdata_o[SCR1_DBG_HARTINFO_DATAACCESS] = HARTINFO_DATAACCESS;
|
531 |
|
|
dm2dmi_rdata_o[SCR1_DBG_HARTINFO_DATASIZE_HI:
|
532 |
|
|
SCR1_DBG_HARTINFO_DATASIZE_LO] = HARTINFO_DATASIZE;
|
533 |
|
|
dm2dmi_rdata_o[SCR1_DBG_HARTINFO_DATAADDR_HI:
|
534 |
|
|
SCR1_DBG_HARTINFO_DATAADDR_LO] = HARTINFO_DATAADDR;
|
535 |
|
|
end
|
536 |
|
|
|
537 |
|
|
SCR1_DBG_ABSTRACTAUTO: dm2dmi_rdata_o[0] = abs_autoexec_ff;
|
538 |
|
|
SCR1_DBG_DATA0 : dm2dmi_rdata_o = abs_data0_ff;
|
539 |
|
|
SCR1_DBG_DATA1 : dm2dmi_rdata_o = abs_data1_ff;
|
540 |
|
|
SCR1_DBG_PROGBUF0 : dm2dmi_rdata_o = abs_progbuf0_ff;
|
541 |
|
|
SCR1_DBG_PROGBUF1 : dm2dmi_rdata_o = abs_progbuf1_ff;
|
542 |
|
|
SCR1_DBG_PROGBUF2 : dm2dmi_rdata_o = abs_progbuf2_ff;
|
543 |
|
|
SCR1_DBG_PROGBUF3 : dm2dmi_rdata_o = abs_progbuf3_ff;
|
544 |
|
|
SCR1_DBG_PROGBUF4 : dm2dmi_rdata_o = abs_progbuf4_ff;
|
545 |
|
|
SCR1_DBG_PROGBUF5 : dm2dmi_rdata_o = abs_progbuf5_ff;
|
546 |
|
|
SCR1_DBG_HALTSUM0 : dm2dmi_rdata_o[0] = dmstatus_allany_halted_ff;
|
547 |
|
|
|
548 |
|
|
default: begin
|
549 |
|
|
dm2dmi_rdata_o = '0;
|
550 |
|
|
end
|
551 |
|
|
endcase
|
552 |
|
|
end
|
553 |
|
|
|
554 |
|
|
// Response
|
555 |
|
|
assign dm2dmi_resp_o = 1'b1;
|
556 |
|
|
|
557 |
|
|
// Write requests signals
|
558 |
|
|
//------------------------------------------------------------------------------
|
559 |
|
|
|
560 |
|
|
assign dmcontrol_wr_req = dmi_req_dmcontrol & dmi2dm_wr_i;
|
561 |
|
|
assign data0_wr_req = dmi_req_data0 & dmi2dm_wr_i;
|
562 |
|
|
assign data1_wr_req = dmi_req_data1 & dmi2dm_wr_i;
|
563 |
|
|
assign dreg_wr_req = pipe2dm_dreg_req_i & pipe2dm_dreg_wr_i;
|
564 |
|
|
assign command_wr_req = dmi_req_command & dmi2dm_wr_i;
|
565 |
|
|
assign autoexec_wr_req = dmi_req_abstractauto & dmi2dm_wr_i;
|
566 |
|
|
assign progbuf0_wr_req = dmi_req_progbuf0 & dmi2dm_wr_i;
|
567 |
|
|
assign progbuf1_wr_req = dmi_req_progbuf1 & dmi2dm_wr_i;
|
568 |
|
|
assign progbuf2_wr_req = dmi_req_progbuf2 & dmi2dm_wr_i;
|
569 |
|
|
assign progbuf3_wr_req = dmi_req_progbuf3 & dmi2dm_wr_i;
|
570 |
|
|
assign progbuf4_wr_req = dmi_req_progbuf4 & dmi2dm_wr_i;
|
571 |
|
|
assign progbuf5_wr_req = dmi_req_progbuf5 & dmi2dm_wr_i;
|
572 |
|
|
assign abstractcs_wr_req = dmi_req_abstractcs & dmi2dm_wr_i;
|
573 |
|
|
|
574 |
|
|
// HART state signals
|
575 |
|
|
//------------------------------------------------------------------------------
|
576 |
|
|
|
577 |
|
|
assign hart_state_reset = (pipe2dm_hart_status_i.dbg_state == SCR1_HDU_DBGSTATE_RESET);
|
578 |
|
|
assign hart_state_run = (pipe2dm_hart_status_i.dbg_state == SCR1_HDU_DBGSTATE_RUN);
|
579 |
|
|
assign hart_state_dhalt = (pipe2dm_hart_status_i.dbg_state == SCR1_HDU_DBGSTATE_DHALTED);
|
580 |
|
|
assign hart_state_drun = (pipe2dm_hart_status_i.dbg_state == SCR1_HDU_DBGSTATE_DRUN);
|
581 |
|
|
|
582 |
|
|
//------------------------------------------------------------------------------
|
583 |
|
|
// DM registers
|
584 |
|
|
//------------------------------------------------------------------------------
|
585 |
|
|
//
|
586 |
|
|
// Registers:
|
587 |
|
|
// - DM clock enable register
|
588 |
|
|
// - Auxilary Skip Reset On Powerup register
|
589 |
|
|
// - DMCONTROL register
|
590 |
|
|
// - DMSTATUS register
|
591 |
|
|
|
592 |
|
|
// DM clock enable logic
|
593 |
|
|
//------------------------------------------------------------------------------
|
594 |
|
|
|
595 |
|
|
assign clk_en_dm = dmcontrol_wr_req | dmcontrol_dmactive_ff | clk_en_dm_ff;
|
596 |
|
|
|
597 |
|
|
always_ff @(posedge clk, negedge rst_n) begin
|
598 |
|
|
if (~rst_n) begin
|
599 |
|
|
clk_en_dm_ff <= 1'b0;
|
600 |
|
|
end else if (clk_en_dm) begin
|
601 |
|
|
clk_en_dm_ff <= dmcontrol_dmactive_ff;
|
602 |
|
|
end
|
603 |
|
|
end
|
604 |
|
|
|
605 |
|
|
assign dm2pipe_active_o = clk_en_dm_ff;
|
606 |
|
|
|
607 |
|
|
// DMCONTROL register
|
608 |
|
|
//------------------------------------------------------------------------------
|
609 |
|
|
|
610 |
|
|
always_ff @(posedge clk, negedge rst_n) begin
|
611 |
|
|
if (~rst_n) begin
|
612 |
|
|
dmcontrol_dmactive_ff <= 1'b0;
|
613 |
|
|
dmcontrol_ndmreset_ff <= 1'b0;
|
614 |
|
|
dmcontrol_ackhavereset_ff <= 1'b0;
|
615 |
|
|
dmcontrol_haltreq_ff <= 1'b0;
|
616 |
|
|
dmcontrol_resumereq_ff <= 1'b0;
|
617 |
|
|
end else if (clk_en_dm) begin
|
618 |
|
|
dmcontrol_dmactive_ff <= dmcontrol_dmactive_next;
|
619 |
|
|
dmcontrol_ndmreset_ff <= dmcontrol_ndmreset_next;
|
620 |
|
|
dmcontrol_ackhavereset_ff <= dmcontrol_ackhavereset_next;
|
621 |
|
|
dmcontrol_haltreq_ff <= dmcontrol_haltreq_next;
|
622 |
|
|
dmcontrol_resumereq_ff <= dmcontrol_resumereq_next;
|
623 |
|
|
end
|
624 |
|
|
end
|
625 |
|
|
|
626 |
|
|
assign dmcontrol_dmactive_next = dmcontrol_wr_req
|
627 |
|
|
? dmi2dm_wdata_i[SCR1_DBG_DMCONTROL_DMACTIVE]
|
628 |
|
|
: dmcontrol_dmactive_ff;
|
629 |
|
|
|
630 |
|
|
always_comb begin
|
631 |
|
|
dmcontrol_ndmreset_next = dmcontrol_ndmreset_ff;
|
632 |
|
|
dmcontrol_ackhavereset_next = dmcontrol_ackhavereset_ff;
|
633 |
|
|
dmcontrol_haltreq_next = dmcontrol_haltreq_ff;
|
634 |
|
|
dmcontrol_resumereq_next = dmcontrol_resumereq_ff;
|
635 |
|
|
if (~dmcontrol_dmactive_ff) begin
|
636 |
|
|
dmcontrol_ndmreset_next = 1'b0;
|
637 |
|
|
dmcontrol_ackhavereset_next = 1'b0;
|
638 |
|
|
dmcontrol_haltreq_next = 1'b0;
|
639 |
|
|
dmcontrol_resumereq_next = 1'b0;
|
640 |
|
|
end else if (dmcontrol_wr_req) begin
|
641 |
|
|
dmcontrol_ndmreset_next = dmi2dm_wdata_i[SCR1_DBG_DMCONTROL_NDMRESET];
|
642 |
|
|
dmcontrol_ackhavereset_next = dmi2dm_wdata_i[SCR1_DBG_DMCONTROL_ACKHAVERESET];
|
643 |
|
|
dmcontrol_haltreq_next = dmi2dm_wdata_i[SCR1_DBG_DMCONTROL_HALTREQ];
|
644 |
|
|
dmcontrol_resumereq_next = dmi2dm_wdata_i[SCR1_DBG_DMCONTROL_RESUMEREQ];
|
645 |
|
|
end
|
646 |
|
|
end
|
647 |
|
|
|
648 |
|
|
// Reset signal for system controlled by Debug Module
|
649 |
|
|
assign hart_rst_n_o = ~dmcontrol_ndmreset_ff;
|
650 |
|
|
assign ndm_rst_n_o = ~dmcontrol_ndmreset_ff;
|
651 |
|
|
|
652 |
|
|
// Skip reset on powerup register
|
653 |
|
|
//------------------------------------------------------------------------------
|
654 |
|
|
|
655 |
|
|
always_ff @(posedge clk, negedge rst_n) begin
|
656 |
|
|
if (~rst_n) begin
|
657 |
|
|
havereset_skip_pwrup_ff <= 1'b1;
|
658 |
|
|
end else if (clk_en_dm) begin
|
659 |
|
|
havereset_skip_pwrup_ff <= havereset_skip_pwrup_next;
|
660 |
|
|
end
|
661 |
|
|
end
|
662 |
|
|
|
663 |
|
|
assign havereset_skip_pwrup_next = ~dmcontrol_dmactive_ff ? 1'b1
|
664 |
|
|
: havereset_skip_pwrup_ff ? hart_state_reset & ndm_rst_n_o & hart_rst_n_o
|
665 |
|
|
: havereset_skip_pwrup_ff;
|
666 |
|
|
|
667 |
|
|
// DMSTATUS register
|
668 |
|
|
//------------------------------------------------------------------------------
|
669 |
|
|
|
670 |
|
|
always_ff @(posedge clk, negedge rst_n) begin
|
671 |
|
|
if (~rst_n) begin
|
672 |
|
|
dmstatus_allany_havereset_ff <= 1'b0;
|
673 |
|
|
dmstatus_allany_resumeack_ff <= 1'b0;
|
674 |
|
|
dmstatus_allany_halted_ff <= 1'b0;
|
675 |
|
|
end else if (clk_en_dm) begin
|
676 |
|
|
dmstatus_allany_havereset_ff <= dmstatus_allany_havereset_next;
|
677 |
|
|
dmstatus_allany_resumeack_ff <= dmstatus_allany_resumeack_next;
|
678 |
|
|
dmstatus_allany_halted_ff <= dmstatus_allany_halted_next;
|
679 |
|
|
end
|
680 |
|
|
end
|
681 |
|
|
|
682 |
|
|
assign dmstatus_allany_havereset_next = ~dmcontrol_dmactive_ff ? 1'b0
|
683 |
|
|
: ~havereset_skip_pwrup_ff & hart_state_reset ? 1'b1
|
684 |
|
|
: dmcontrol_ackhavereset_ff ? 1'b0
|
685 |
|
|
: dmstatus_allany_havereset_ff;
|
686 |
|
|
assign dmstatus_allany_resumeack_next = ~dmcontrol_dmactive_ff ? 1'b0
|
687 |
|
|
: ~dmcontrol_resumereq_ff ? 1'b0
|
688 |
|
|
: hart_state_run ? 1'b1
|
689 |
|
|
: dmstatus_allany_resumeack_ff;
|
690 |
|
|
|
691 |
|
|
assign dmstatus_allany_halted_next = ~dmcontrol_dmactive_ff ? 1'b0
|
692 |
|
|
: hart_state_dhalt ? 1'b1
|
693 |
|
|
: hart_state_run ? 1'b0
|
694 |
|
|
: dmstatus_allany_halted_ff;
|
695 |
|
|
|
696 |
|
|
//------------------------------------------------------------------------------
|
697 |
|
|
// Abstract Command control logic
|
698 |
|
|
//------------------------------------------------------------------------------
|
699 |
|
|
//
|
700 |
|
|
// Consists of the following functional units:
|
701 |
|
|
// - Abstract command decoder
|
702 |
|
|
// - Abstract command access valid flags
|
703 |
|
|
// - Abstract command control registers
|
704 |
|
|
|
705 |
|
|
assign clk_en_abs = clk_en_dm & dmcontrol_dmactive_ff;
|
706 |
|
|
|
707 |
|
|
// Abstract command decoder
|
708 |
|
|
//------------------------------------------------------------------------------
|
709 |
|
|
|
710 |
|
|
assign abs_cmd = dmi_req_command ? dmi2dm_wdata_i : abs_command_ff;
|
711 |
|
|
|
712 |
|
|
always_comb begin
|
713 |
|
|
abs_cmd_regno = abs_cmd[SCR1_DBG_COMMAND_ACCESSREG_REGNO_LO +: 12];
|
714 |
|
|
|
715 |
|
|
abs_cmd_csr_ro = (abs_cmd_regno == SCR1_CSR_ADDR_MISA)
|
716 |
|
|
| (abs_cmd_regno == SCR1_CSR_ADDR_MVENDORID)
|
717 |
|
|
| (abs_cmd_regno == SCR1_CSR_ADDR_MARCHID)
|
718 |
|
|
| (abs_cmd_regno == SCR1_CSR_ADDR_MIMPID)
|
719 |
|
|
| (abs_cmd_regno == SCR1_CSR_ADDR_MHARTID)
|
720 |
|
|
| (abs_cmd_regno == SCR1_HDU_DBGCSR_ADDR_DPC);
|
721 |
|
|
|
722 |
|
|
abs_cmd_type = abs_cmd[SCR1_DBG_COMMAND_TYPE_HI:SCR1_DBG_COMMAND_TYPE_LO];
|
723 |
|
|
abs_cmd_regacs = abs_cmd[SCR1_DBG_COMMAND_ACCESSREG_TRANSFER];
|
724 |
|
|
abs_cmd_regtype = abs_cmd[SCR1_DBG_COMMAND_ACCESSREG_REGNO_HI:12];
|
725 |
|
|
abs_cmd_regfile = abs_cmd[11:5];
|
726 |
|
|
abs_cmd_regsize = abs_cmd[SCR1_DBG_COMMAND_ACCESSREG_SIZE_HI:
|
727 |
|
|
SCR1_DBG_COMMAND_ACCESSREG_SIZE_LO];
|
728 |
|
|
abs_cmd_regwr = abs_cmd[SCR1_DBG_COMMAND_ACCESSREG_WRITE];
|
729 |
|
|
abs_cmd_execprogbuf = abs_cmd[SCR1_DBG_COMMAND_ACCESSREG_POSTEXEC];
|
730 |
|
|
|
731 |
|
|
abs_cmd_regvalid = ~(|{abs_cmd[SCR1_DBG_COMMAND_ACCESSREG_RESERVEDB],
|
732 |
|
|
abs_cmd[SCR1_DBG_COMMAND_ACCESSREG_RESERVEDA]});
|
733 |
|
|
|
734 |
|
|
abs_cmd_memsize = abs_cmd[SCR1_DBG_COMMAND_ACCESSMEM_AAMSIZE_HI:
|
735 |
|
|
SCR1_DBG_COMMAND_ACCESSMEM_AAMSIZE_LO];
|
736 |
|
|
abs_cmd_memwr = abs_cmd[SCR1_DBG_COMMAND_ACCESSMEM_WRITE];
|
737 |
|
|
|
738 |
|
|
abs_cmd_memvalid = ~(|{abs_cmd[SCR1_DBG_COMMAND_ACCESSMEM_AAMVIRTUAL],
|
739 |
|
|
abs_cmd[SCR1_DBG_COMMAND_ACCESSMEM_AAMPOSTINC],
|
740 |
|
|
abs_cmd[SCR1_DBG_COMMAND_ACCESSMEM_RESERVEDB_HI:
|
741 |
|
|
SCR1_DBG_COMMAND_ACCESSMEM_RESERVEDB_HI],
|
742 |
|
|
abs_cmd[SCR1_DBG_COMMAND_ACCESSMEM_RESERVEDA_HI:
|
743 |
|
|
SCR1_DBG_COMMAND_ACCESSMEM_RESERVEDA_HI]});
|
744 |
|
|
end
|
745 |
|
|
|
746 |
|
|
assign abs_reg_access_csr = (abs_cmd_regtype == ABS_CMD_HARTREG_CSR);
|
747 |
|
|
assign abs_reg_access_mprf = (abs_cmd_regtype == ABS_CMD_HARTREG_INTFPU)
|
748 |
|
|
& (abs_cmd_regfile == ABS_CMD_HARTREG_INT);
|
749 |
|
|
|
750 |
|
|
// Abstract command access request and valid flags
|
751 |
|
|
//------------------------------------------------------------------------------
|
752 |
|
|
|
753 |
|
|
assign abs_cmd_regsize_vd = (abs_cmd_regsize == 3'h2);
|
754 |
|
|
assign abs_cmd_memsize_vd = (abs_cmd_memsize < 3'h3);
|
755 |
|
|
|
756 |
|
|
assign abs_cmd_hartreg_vd = (abs_cmd_type == ABS_CMD_HARTREG) & abs_cmd_regvalid;
|
757 |
|
|
assign abs_cmd_hartmem_vd = (abs_cmd_type == ABS_CMD_HARTMEM) & abs_cmd_memvalid;
|
758 |
|
|
|
759 |
|
|
// Abstract command requests
|
760 |
|
|
assign abs_cmd_reg_access_req = abs_cmd_hartreg_vd & abs_cmd_regacs;
|
761 |
|
|
assign abs_cmd_csr_access_req = abs_cmd_reg_access_req & abs_reg_access_csr;
|
762 |
|
|
assign abs_cmd_mprf_access_req = abs_cmd_reg_access_req & abs_reg_access_mprf;
|
763 |
|
|
assign abs_cmd_execprogbuf_req = abs_cmd_hartreg_vd & abs_cmd_execprogbuf;
|
764 |
|
|
|
765 |
|
|
// Abstract command access valid flags
|
766 |
|
|
assign abs_cmd_csr_ro_access_vd = abs_cmd_csr_access_req & abs_cmd_regsize_vd & ~abs_cmd_regwr
|
767 |
|
|
& ~abs_cmd_execprogbuf & abs_cmd_csr_ro & hart_state_run;
|
768 |
|
|
assign abs_cmd_csr_rw_access_vd = abs_cmd_csr_access_req & abs_cmd_regsize_vd
|
769 |
|
|
& (abs_cmd_regwr | ~abs_cmd_csr_ro_access_vd);
|
770 |
|
|
assign abs_cmd_mprf_access_vd = abs_cmd_mprf_access_req & abs_cmd_regsize_vd;
|
771 |
|
|
assign abs_cmd_mem_access_vd = abs_cmd_hartmem_vd & abs_cmd_memsize_vd;
|
772 |
|
|
|
773 |
|
|
// Abstract command control registers
|
774 |
|
|
//------------------------------------------------------------------------------
|
775 |
|
|
|
776 |
|
|
always_ff @(posedge clk) begin
|
777 |
|
|
if (clk_en_abs & abs_fsm_idle) begin
|
778 |
|
|
abs_cmd_postexec_ff <= abs_cmd_postexec_next;
|
779 |
|
|
abs_cmd_wr_ff <= abs_cmd_wr_next;
|
780 |
|
|
abs_cmd_regno_ff <= abs_cmd_regno;
|
781 |
|
|
abs_cmd_size_ff <= abs_cmd_size_next;
|
782 |
|
|
end
|
783 |
|
|
end
|
784 |
|
|
|
785 |
|
|
always_comb begin
|
786 |
|
|
abs_cmd_wr_next = 1'b0;
|
787 |
|
|
abs_cmd_postexec_next = 1'b0;
|
788 |
|
|
abs_cmd_size_next = abs_cmd_size_ff;
|
789 |
|
|
if ((command_wr_req | dmi_rpt_command) & hart_state_dhalt & abs_fsm_idle) begin
|
790 |
|
|
if (abs_cmd_csr_rw_access_vd) begin
|
791 |
|
|
abs_cmd_wr_next = abs_cmd_regwr;
|
792 |
|
|
abs_cmd_postexec_next = abs_cmd_execprogbuf;
|
793 |
|
|
end else if (abs_cmd_mprf_access_vd) begin
|
794 |
|
|
abs_cmd_wr_next = abs_cmd_regwr;
|
795 |
|
|
abs_cmd_size_next = abs_cmd_regsize[1:0];
|
796 |
|
|
abs_cmd_postexec_next = abs_cmd_execprogbuf;
|
797 |
|
|
end else if (abs_cmd_mem_access_vd) begin
|
798 |
|
|
abs_cmd_wr_next = abs_cmd_memwr;
|
799 |
|
|
abs_cmd_size_next = abs_cmd_memsize[1:0];
|
800 |
|
|
end
|
801 |
|
|
end
|
802 |
|
|
end
|
803 |
|
|
|
804 |
|
|
//------------------------------------------------------------------------------
|
805 |
|
|
// Abstract command FSM
|
806 |
|
|
//------------------------------------------------------------------------------
|
807 |
|
|
|
808 |
|
|
always_ff @(posedge clk) begin
|
809 |
|
|
if (clk_en_dm) begin
|
810 |
|
|
if (~dmcontrol_dmactive_ff) begin
|
811 |
|
|
abs_fsm_ff <= ABS_STATE_IDLE;
|
812 |
|
|
end else begin
|
813 |
|
|
abs_fsm_ff <= abs_fsm_next;
|
814 |
|
|
end
|
815 |
|
|
end
|
816 |
|
|
end
|
817 |
|
|
|
818 |
|
|
always_comb begin
|
819 |
|
|
abs_fsm_next = abs_fsm_ff;
|
820 |
|
|
|
821 |
|
|
case (abs_fsm_ff)
|
822 |
|
|
ABS_STATE_IDLE: begin
|
823 |
|
|
if (command_wr_req | dmi_rpt_command) begin
|
824 |
|
|
case (1'b1)
|
825 |
|
|
abs_cmd_csr_ro_access_vd: abs_fsm_next = ABS_STATE_CSR_RO;
|
826 |
|
|
abs_cmd_csr_rw_access_vd: abs_fsm_next = hart_state_dhalt ? ABS_STATE_CSR_SAVE_XREG : ABS_STATE_ERR;
|
827 |
|
|
abs_cmd_mprf_access_vd : abs_fsm_next = hart_state_dhalt ? ABS_STATE_XREG_RW : ABS_STATE_ERR;
|
828 |
|
|
abs_cmd_execprogbuf_req : abs_fsm_next = ABS_STATE_EXEC;
|
829 |
|
|
abs_cmd_mem_access_vd : abs_fsm_next = hart_state_dhalt ? ABS_STATE_MEM_SAVE_XREG : ABS_STATE_ERR;
|
830 |
|
|
default : abs_fsm_next = ABS_STATE_ERR;
|
831 |
|
|
endcase
|
832 |
|
|
end
|
833 |
|
|
end
|
834 |
|
|
|
835 |
|
|
ABS_STATE_EXEC: begin
|
836 |
|
|
if (dhi_resp) begin
|
837 |
|
|
if (dhi_resp_exc | abs_err_acc_busy_ff) begin
|
838 |
|
|
abs_fsm_next = ABS_STATE_ERR;
|
839 |
|
|
end else begin
|
840 |
|
|
abs_fsm_next = ABS_STATE_IDLE;
|
841 |
|
|
end
|
842 |
|
|
end
|
843 |
|
|
end
|
844 |
|
|
|
845 |
|
|
ABS_STATE_XREG_RW: begin
|
846 |
|
|
if (dhi_resp) begin
|
847 |
|
|
case (1'b1)
|
848 |
|
|
abs_err_acc_busy_ff: abs_fsm_next = ABS_STATE_ERR;
|
849 |
|
|
abs_cmd_postexec_ff: abs_fsm_next = ABS_STATE_EXEC;
|
850 |
|
|
default : abs_fsm_next = ABS_STATE_IDLE;
|
851 |
|
|
endcase
|
852 |
|
|
end
|
853 |
|
|
end
|
854 |
|
|
|
855 |
|
|
ABS_STATE_CSR_RO : abs_fsm_next = abs_err_acc_busy_ff ? ABS_STATE_ERR : ABS_STATE_IDLE;
|
856 |
|
|
ABS_STATE_CSR_SAVE_XREG: abs_fsm_next = dhi_resp ? ABS_STATE_CSR_RW : ABS_STATE_CSR_SAVE_XREG;
|
857 |
|
|
ABS_STATE_CSR_RW : abs_fsm_next = dhi_resp ? ABS_STATE_CSR_RETURN_XREG : ABS_STATE_CSR_RW;
|
858 |
|
|
|
859 |
|
|
ABS_STATE_CSR_RETURN_XREG: begin
|
860 |
|
|
if (dhi_resp) begin
|
861 |
|
|
case (1'b1)
|
862 |
|
|
abs_err_exc_ff : abs_fsm_next = ABS_STATE_ERR;
|
863 |
|
|
abs_err_acc_busy_ff : abs_fsm_next = ABS_STATE_ERR;
|
864 |
|
|
abs_cmd_postexec_ff : abs_fsm_next = ABS_STATE_EXEC;
|
865 |
|
|
default : abs_fsm_next = ABS_STATE_IDLE;
|
866 |
|
|
endcase
|
867 |
|
|
end
|
868 |
|
|
end
|
869 |
|
|
|
870 |
|
|
ABS_STATE_MEM_SAVE_XREG : abs_fsm_next = dhi_resp ? ABS_STATE_MEM_SAVE_XREG_FORADDR : ABS_STATE_MEM_SAVE_XREG;
|
871 |
|
|
ABS_STATE_MEM_SAVE_XREG_FORADDR : abs_fsm_next = dhi_resp ? ABS_STATE_MEM_RW : ABS_STATE_MEM_SAVE_XREG_FORADDR;
|
872 |
|
|
ABS_STATE_MEM_RW : abs_fsm_next = dhi_resp ? ABS_STATE_MEM_RETURN_XREG : ABS_STATE_MEM_RW;
|
873 |
|
|
ABS_STATE_MEM_RETURN_XREG : abs_fsm_next = dhi_resp ? ABS_STATE_MEM_RETURN_XREG_FORADDR : ABS_STATE_MEM_RETURN_XREG;
|
874 |
|
|
|
875 |
|
|
ABS_STATE_MEM_RETURN_XREG_FORADDR: begin
|
876 |
|
|
if (dhi_resp) begin
|
877 |
|
|
case (1'b1)
|
878 |
|
|
abs_err_exc_ff: abs_fsm_next = ABS_STATE_ERR;
|
879 |
|
|
abs_err_acc_busy_ff : abs_fsm_next = ABS_STATE_ERR;
|
880 |
|
|
abs_cmd_postexec_ff : abs_fsm_next = ABS_STATE_EXEC;
|
881 |
|
|
default : abs_fsm_next = ABS_STATE_IDLE;
|
882 |
|
|
endcase
|
883 |
|
|
end
|
884 |
|
|
end
|
885 |
|
|
|
886 |
|
|
ABS_STATE_ERR: begin
|
887 |
|
|
if (abstractcs_wr_req & (abstractcs_cmderr_next == 3'b0)) begin
|
888 |
|
|
abs_fsm_next = ABS_STATE_IDLE;
|
889 |
|
|
end
|
890 |
|
|
end
|
891 |
|
|
endcase
|
892 |
|
|
|
893 |
|
|
if (~abs_fsm_idle & hart_state_reset) begin
|
894 |
|
|
abs_fsm_next = ABS_STATE_ERR;
|
895 |
|
|
end
|
896 |
|
|
end
|
897 |
|
|
|
898 |
|
|
assign abs_fsm_idle = (abs_fsm_ff == ABS_STATE_IDLE);
|
899 |
|
|
assign abs_fsm_exec = (abs_fsm_ff == ABS_STATE_EXEC);
|
900 |
|
|
assign abs_fsm_csr_ro = (abs_fsm_ff == ABS_STATE_CSR_RO);
|
901 |
|
|
assign abs_fsm_err = (abs_fsm_ff == ABS_STATE_ERR);
|
902 |
|
|
assign abs_fsm_use_addr = (abs_fsm_ff == ABS_STATE_MEM_SAVE_XREG_FORADDR)
|
903 |
|
|
| (abs_fsm_ff == ABS_STATE_MEM_RETURN_XREG_FORADDR);
|
904 |
|
|
|
905 |
|
|
//------------------------------------------------------------------------------
|
906 |
|
|
// Abstract command status logic
|
907 |
|
|
//------------------------------------------------------------------------------
|
908 |
|
|
|
909 |
|
|
// Abstract command access busy error register
|
910 |
|
|
//------------------------------------------------------------------------------
|
911 |
|
|
|
912 |
|
|
assign abs_err_acc_busy_upd = clk_en_abs & (abs_fsm_idle | dmi_req_any);
|
913 |
|
|
|
914 |
|
|
always_ff @(posedge clk) begin
|
915 |
|
|
if (abs_err_acc_busy_upd) abs_err_acc_busy_ff <= abs_err_acc_busy_next;
|
916 |
|
|
end
|
917 |
|
|
|
918 |
|
|
assign abs_err_acc_busy_next = ~abs_fsm_idle & dmi_req_any;
|
919 |
|
|
|
920 |
|
|
// Abstract command access exception error register
|
921 |
|
|
//------------------------------------------------------------------------------
|
922 |
|
|
|
923 |
|
|
assign abs_err_exc_upd = clk_en_abs & (abs_fsm_idle | (dhi_resp & dhi_resp_exc));
|
924 |
|
|
|
925 |
|
|
always_ff @(posedge clk) begin
|
926 |
|
|
if (abs_err_exc_upd) abs_err_exc_ff <= abs_err_exc_next;
|
927 |
|
|
end
|
928 |
|
|
|
929 |
|
|
assign abs_err_exc_next = ~abs_fsm_idle & dhi_resp & dhi_resp_exc;
|
930 |
|
|
|
931 |
|
|
//------------------------------------------------------------------------------
|
932 |
|
|
// Abstract Instruction logic
|
933 |
|
|
//------------------------------------------------------------------------------
|
934 |
|
|
//
|
935 |
|
|
// Cosists of the following functional units:
|
936 |
|
|
// - Instruction execution request register
|
937 |
|
|
// - Instruction memory FUNCT3 field multiplexer
|
938 |
|
|
// - Instruction RS1 multiplexer
|
939 |
|
|
// - Instruction RD multiplexer
|
940 |
|
|
// - Abstract Instruction register
|
941 |
|
|
|
942 |
|
|
// Abstract instruction execution request register
|
943 |
|
|
//------------------------------------------------------------------------------
|
944 |
|
|
|
945 |
|
|
assign abs_exec_req_next = ~(abs_fsm_idle | abs_fsm_csr_ro | abs_fsm_err) & ~dhi_resp;
|
946 |
|
|
|
947 |
|
|
always_ff @(posedge clk) begin
|
948 |
|
|
if (clk_en_dm) begin
|
949 |
|
|
if (~dmcontrol_dmactive_ff) begin
|
950 |
|
|
abs_exec_req_ff <= 1'b0;
|
951 |
|
|
end else begin
|
952 |
|
|
abs_exec_req_ff <= abs_exec_req_next;
|
953 |
|
|
end
|
954 |
|
|
end
|
955 |
|
|
end
|
956 |
|
|
|
957 |
|
|
// Abstract instruction memory FUNCT3 field multiplexer
|
958 |
|
|
//------------------------------------------------------------------------------
|
959 |
|
|
|
960 |
|
|
always_comb begin
|
961 |
|
|
case (abs_cmd_size_ff)
|
962 |
|
|
2'b00 : abs_instr_mem_funct3 = abs_cmd_wr_ff ? SCR1_FUNCT3_SB : SCR1_FUNCT3_LBU;
|
963 |
|
|
2'b01 : abs_instr_mem_funct3 = abs_cmd_wr_ff ? SCR1_FUNCT3_SH : SCR1_FUNCT3_LHU;
|
964 |
|
|
2'b10 : abs_instr_mem_funct3 = abs_cmd_wr_ff ? SCR1_FUNCT3_SW : SCR1_FUNCT3_LW;
|
965 |
|
|
default: abs_instr_mem_funct3 = SCR1_FUNCT3_SB;
|
966 |
|
|
endcase
|
967 |
|
|
end
|
968 |
|
|
|
969 |
|
|
// Abstract instruction RS1 multiplexer
|
970 |
|
|
//------------------------------------------------------------------------------
|
971 |
|
|
|
972 |
|
|
always_comb begin
|
973 |
|
|
abs_instr_rs1 = 5'h0;
|
974 |
|
|
case (abs_fsm_ff)
|
975 |
|
|
ABS_STATE_XREG_RW : abs_instr_rs1 = abs_cmd_wr_ff ? 5'h0 : abs_cmd_regno_ff[4:0];
|
976 |
|
|
ABS_STATE_CSR_SAVE_XREG : abs_instr_rs1 = 5'h5;
|
977 |
|
|
ABS_STATE_MEM_SAVE_XREG : abs_instr_rs1 = 5'h5;
|
978 |
|
|
ABS_STATE_CSR_RETURN_XREG : abs_instr_rs1 = 5'h5;
|
979 |
|
|
ABS_STATE_MEM_RETURN_XREG : abs_instr_rs1 = 5'h5;
|
980 |
|
|
ABS_STATE_CSR_RW : abs_instr_rs1 = abs_cmd_wr_ff ? 5'h5 : 5'h0;
|
981 |
|
|
ABS_STATE_MEM_SAVE_XREG_FORADDR : abs_instr_rs1 = 5'h6;
|
982 |
|
|
ABS_STATE_MEM_RETURN_XREG_FORADDR: abs_instr_rs1 = 5'h6;
|
983 |
|
|
ABS_STATE_MEM_RW : abs_instr_rs1 = 5'h6;
|
984 |
|
|
default : begin end
|
985 |
|
|
endcase
|
986 |
|
|
end
|
987 |
|
|
|
988 |
|
|
assign abs_instr_rs2 = 5'h5;
|
989 |
|
|
|
990 |
|
|
// Abstract instruction RD multiplexer
|
991 |
|
|
//------------------------------------------------------------------------------
|
992 |
|
|
|
993 |
|
|
always_comb begin
|
994 |
|
|
abs_instr_rd = 5'h0;
|
995 |
|
|
case (abs_fsm_ff)
|
996 |
|
|
ABS_STATE_XREG_RW : abs_instr_rd = abs_cmd_wr_ff ? abs_cmd_regno_ff[4:0] : 5'h0;
|
997 |
|
|
ABS_STATE_CSR_SAVE_XREG : abs_instr_rd = abs_cmd_wr_ff ? 5'h5 : 5'h0;
|
998 |
|
|
ABS_STATE_MEM_SAVE_XREG : abs_instr_rd = abs_cmd_wr_ff ? 5'h5 : 5'h0;
|
999 |
|
|
ABS_STATE_CSR_RW : abs_instr_rd = abs_cmd_wr_ff ? 5'h0 : 5'h5;
|
1000 |
|
|
ABS_STATE_MEM_RW : abs_instr_rd = abs_cmd_wr_ff ? 5'h0 : 5'h5;
|
1001 |
|
|
ABS_STATE_CSR_RETURN_XREG : abs_instr_rd = 5'h5;
|
1002 |
|
|
ABS_STATE_MEM_RETURN_XREG : abs_instr_rd = 5'h5;
|
1003 |
|
|
ABS_STATE_MEM_SAVE_XREG_FORADDR : abs_instr_rd = 5'h6;
|
1004 |
|
|
ABS_STATE_MEM_RETURN_XREG_FORADDR: abs_instr_rd = 5'h6;
|
1005 |
|
|
default : begin end
|
1006 |
|
|
endcase
|
1007 |
|
|
end
|
1008 |
|
|
|
1009 |
|
|
// Abstract instruction register
|
1010 |
|
|
//------------------------------------------------------------------------------
|
1011 |
|
|
|
1012 |
|
|
always_ff @(posedge clk) begin
|
1013 |
|
|
if (clk_en_abs) begin
|
1014 |
|
|
abs_exec_instr_ff <= abs_exec_instr_next;
|
1015 |
|
|
end
|
1016 |
|
|
end
|
1017 |
|
|
|
1018 |
|
|
always_comb begin
|
1019 |
|
|
abs_exec_instr_next = abs_exec_instr_ff;
|
1020 |
|
|
case (abs_fsm_ff)
|
1021 |
|
|
ABS_STATE_XREG_RW,
|
1022 |
|
|
ABS_STATE_CSR_SAVE_XREG,
|
1023 |
|
|
ABS_STATE_CSR_RETURN_XREG,
|
1024 |
|
|
ABS_STATE_MEM_SAVE_XREG,
|
1025 |
|
|
ABS_STATE_MEM_SAVE_XREG_FORADDR,
|
1026 |
|
|
ABS_STATE_MEM_RETURN_XREG,
|
1027 |
|
|
ABS_STATE_MEM_RETURN_XREG_FORADDR: begin
|
1028 |
|
|
abs_exec_instr_next = {SCR1_HDU_DBGCSR_ADDR_DSCRATCH0, abs_instr_rs1, SCR1_FUNCT3_CSRRW, abs_instr_rd, SCR1_OP_SYSTEM};
|
1029 |
|
|
end
|
1030 |
|
|
|
1031 |
|
|
ABS_STATE_CSR_RW: begin
|
1032 |
|
|
abs_exec_instr_next = abs_cmd_wr_ff
|
1033 |
|
|
? {abs_cmd_regno_ff[11:0], abs_instr_rs1, SCR1_FUNCT3_CSRRW, abs_instr_rd, SCR1_OP_SYSTEM}
|
1034 |
|
|
: {abs_cmd_regno_ff[11:0], abs_instr_rs1, SCR1_FUNCT3_CSRRS, abs_instr_rd, SCR1_OP_SYSTEM};
|
1035 |
|
|
end
|
1036 |
|
|
|
1037 |
|
|
ABS_STATE_MEM_RW: begin
|
1038 |
|
|
abs_exec_instr_next = abs_cmd_wr_ff
|
1039 |
|
|
? {7'h0, abs_instr_rs2, abs_instr_rs1, abs_instr_mem_funct3, 5'h0, SCR1_OP_STORE}
|
1040 |
|
|
: {12'h0, abs_instr_rs1, abs_instr_mem_funct3, abs_instr_rd, SCR1_OP_LOAD};
|
1041 |
|
|
end
|
1042 |
|
|
|
1043 |
|
|
default: begin end
|
1044 |
|
|
endcase
|
1045 |
|
|
end
|
1046 |
|
|
|
1047 |
|
|
//------------------------------------------------------------------------------
|
1048 |
|
|
// Abstract registers
|
1049 |
|
|
//------------------------------------------------------------------------------
|
1050 |
|
|
//
|
1051 |
|
|
// Registers:
|
1052 |
|
|
// - ABSTRACTCS register
|
1053 |
|
|
// - COMMAND register
|
1054 |
|
|
// - ABSTRACTAUTO register
|
1055 |
|
|
// - PROGBUF0..5 registers
|
1056 |
|
|
// - DATA0..1 registers
|
1057 |
|
|
|
1058 |
|
|
// ABSTRACTCS register
|
1059 |
|
|
//------------------------------------------------------------------------------
|
1060 |
|
|
|
1061 |
|
|
always_ff @(posedge clk) begin
|
1062 |
|
|
if (clk_en_dm) begin
|
1063 |
|
|
if (~dmcontrol_dmactive_ff) begin
|
1064 |
|
|
abstractcs_cmderr_ff <= ABS_ERR_NONE;
|
1065 |
|
|
end else begin
|
1066 |
|
|
abstractcs_cmderr_ff <= abstractcs_cmderr_next;
|
1067 |
|
|
end
|
1068 |
|
|
end
|
1069 |
|
|
end
|
1070 |
|
|
|
1071 |
|
|
always_comb begin
|
1072 |
|
|
abstractcs_cmderr_next = abstractcs_cmderr_ff;
|
1073 |
|
|
|
1074 |
|
|
case (abs_fsm_ff)
|
1075 |
|
|
ABS_STATE_IDLE: begin
|
1076 |
|
|
if (command_wr_req | dmi_rpt_command) begin
|
1077 |
|
|
if (abs_cmd_hartreg_vd) begin
|
1078 |
|
|
case (1'b1)
|
1079 |
|
|
abs_cmd_reg_access_req : begin
|
1080 |
|
|
case (1'b1)
|
1081 |
|
|
abs_cmd_csr_rw_access_vd: abstractcs_cmderr_next = hart_state_dhalt
|
1082 |
|
|
? abstractcs_cmderr_ff
|
1083 |
|
|
: ABS_ERR_NOHALT;
|
1084 |
|
|
abs_cmd_mprf_access_vd : abstractcs_cmderr_next = hart_state_dhalt
|
1085 |
|
|
? abstractcs_cmderr_ff
|
1086 |
|
|
: ABS_ERR_NOHALT;
|
1087 |
|
|
abs_cmd_csr_ro_access_vd: abstractcs_cmderr_next = abstractcs_cmderr_ff;
|
1088 |
|
|
default : abstractcs_cmderr_next = ABS_ERR_CMD;
|
1089 |
|
|
endcase
|
1090 |
|
|
end
|
1091 |
|
|
abs_cmd_execprogbuf_req : abstractcs_cmderr_next = abstractcs_cmderr_ff;
|
1092 |
|
|
default : abstractcs_cmderr_next = ABS_ERR_CMD;
|
1093 |
|
|
endcase
|
1094 |
|
|
end else if (abs_cmd_hartmem_vd) begin
|
1095 |
|
|
abstractcs_cmderr_next = ~abs_cmd_memsize_vd ? ABS_ERR_CMD
|
1096 |
|
|
: ~hart_state_dhalt ? ABS_ERR_NOHALT
|
1097 |
|
|
: abstractcs_cmderr_ff;
|
1098 |
|
|
end else begin
|
1099 |
|
|
abstractcs_cmderr_next = ABS_ERR_CMD;
|
1100 |
|
|
end
|
1101 |
|
|
end
|
1102 |
|
|
end
|
1103 |
|
|
|
1104 |
|
|
ABS_STATE_EXEC: begin
|
1105 |
|
|
if (dhi_resp) begin
|
1106 |
|
|
if (dhi_resp_exc) begin
|
1107 |
|
|
abstractcs_cmderr_next = ABS_ERR_EXCEPTION;
|
1108 |
|
|
end else if (abs_err_acc_busy_ff) begin
|
1109 |
|
|
abstractcs_cmderr_next = ABS_ERR_BUSY;
|
1110 |
|
|
end
|
1111 |
|
|
end
|
1112 |
|
|
end
|
1113 |
|
|
|
1114 |
|
|
ABS_STATE_XREG_RW,
|
1115 |
|
|
ABS_STATE_CSR_RO: begin
|
1116 |
|
|
if (abs_err_acc_busy_ff) begin
|
1117 |
|
|
abstractcs_cmderr_next = ABS_ERR_BUSY;
|
1118 |
|
|
end
|
1119 |
|
|
end
|
1120 |
|
|
|
1121 |
|
|
ABS_STATE_CSR_RETURN_XREG,
|
1122 |
|
|
ABS_STATE_MEM_RETURN_XREG_FORADDR: begin
|
1123 |
|
|
if (dhi_resp) begin
|
1124 |
|
|
case (1'b1)
|
1125 |
|
|
abs_err_exc_ff : abstractcs_cmderr_next = ABS_ERR_EXCEPTION;
|
1126 |
|
|
abs_err_acc_busy_ff: abstractcs_cmderr_next = ABS_ERR_BUSY;
|
1127 |
|
|
default: abstractcs_cmderr_next = abstractcs_cmderr_ff;
|
1128 |
|
|
endcase
|
1129 |
|
|
end
|
1130 |
|
|
end
|
1131 |
|
|
|
1132 |
|
|
ABS_STATE_ERR: begin
|
1133 |
|
|
if (dmi_req_abstractcs & dmi2dm_wr_i) begin
|
1134 |
|
|
abstractcs_cmderr_next = abstractcs_cmderr_ff // cp.7
|
1135 |
|
|
& (~dmi2dm_wdata_i[SCR1_DBG_ABSTRACTCS_CMDERR_HI:
|
1136 |
|
|
SCR1_DBG_ABSTRACTCS_CMDERR_LO]);
|
1137 |
|
|
end
|
1138 |
|
|
end
|
1139 |
|
|
|
1140 |
|
|
default: begin
|
1141 |
|
|
end
|
1142 |
|
|
endcase
|
1143 |
|
|
|
1144 |
|
|
if (~abs_fsm_idle & hart_state_reset) begin
|
1145 |
|
|
abstractcs_cmderr_next = ABS_ERR_EXCEPTION;
|
1146 |
|
|
end
|
1147 |
|
|
end
|
1148 |
|
|
|
1149 |
|
|
assign abstractcs_busy = ~abs_fsm_idle & ~abs_fsm_err;
|
1150 |
|
|
|
1151 |
|
|
// Abstract COMMAND register
|
1152 |
|
|
//------------------------------------------------------------------------------
|
1153 |
|
|
|
1154 |
|
|
always_ff @(posedge clk) begin
|
1155 |
|
|
if (clk_en_dm) abs_command_ff <= abs_command_next;
|
1156 |
|
|
end
|
1157 |
|
|
|
1158 |
|
|
assign abs_command_next = ~dmcontrol_dmactive_ff ? '0
|
1159 |
|
|
: (command_wr_req & abs_fsm_idle) ? dmi2dm_wdata_i
|
1160 |
|
|
: abs_command_ff;
|
1161 |
|
|
|
1162 |
|
|
// Abstract ABSTRACTAUTO register
|
1163 |
|
|
//------------------------------------------------------------------------------
|
1164 |
|
|
|
1165 |
|
|
always_ff @(posedge clk) begin
|
1166 |
|
|
if (clk_en_dm) abs_autoexec_ff <= abs_autoexec_next;
|
1167 |
|
|
end
|
1168 |
|
|
|
1169 |
|
|
assign abs_autoexec_next = ~dmcontrol_dmactive_ff ? 1'b0
|
1170 |
|
|
: (autoexec_wr_req & abs_fsm_idle) ? dmi2dm_wdata_i[0]
|
1171 |
|
|
: abs_autoexec_ff;
|
1172 |
|
|
|
1173 |
|
|
// Program Buffer registers
|
1174 |
|
|
//------------------------------------------------------------------------------
|
1175 |
|
|
|
1176 |
|
|
always_ff @(posedge clk) begin
|
1177 |
|
|
if (clk_en_abs & abs_fsm_idle) begin
|
1178 |
|
|
if (progbuf0_wr_req) abs_progbuf0_ff <= dmi2dm_wdata_i;
|
1179 |
|
|
if (progbuf1_wr_req) abs_progbuf1_ff <= dmi2dm_wdata_i;
|
1180 |
|
|
if (progbuf2_wr_req) abs_progbuf2_ff <= dmi2dm_wdata_i;
|
1181 |
|
|
if (progbuf3_wr_req) abs_progbuf3_ff <= dmi2dm_wdata_i;
|
1182 |
|
|
if (progbuf4_wr_req) abs_progbuf4_ff <= dmi2dm_wdata_i;
|
1183 |
|
|
if (progbuf5_wr_req) abs_progbuf5_ff <= dmi2dm_wdata_i;
|
1184 |
|
|
end
|
1185 |
|
|
end
|
1186 |
|
|
|
1187 |
|
|
// Data 0 register
|
1188 |
|
|
//------------------------------------------------------------------------------
|
1189 |
|
|
|
1190 |
|
|
always_ff @(posedge clk) begin
|
1191 |
|
|
if (clk_en_abs) begin
|
1192 |
|
|
abs_data0_ff <= abs_data0_next;
|
1193 |
|
|
end
|
1194 |
|
|
end
|
1195 |
|
|
|
1196 |
|
|
assign data0_xreg_save = dreg_wr_req & ~abs_cmd_wr_ff;
|
1197 |
|
|
|
1198 |
|
|
always_comb begin
|
1199 |
|
|
abs_data0_next = abs_data0_ff;
|
1200 |
|
|
|
1201 |
|
|
case (abs_fsm_ff)
|
1202 |
|
|
ABS_STATE_IDLE : abs_data0_next = data0_wr_req ? dmi2dm_wdata_i : abs_data0_ff;
|
1203 |
|
|
ABS_STATE_EXEC : abs_data0_next = dreg_wr_req ? pipe2dm_dreg_wdata_i : abs_data0_ff;
|
1204 |
|
|
ABS_STATE_CSR_SAVE_XREG : abs_data0_next = dreg_wr_req ? pipe2dm_dreg_wdata_i : abs_data0_ff;
|
1205 |
|
|
ABS_STATE_CSR_RETURN_XREG: abs_data0_next = dreg_wr_req ? pipe2dm_dreg_wdata_i : abs_data0_ff;
|
1206 |
|
|
ABS_STATE_MEM_SAVE_XREG : abs_data0_next = dreg_wr_req ? pipe2dm_dreg_wdata_i : abs_data0_ff;
|
1207 |
|
|
ABS_STATE_MEM_RETURN_XREG: abs_data0_next = dreg_wr_req ? pipe2dm_dreg_wdata_i : abs_data0_ff;
|
1208 |
|
|
ABS_STATE_XREG_RW : abs_data0_next = data0_xreg_save ? pipe2dm_dreg_wdata_i : abs_data0_ff;
|
1209 |
|
|
|
1210 |
|
|
ABS_STATE_CSR_RO: begin
|
1211 |
|
|
case (abs_cmd_regno_ff[11:0])
|
1212 |
|
|
SCR1_CSR_ADDR_MISA : abs_data0_next = SCR1_CSR_MISA;
|
1213 |
|
|
SCR1_CSR_ADDR_MVENDORID: abs_data0_next = SCR1_CSR_MVENDORID;
|
1214 |
|
|
SCR1_CSR_ADDR_MARCHID : abs_data0_next = SCR1_CSR_MARCHID;
|
1215 |
|
|
SCR1_CSR_ADDR_MIMPID : abs_data0_next = SCR1_CSR_MIMPID;
|
1216 |
|
|
SCR1_CSR_ADDR_MHARTID : abs_data0_next = soc2dm_fuse_mhartid_i;
|
1217 |
|
|
default : abs_data0_next = pipe2dm_pc_sample_i;
|
1218 |
|
|
endcase
|
1219 |
|
|
end
|
1220 |
|
|
|
1221 |
|
|
default : begin end
|
1222 |
|
|
endcase
|
1223 |
|
|
end
|
1224 |
|
|
|
1225 |
|
|
// Data 1 register
|
1226 |
|
|
//------------------------------------------------------------------------------
|
1227 |
|
|
|
1228 |
|
|
always_ff @(posedge clk) begin
|
1229 |
|
|
if (clk_en_abs) begin
|
1230 |
|
|
abs_data1_ff <= abs_data1_next;
|
1231 |
|
|
end
|
1232 |
|
|
end
|
1233 |
|
|
|
1234 |
|
|
always_comb begin
|
1235 |
|
|
abs_data1_next = abs_data1_ff;
|
1236 |
|
|
case (abs_fsm_ff)
|
1237 |
|
|
ABS_STATE_IDLE : abs_data1_next = data1_wr_req ? dmi2dm_wdata_i : abs_data1_ff;
|
1238 |
|
|
ABS_STATE_MEM_SAVE_XREG_FORADDR : abs_data1_next = dreg_wr_req ? pipe2dm_dreg_wdata_i : abs_data1_ff;
|
1239 |
|
|
ABS_STATE_MEM_RETURN_XREG_FORADDR: abs_data1_next = dreg_wr_req ? pipe2dm_dreg_wdata_i : abs_data1_ff;
|
1240 |
|
|
default : begin end
|
1241 |
|
|
endcase
|
1242 |
|
|
end
|
1243 |
|
|
|
1244 |
|
|
//------------------------------------------------------------------------------
|
1245 |
|
|
// Debug Hart Interface : control
|
1246 |
|
|
//------------------------------------------------------------------------------
|
1247 |
|
|
|
1248 |
|
|
assign cmd_resp_ok = pipe2dm_cmd_resp_i & ~pipe2dm_cmd_rcode_i;
|
1249 |
|
|
assign hart_rst_unexp = ~dhi_fsm_idle & ~dhi_fsm_halt_req & hart_state_reset;
|
1250 |
|
|
|
1251 |
|
|
assign halt_req_vd = dmcontrol_haltreq_ff & ~hart_state_dhalt;
|
1252 |
|
|
assign resume_req_vd = dmcontrol_resumereq_ff & ~dmstatus_allany_resumeack_ff
|
1253 |
|
|
& hart_state_dhalt;
|
1254 |
|
|
|
1255 |
|
|
// DHI fsm
|
1256 |
|
|
//------------------------------------------------------------------------------
|
1257 |
|
|
|
1258 |
|
|
always_ff @(posedge clk, negedge rst_n) begin
|
1259 |
|
|
if (~rst_n) begin
|
1260 |
|
|
dhi_fsm_ff <= DHI_STATE_IDLE;
|
1261 |
|
|
end else if (clk_en_dm) begin
|
1262 |
|
|
dhi_fsm_ff <= dhi_fsm_next;
|
1263 |
|
|
end
|
1264 |
|
|
end
|
1265 |
|
|
|
1266 |
|
|
always_comb begin
|
1267 |
|
|
dhi_fsm_next = dhi_fsm_ff;
|
1268 |
|
|
if (~hart_rst_unexp & dmcontrol_dmactive_ff) begin
|
1269 |
|
|
// Normal work
|
1270 |
|
|
case (dhi_fsm_ff)
|
1271 |
|
|
DHI_STATE_IDLE : dhi_fsm_next = dhi_req;
|
1272 |
|
|
DHI_STATE_EXEC : dhi_fsm_next = cmd_resp_ok ? DHI_STATE_EXEC_RUN : DHI_STATE_EXEC;
|
1273 |
|
|
DHI_STATE_EXEC_RUN : dhi_fsm_next = hart_state_drun ? DHI_STATE_EXEC_HALT : DHI_STATE_EXEC_RUN;
|
1274 |
|
|
DHI_STATE_HALT_REQ : dhi_fsm_next = cmd_resp_ok ? DHI_STATE_EXEC_HALT : DHI_STATE_HALT_REQ;
|
1275 |
|
|
DHI_STATE_EXEC_HALT : dhi_fsm_next = hart_state_dhalt ? DHI_STATE_IDLE : DHI_STATE_EXEC_HALT;
|
1276 |
|
|
DHI_STATE_RESUME_REQ: dhi_fsm_next = cmd_resp_ok ? DHI_STATE_RESUME_RUN : DHI_STATE_RESUME_REQ;
|
1277 |
|
|
DHI_STATE_RESUME_RUN: dhi_fsm_next = hart_state_run ? DHI_STATE_IDLE : DHI_STATE_RESUME_RUN;
|
1278 |
|
|
default : dhi_fsm_next = dhi_fsm_ff;
|
1279 |
|
|
endcase
|
1280 |
|
|
end else begin
|
1281 |
|
|
// In case of DM reset or core unexpected reset
|
1282 |
|
|
dhi_fsm_next = DHI_STATE_IDLE;
|
1283 |
|
|
end
|
1284 |
|
|
end
|
1285 |
|
|
|
1286 |
|
|
assign dhi_fsm_idle = (dhi_fsm_ff == DHI_STATE_IDLE);
|
1287 |
|
|
assign dhi_fsm_halt_req = (dhi_fsm_ff == DHI_STATE_HALT_REQ);
|
1288 |
|
|
assign dhi_fsm_exec = (dhi_fsm_ff == DHI_STATE_EXEC);
|
1289 |
|
|
assign dhi_fsm_exec_halt = (dhi_fsm_ff == DHI_STATE_EXEC_HALT);
|
1290 |
|
|
assign dhi_fsm_resume_req = (dhi_fsm_ff == DHI_STATE_RESUME_REQ);
|
1291 |
|
|
|
1292 |
|
|
always_comb begin
|
1293 |
|
|
case (1'b1)
|
1294 |
|
|
abs_exec_req_ff: dhi_req = DHI_STATE_EXEC;
|
1295 |
|
|
halt_req_vd : dhi_req = DHI_STATE_HALT_REQ;
|
1296 |
|
|
resume_req_vd : dhi_req = DHI_STATE_RESUME_REQ;
|
1297 |
|
|
default : dhi_req = DHI_STATE_IDLE;
|
1298 |
|
|
endcase
|
1299 |
|
|
end
|
1300 |
|
|
|
1301 |
|
|
assign dhi_resp = dhi_fsm_exec_halt & hart_state_dhalt;
|
1302 |
|
|
assign dhi_resp_exc = pipe2dm_hart_event_i & pipe2dm_hart_status_i.except
|
1303 |
|
|
& ~pipe2dm_hart_status_i.ebreak;
|
1304 |
|
|
|
1305 |
|
|
// HART command registers
|
1306 |
|
|
//------------------------------------------------------------------------------
|
1307 |
|
|
|
1308 |
|
|
// HART command request register
|
1309 |
|
|
always_ff @(posedge clk, negedge rst_n) begin
|
1310 |
|
|
if (~rst_n) begin
|
1311 |
|
|
hart_cmd_req_ff <= 1'b0;
|
1312 |
|
|
end else if (clk_en_dm) begin
|
1313 |
|
|
hart_cmd_req_ff <= hart_cmd_req_next;
|
1314 |
|
|
end
|
1315 |
|
|
end
|
1316 |
|
|
|
1317 |
|
|
assign hart_cmd_req_next = (dhi_fsm_exec | dhi_fsm_halt_req | dhi_fsm_resume_req)
|
1318 |
|
|
& ~cmd_resp_ok & dmcontrol_dmactive_ff;
|
1319 |
|
|
|
1320 |
|
|
// HART command register
|
1321 |
|
|
always_ff @(posedge clk, negedge rst_n) begin
|
1322 |
|
|
if (~rst_n) begin
|
1323 |
|
|
hart_cmd_ff <= SCR1_HDU_DBGSTATE_RUN;
|
1324 |
|
|
end else if (clk_en_dm) begin
|
1325 |
|
|
hart_cmd_ff <= hart_cmd_next;
|
1326 |
|
|
end
|
1327 |
|
|
end
|
1328 |
|
|
|
1329 |
|
|
always_comb begin
|
1330 |
|
|
hart_cmd_next = SCR1_HDU_DBGSTATE_RUN;
|
1331 |
|
|
if (dmcontrol_dmactive_ff) begin
|
1332 |
|
|
case (dhi_fsm_ff)
|
1333 |
|
|
DHI_STATE_EXEC : hart_cmd_next = SCR1_HDU_DBGSTATE_DRUN;
|
1334 |
|
|
DHI_STATE_HALT_REQ : hart_cmd_next = SCR1_HDU_DBGSTATE_DHALTED;
|
1335 |
|
|
DHI_STATE_RESUME_REQ: hart_cmd_next = SCR1_HDU_DBGSTATE_RUN;
|
1336 |
|
|
default : hart_cmd_next = dm2pipe_cmd_o;
|
1337 |
|
|
endcase
|
1338 |
|
|
end
|
1339 |
|
|
end
|
1340 |
|
|
|
1341 |
|
|
assign dm2pipe_cmd_req_o = hart_cmd_req_ff;
|
1342 |
|
|
assign dm2pipe_cmd_o = hart_cmd_ff;
|
1343 |
|
|
|
1344 |
|
|
//------------------------------------------------------------------------------
|
1345 |
|
|
// Debug Hart Interface : program buffer
|
1346 |
|
|
//------------------------------------------------------------------------------
|
1347 |
|
|
|
1348 |
|
|
// Program Buffer execution EBREAK flag
|
1349 |
|
|
//------------------------------------------------------------------------------
|
1350 |
|
|
|
1351 |
|
|
always_ff @(posedge clk) begin
|
1352 |
|
|
if (clk_en_dm) hart_pbuf_ebreak_ff <= hart_pbuf_ebreak_next;
|
1353 |
|
|
end
|
1354 |
|
|
|
1355 |
|
|
assign hart_pbuf_ebreak_next = abs_fsm_exec & (dm2pipe_pbuf_instr_o == ABS_EXEC_EBREAK);
|
1356 |
|
|
|
1357 |
|
|
// Program Buffer instruction multiplexer
|
1358 |
|
|
//------------------------------------------------------------------------------
|
1359 |
|
|
|
1360 |
|
|
always_comb begin
|
1361 |
|
|
dm2pipe_pbuf_instr_o = ABS_EXEC_EBREAK;
|
1362 |
|
|
|
1363 |
|
|
if (abs_fsm_exec & ~hart_pbuf_ebreak_ff) begin
|
1364 |
|
|
case (pipe2dm_pbuf_addr_i)
|
1365 |
|
|
3'h0: dm2pipe_pbuf_instr_o = abs_progbuf0_ff;
|
1366 |
|
|
3'h1: dm2pipe_pbuf_instr_o = abs_progbuf1_ff;
|
1367 |
|
|
3'h2: dm2pipe_pbuf_instr_o = abs_progbuf2_ff;
|
1368 |
|
|
3'h3: dm2pipe_pbuf_instr_o = abs_progbuf3_ff;
|
1369 |
|
|
3'h4: dm2pipe_pbuf_instr_o = abs_progbuf4_ff;
|
1370 |
|
|
3'h5: dm2pipe_pbuf_instr_o = abs_progbuf5_ff;
|
1371 |
|
|
default: ;
|
1372 |
|
|
endcase
|
1373 |
|
|
end else if (pipe2dm_pbuf_addr_i == 3'b0) begin
|
1374 |
|
|
dm2pipe_pbuf_instr_o = abs_exec_instr_ff;
|
1375 |
|
|
end
|
1376 |
|
|
end
|
1377 |
|
|
|
1378 |
|
|
//------------------------------------------------------------------------------
|
1379 |
|
|
// Debug Hart Interface : abstract command data
|
1380 |
|
|
//------------------------------------------------------------------------------
|
1381 |
|
|
|
1382 |
|
|
assign dm2pipe_dreg_resp_o = 1'b1;
|
1383 |
|
|
assign dm2pipe_dreg_fail_o = 1'b0;
|
1384 |
|
|
assign dm2pipe_dreg_rdata_o = abs_fsm_use_addr ? abs_data1_ff : abs_data0_ff;
|
1385 |
|
|
|
1386 |
|
|
`ifdef SCR1_TRGT_SIMULATION
|
1387 |
|
|
//------------------------------------------------------------------------------
|
1388 |
|
|
// Assertions
|
1389 |
|
|
//------------------------------------------------------------------------------
|
1390 |
|
|
|
1391 |
|
|
SVA_DM_X_CONTROL : assert property (
|
1392 |
|
|
@(negedge clk) disable iff (~rst_n)
|
1393 |
|
|
!$isunknown({dmi2dm_req_i, pipe2dm_dreg_req_i, pipe2dm_cmd_resp_i,
|
1394 |
|
|
pipe2dm_hart_event_i})
|
1395 |
|
|
) else $error("DM error: control signals is X - %0b", {dmi2dm_req_i,
|
1396 |
|
|
pipe2dm_dreg_req_i, pipe2dm_cmd_resp_i, pipe2dm_hart_event_i});
|
1397 |
|
|
|
1398 |
|
|
SVA_DM_X_DMI : assert property (
|
1399 |
|
|
@(negedge clk) disable iff (~rst_n)
|
1400 |
|
|
dmi2dm_req_i |-> !$isunknown({dmi2dm_wr_i, dmi2dm_addr_i, dmi2dm_wdata_i})
|
1401 |
|
|
) else $error("DM error: data signals is X on dmi");
|
1402 |
|
|
|
1403 |
|
|
SVA_DM_X_HART_PBUF : assert property (
|
1404 |
|
|
@(negedge clk) disable iff (~rst_n)
|
1405 |
|
|
!$isunknown (pipe2dm_pbuf_addr_i)
|
1406 |
|
|
) else $error("DM error: data signals is X on hart_pbuf");
|
1407 |
|
|
|
1408 |
|
|
SVA_DM_X_HART_DREG : assert property (
|
1409 |
|
|
@(negedge clk) disable iff (~rst_n)
|
1410 |
|
|
pipe2dm_dreg_req_i |-> !$isunknown({pipe2dm_dreg_wr_i, pipe2dm_dreg_wdata_i})
|
1411 |
|
|
) else $error("DM error: data signals is X on hart_dreg");
|
1412 |
|
|
|
1413 |
|
|
SVA_DM_X_HART_CMD : assert property (
|
1414 |
|
|
@(negedge clk) disable iff (~rst_n)
|
1415 |
|
|
pipe2dm_cmd_resp_i |-> !$isunknown({pipe2dm_cmd_rcode_i})
|
1416 |
|
|
) else $error("DM error: data signals is X on dm2pipe_cmd_o");
|
1417 |
|
|
|
1418 |
|
|
SVA_DM_X_HART_EVENT : assert property (
|
1419 |
|
|
@(negedge clk) disable iff (~rst_n)
|
1420 |
|
|
pipe2dm_hart_event_i |-> !$isunknown(pipe2dm_hart_status_i)
|
1421 |
|
|
) else $error("DM error: data signals is X on pipe2dm_hart_event_i");
|
1422 |
|
|
|
1423 |
|
|
`endif // SCR1_TRGT_SIMULATION
|
1424 |
|
|
|
1425 |
|
|
endmodule : scr1_dm
|
1426 |
|
|
|
1427 |
|
|
`endif // SCR1_DBG_EN
|