OpenCores
URL https://opencores.org/ocsvn/yifive/yifive/trunk

Subversion Repositories yifive

[/] [yifive/] [trunk/] [caravel_yifive/] [verilog/] [rtl/] [syntacore/] [scr1/] [src/] [core/] [scr1_dm.sv] - Blame information for rev 21

Details | Compare with Previous | View Log

Line No. Rev Author Line
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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.