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

Subversion Repositories openriscdevboard

[/] [openriscdevboard/] [trunk/] [cyc2-openrisc/] [rtl/] [or1200/] [or1200_du.v] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 sfielding
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  OR1200's Debug Unit                                         ////
4
////                                                              ////
5
////  This file is part of the OpenRISC 1200 project              ////
6
////  http://www.opencores.org/cores/or1k/                        ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  Basic OR1200 debug unit.                                    ////
10
////                                                              ////
11
////  To Do:                                                      ////
12
////   - make it smaller and faster                               ////
13
////                                                              ////
14
////  Author(s):                                                  ////
15
////      - Damjan Lampret, lampret@opencores.org                 ////
16
////                                                              ////
17
//////////////////////////////////////////////////////////////////////
18
////                                                              ////
19
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
20
////                                                              ////
21
//// This source file may be used and distributed without         ////
22
//// restriction provided that this copyright statement is not    ////
23
//// removed from the file and that any derivative work contains  ////
24
//// the original copyright notice and the associated disclaimer. ////
25
////                                                              ////
26
//// This source file is free software; you can redistribute it   ////
27
//// and/or modify it under the terms of the GNU Lesser General   ////
28
//// Public License as published by the Free Software Foundation; ////
29
//// either version 2.1 of the License, or (at your option) any   ////
30
//// later version.                                               ////
31
////                                                              ////
32
//// This source is distributed in the hope that it will be       ////
33
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
34
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
35
//// PURPOSE.  See the GNU Lesser General Public License for more ////
36
//// details.                                                     ////
37
////                                                              ////
38
//// You should have received a copy of the GNU Lesser General    ////
39
//// Public License along with this source; if not, download it   ////
40
//// from http://www.opencores.org/lgpl.shtml                     ////
41
////                                                              ////
42
//////////////////////////////////////////////////////////////////////
43
//
44
// CVS Revision History
45
//
46
// $Log: not supported by cvs2svn $
47
// Revision 1.1  2006/12/21 16:46:58  vak
48
// Initial revision imported from
49
// http://www.opencores.org/cvsget.cgi/or1k/orp/orp_soc/rtl/verilog.
50
//
51
// Revision 1.12  2005/10/19 11:37:56  jcastillo
52
// Added support for RAMB16 Xilinx4/Spartan3 primitives
53
//
54
// Revision 1.11  2005/01/07 09:35:08  andreje
55
// du_hwbkpt disabled when debug unit not implemented
56
//
57
// Revision 1.10  2004/04/05 08:29:57  lampret
58
// Merged branch_qmem into main tree.
59
//
60
// Revision 1.9.4.4  2004/02/11 01:40:11  lampret
61
// preliminary HW breakpoints support in debug unit (by default disabled). To enable define OR1200_DU_HWBKPTS.
62
//
63
// Revision 1.9.4.3  2004/01/18 10:08:00  simons
64
// Error fixed.
65
//
66
// Revision 1.9.4.2  2004/01/17 21:14:14  simons
67
// Errors fixed.
68
//
69
// Revision 1.9.4.1  2004/01/15 06:46:38  markom
70
// interface to debug changed; no more opselect; stb-ack protocol
71
//
72
// Revision 1.9  2003/01/22 03:23:47  lampret
73
// Updated sensitivity list for trace buffer [only relevant for Xilinx FPGAs]
74
//
75
// Revision 1.8  2002/09/08 19:31:52  lampret
76
// Fixed a typo, reported by Taylor Su.
77
//
78
// Revision 1.7  2002/07/14 22:17:17  lampret
79
// Added simple trace buffer [only for Xilinx Virtex target]. Fixed instruction fetch abort when new exception is recognized.
80
//
81
// Revision 1.6  2002/03/14 00:30:24  lampret
82
// Added alternative for critical path in DU.
83
//
84
// Revision 1.5  2002/02/11 04:33:17  lampret
85
// Speed optimizations (removed duplicate _cyc_ and _stb_). Fixed D/IMMU cache-inhibit attr.
86
//
87
// Revision 1.4  2002/01/28 01:16:00  lampret
88
// Changed 'void' nop-ops instead of insn[0] to use insn[16]. Debug unit stalls the tick timer. Prepared new flag generation for add and and insns. Blocked DC/IC while they are turned off. Fixed I/D MMU SPRs layout except WAYs. TODO: smart IC invalidate, l.j 2 and TLB ways.
89
//
90
// Revision 1.3  2002/01/18 07:56:00  lampret
91
// No more low/high priority interrupts (PICPR removed). Added tick timer exception. Added exception prefix (SR[EPH]). Fixed single-step bug whenreading NPC.
92
//
93
// Revision 1.2  2002/01/14 06:18:22  lampret
94
// Fixed mem2reg bug in FAST implementation. Updated debug unit to work with new genpc/if.
95
//
96
// Revision 1.1  2002/01/03 08:16:15  lampret
97
// New prefixes for RTL files, prefixed module names. Updated cache controllers and MMUs.
98
//
99
// Revision 1.12  2001/11/30 18:58:00  simons
100
// Trap insn couses break after exits ex_insn.
101
//
102
// Revision 1.11  2001/11/23 08:38:51  lampret
103
// Changed DSR/DRR behavior and exception detection.
104
//
105
// Revision 1.10  2001/11/20 21:25:44  lampret
106
// Fixed dbg_is_o assignment width.
107
//
108
// Revision 1.9  2001/11/20 18:46:14  simons
109
// Break point bug fixed
110
//
111
// Revision 1.8  2001/11/18 08:36:28  lampret
112
// For GDB changed single stepping and disabled trap exception.
113
//
114
// Revision 1.7  2001/10/21 18:09:53  lampret
115
// Fixed sensitivity list.
116
//
117
// Revision 1.6  2001/10/14 13:12:09  lampret
118
// MP3 version.
119
//
120
//
121
 
122
// synopsys translate_off
123
`include "timescale.v"
124
// synopsys translate_on
125
`include "or1200_defines.v"
126
 
127
//
128
// Debug unit
129
//
130
 
131
module or1200_du(
132
        // RISC Internal Interface
133
        clk, rst,
134
        dcpu_cycstb_i, dcpu_we_i, dcpu_adr_i, dcpu_dat_lsu,
135
        dcpu_dat_dc, icpu_cycstb_i,
136
        ex_freeze, branch_op, ex_insn, id_pc,
137
        spr_dat_npc, rf_dataw,
138
        du_dsr, du_stall, du_addr, du_dat_i, du_dat_o,
139
        du_read, du_write, du_except, du_hwbkpt,
140
        spr_cs, spr_write, spr_addr, spr_dat_i, spr_dat_o,
141
 
142
        // External Debug Interface
143
        dbg_stall_i, dbg_ewt_i, dbg_lss_o, dbg_is_o, dbg_wp_o, dbg_bp_o,
144
        dbg_stb_i, dbg_we_i, dbg_adr_i, dbg_dat_i, dbg_dat_o, dbg_ack_o
145
);
146
 
147
parameter dw = `OR1200_OPERAND_WIDTH;
148
parameter aw = `OR1200_OPERAND_WIDTH;
149
 
150
//
151
// I/O
152
//
153
 
154
//
155
// RISC Internal Interface
156
//
157
input                           clk;            // Clock
158
input                           rst;            // Reset
159
input                           dcpu_cycstb_i;  // LSU status
160
input                           dcpu_we_i;      // LSU status
161
input   [31:0]                   dcpu_adr_i;     // LSU addr
162
input   [31:0]                   dcpu_dat_lsu;   // LSU store data
163
input   [31:0]                   dcpu_dat_dc;    // LSU load data
164
input   [`OR1200_FETCHOP_WIDTH-1:0]      icpu_cycstb_i;  // IFETCH unit status
165
input                           ex_freeze;      // EX stage freeze
166
input   [`OR1200_BRANCHOP_WIDTH-1:0]     branch_op;      // Branch op
167
input   [dw-1:0]         ex_insn;        // EX insn
168
input   [31:0]                   id_pc;          // insn fetch EA
169
input   [31:0]                   spr_dat_npc;    // Next PC (for trace)
170
input   [31:0]                   rf_dataw;       // ALU result (for trace)
171
output  [`OR1200_DU_DSR_WIDTH-1:0]     du_dsr;           // DSR
172
output                          du_stall;       // Debug Unit Stall
173
output  [aw-1:0]         du_addr;        // Debug Unit Address
174
input   [dw-1:0]         du_dat_i;       // Debug Unit Data In
175
output  [dw-1:0]         du_dat_o;       // Debug Unit Data Out
176
output                          du_read;        // Debug Unit Read Enable
177
output                          du_write;       // Debug Unit Write Enable
178
input   [12:0]                   du_except;      // Exception masked by DSR
179
output                          du_hwbkpt;      // Cause trap exception (HW Breakpoints)
180
input                           spr_cs;         // SPR Chip Select
181
input                           spr_write;      // SPR Read/Write
182
input   [aw-1:0]         spr_addr;       // SPR Address
183
input   [dw-1:0]         spr_dat_i;      // SPR Data Input
184
output  [dw-1:0]         spr_dat_o;      // SPR Data Output
185
 
186
//
187
// External Debug Interface
188
//
189
input                   dbg_stall_i;    // External Stall Input
190
input                   dbg_ewt_i;      // External Watchpoint Trigger Input
191
output  [3:0]            dbg_lss_o;      // External Load/Store Unit Status
192
output  [1:0]            dbg_is_o;       // External Insn Fetch Status
193
output  [10:0]           dbg_wp_o;       // Watchpoints Outputs
194
output                  dbg_bp_o;       // Breakpoint Output
195
input                   dbg_stb_i;      // External Address/Data Strobe
196
input                   dbg_we_i;       // External Write Enable
197
input   [aw-1:0] dbg_adr_i;      // External Address Input
198
input   [dw-1:0] dbg_dat_i;      // External Data Input
199
output  [dw-1:0] dbg_dat_o;      // External Data Output
200
output                  dbg_ack_o;      // External Data Acknowledge (not WB compatible)
201
 
202
 
203
//
204
// Some connections go directly from the CPU through DU to Debug I/F
205
//
206
`ifdef OR1200_DU_STATUS_UNIMPLEMENTED
207
assign dbg_lss_o = 4'b0000;
208
 
209
reg     [1:0]                    dbg_is_o;
210
//
211
// Show insn activity (temp, must be removed)
212
//
213
always @(posedge clk or posedge rst)
214
        if (rst)
215
                dbg_is_o <= #1 2'b00;
216
        else if (!ex_freeze &
217
                ~((ex_insn[31:26] == `OR1200_OR32_NOP) & ex_insn[16]))
218
                dbg_is_o <= #1 ~dbg_is_o;
219
`ifdef UNUSED
220
assign dbg_is_o = 2'b00;
221
`endif
222
`else
223
assign dbg_lss_o = dcpu_cycstb_i ? {dcpu_we_i, 3'b000} : 4'b0000;
224
assign dbg_is_o = {1'b0, icpu_cycstb_i};
225
`endif
226
assign dbg_wp_o = 11'b000_0000_0000;
227
assign dbg_dat_o = du_dat_i;
228
 
229
//
230
// Some connections go directly from Debug I/F through DU to the CPU
231
//
232
assign du_stall = dbg_stall_i;
233
assign du_addr = dbg_adr_i;
234
assign du_dat_o = dbg_dat_i;
235
assign du_read = dbg_stb_i && !dbg_we_i;
236
assign du_write = dbg_stb_i && dbg_we_i;
237
 
238
//
239
// Generate acknowledge -- just delay stb signal
240
//
241
reg dbg_ack_o;
242
always @(posedge clk or posedge rst)
243
        if (rst)
244
                dbg_ack_o <= #1 1'b0;
245
        else
246
                dbg_ack_o <= #1 dbg_stb_i;
247
 
248
`ifdef OR1200_DU_IMPLEMENTED
249
 
250
//
251
// Debug Mode Register 1
252
//
253
`ifdef OR1200_DU_DMR1
254
reg     [24:0]                   dmr1;           // DMR1 implemented
255
`else
256
wire    [24:0]                   dmr1;           // DMR1 not implemented
257
`endif
258
 
259
//
260
// Debug Mode Register 2
261
//
262
`ifdef OR1200_DU_DMR2
263
reg     [23:0]                   dmr2;           // DMR2 implemented
264
`else
265
wire    [23:0]                   dmr2;           // DMR2 not implemented
266
`endif
267
 
268
//
269
// Debug Stop Register
270
//
271
`ifdef OR1200_DU_DSR
272
reg     [`OR1200_DU_DSR_WIDTH-1:0]       dsr;            // DSR implemented
273
`else
274
wire    [`OR1200_DU_DSR_WIDTH-1:0]       dsr;            // DSR not implemented
275
`endif
276
 
277
//
278
// Debug Reason Register
279
//
280
`ifdef OR1200_DU_DRR
281
reg     [13:0]                   drr;            // DRR implemented
282
`else
283
wire    [13:0]                   drr;            // DRR not implemented
284
`endif
285
 
286
//
287
// Debug Value Register N
288
//
289
`ifdef OR1200_DU_DVR0
290
reg     [31:0]                   dvr0;
291
`else
292
wire    [31:0]                   dvr0;
293
`endif
294
 
295
//
296
// Debug Value Register N
297
//
298
`ifdef OR1200_DU_DVR1
299
reg     [31:0]                   dvr1;
300
`else
301
wire    [31:0]                   dvr1;
302
`endif
303
 
304
//
305
// Debug Value Register N
306
//
307
`ifdef OR1200_DU_DVR2
308
reg     [31:0]                   dvr2;
309
`else
310
wire    [31:0]                   dvr2;
311
`endif
312
 
313
//
314
// Debug Value Register N
315
//
316
`ifdef OR1200_DU_DVR3
317
reg     [31:0]                   dvr3;
318
`else
319
wire    [31:0]                   dvr3;
320
`endif
321
 
322
//
323
// Debug Value Register N
324
//
325
`ifdef OR1200_DU_DVR4
326
reg     [31:0]                   dvr4;
327
`else
328
wire    [31:0]                   dvr4;
329
`endif
330
 
331
//
332
// Debug Value Register N
333
//
334
`ifdef OR1200_DU_DVR5
335
reg     [31:0]                   dvr5;
336
`else
337
wire    [31:0]                   dvr5;
338
`endif
339
 
340
//
341
// Debug Value Register N
342
//
343
`ifdef OR1200_DU_DVR6
344
reg     [31:0]                   dvr6;
345
`else
346
wire    [31:0]                   dvr6;
347
`endif
348
 
349
//
350
// Debug Value Register N
351
//
352
`ifdef OR1200_DU_DVR7
353
reg     [31:0]                   dvr7;
354
`else
355
wire    [31:0]                   dvr7;
356
`endif
357
 
358
//
359
// Debug Control Register N
360
//
361
`ifdef OR1200_DU_DCR0
362
reg     [7:0]                    dcr0;
363
`else
364
wire    [7:0]                    dcr0;
365
`endif
366
 
367
//
368
// Debug Control Register N
369
//
370
`ifdef OR1200_DU_DCR1
371
reg     [7:0]                    dcr1;
372
`else
373
wire    [7:0]                    dcr1;
374
`endif
375
 
376
//
377
// Debug Control Register N
378
//
379
`ifdef OR1200_DU_DCR2
380
reg     [7:0]                    dcr2;
381
`else
382
wire    [7:0]                    dcr2;
383
`endif
384
 
385
//
386
// Debug Control Register N
387
//
388
`ifdef OR1200_DU_DCR3
389
reg     [7:0]                    dcr3;
390
`else
391
wire    [7:0]                    dcr3;
392
`endif
393
 
394
//
395
// Debug Control Register N
396
//
397
`ifdef OR1200_DU_DCR4
398
reg     [7:0]                    dcr4;
399
`else
400
wire    [7:0]                    dcr4;
401
`endif
402
 
403
//
404
// Debug Control Register N
405
//
406
`ifdef OR1200_DU_DCR5
407
reg     [7:0]                    dcr5;
408
`else
409
wire    [7:0]                    dcr5;
410
`endif
411
 
412
//
413
// Debug Control Register N
414
//
415
`ifdef OR1200_DU_DCR6
416
reg     [7:0]                    dcr6;
417
`else
418
wire    [7:0]                    dcr6;
419
`endif
420
 
421
//
422
// Debug Control Register N
423
//
424
`ifdef OR1200_DU_DCR7
425
reg     [7:0]                    dcr7;
426
`else
427
wire    [7:0]                    dcr7;
428
`endif
429
 
430
//
431
// Debug Watchpoint Counter Register 0
432
//
433
`ifdef OR1200_DU_DWCR0
434
reg     [31:0]                   dwcr0;
435
`else
436
wire    [31:0]                   dwcr0;
437
`endif
438
 
439
//
440
// Debug Watchpoint Counter Register 1
441
//
442
`ifdef OR1200_DU_DWCR1
443
reg     [31:0]                   dwcr1;
444
`else
445
wire    [31:0]                   dwcr1;
446
`endif
447
 
448
//
449
// Internal wires
450
//
451
wire                            dmr1_sel;       // DMR1 select
452
wire                            dmr2_sel;       // DMR2 select
453
wire                            dsr_sel;        // DSR select
454
wire                            drr_sel;        // DRR select
455
wire                            dvr0_sel,
456
                                dvr1_sel,
457
                                dvr2_sel,
458
                                dvr3_sel,
459
                                dvr4_sel,
460
                                dvr5_sel,
461
                                dvr6_sel,
462
                                dvr7_sel;       // DVR selects
463
wire                            dcr0_sel,
464
                                dcr1_sel,
465
                                dcr2_sel,
466
                                dcr3_sel,
467
                                dcr4_sel,
468
                                dcr5_sel,
469
                                dcr6_sel,
470
                                dcr7_sel;       // DCR selects
471
wire                            dwcr0_sel,
472
                                dwcr1_sel;      // DWCR selects
473
reg                             dbg_bp_r;
474
`ifdef OR1200_DU_HWBKPTS
475
reg     [31:0]                   match_cond0_ct;
476
reg     [31:0]                   match_cond1_ct;
477
reg     [31:0]                   match_cond2_ct;
478
reg     [31:0]                   match_cond3_ct;
479
reg     [31:0]                   match_cond4_ct;
480
reg     [31:0]                   match_cond5_ct;
481
reg     [31:0]                   match_cond6_ct;
482
reg     [31:0]                   match_cond7_ct;
483
reg                             match_cond0_stb;
484
reg                             match_cond1_stb;
485
reg                             match_cond2_stb;
486
reg                             match_cond3_stb;
487
reg                             match_cond4_stb;
488
reg                             match_cond5_stb;
489
reg                             match_cond6_stb;
490
reg                             match_cond7_stb;
491
reg                             match0;
492
reg                             match1;
493
reg                             match2;
494
reg                             match3;
495
reg                             match4;
496
reg                             match5;
497
reg                             match6;
498
reg                             match7;
499
reg                             wpcntr0_match;
500
reg                             wpcntr1_match;
501
reg                             incr_wpcntr0;
502
reg                             incr_wpcntr1;
503
reg     [10:0]                   wp;
504
`endif
505
wire                            du_hwbkpt;
506
`ifdef OR1200_DU_READREGS
507
reg     [31:0]                   spr_dat_o;
508
`endif
509
reg     [13:0]                   except_stop;    // Exceptions that stop because of DSR
510
`ifdef OR1200_DU_TB_IMPLEMENTED
511
wire                            tb_enw;
512
reg     [7:0]                    tb_wadr;
513
reg [31:0]                       tb_timstmp;
514
`endif
515
wire    [31:0]                   tbia_dat_o;
516
wire    [31:0]                   tbim_dat_o;
517
wire    [31:0]                   tbar_dat_o;
518
wire    [31:0]                   tbts_dat_o;
519
 
520
//
521
// DU registers address decoder
522
//
523
`ifdef OR1200_DU_DMR1
524
assign dmr1_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DMR1));
525
`endif
526
`ifdef OR1200_DU_DMR2
527
assign dmr2_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DMR2));
528
`endif
529
`ifdef OR1200_DU_DSR
530
assign dsr_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DSR));
531
`endif
532
`ifdef OR1200_DU_DRR
533
assign drr_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DRR));
534
`endif
535
`ifdef OR1200_DU_DVR0
536
assign dvr0_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DVR0));
537
`endif
538
`ifdef OR1200_DU_DVR1
539
assign dvr1_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DVR1));
540
`endif
541
`ifdef OR1200_DU_DVR2
542
assign dvr2_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DVR2));
543
`endif
544
`ifdef OR1200_DU_DVR3
545
assign dvr3_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DVR3));
546
`endif
547
`ifdef OR1200_DU_DVR4
548
assign dvr4_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DVR4));
549
`endif
550
`ifdef OR1200_DU_DVR5
551
assign dvr5_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DVR5));
552
`endif
553
`ifdef OR1200_DU_DVR6
554
assign dvr6_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DVR6));
555
`endif
556
`ifdef OR1200_DU_DVR7
557
assign dvr7_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DVR7));
558
`endif
559
`ifdef OR1200_DU_DCR0
560
assign dcr0_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DCR0));
561
`endif
562
`ifdef OR1200_DU_DCR1
563
assign dcr1_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DCR1));
564
`endif
565
`ifdef OR1200_DU_DCR2
566
assign dcr2_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DCR2));
567
`endif
568
`ifdef OR1200_DU_DCR3
569
assign dcr3_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DCR3));
570
`endif
571
`ifdef OR1200_DU_DCR4
572
assign dcr4_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DCR4));
573
`endif
574
`ifdef OR1200_DU_DCR5
575
assign dcr5_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DCR5));
576
`endif
577
`ifdef OR1200_DU_DCR6
578
assign dcr6_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DCR6));
579
`endif
580
`ifdef OR1200_DU_DCR7
581
assign dcr7_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DCR7));
582
`endif
583
`ifdef OR1200_DU_DWCR0
584
assign dwcr0_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DWCR0));
585
`endif
586
`ifdef OR1200_DU_DWCR1
587
assign dwcr1_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DWCR1));
588
`endif
589
 
590
//
591
// Decode started exception
592
//
593
always @(du_except) begin
594
        except_stop = 14'b0000_0000_0000;
595
        casex (du_except)
596
                13'b1_xxxx_xxxx_xxxx:
597
                        except_stop[`OR1200_DU_DRR_TTE] = 1'b1;
598
                13'b0_1xxx_xxxx_xxxx: begin
599
                        except_stop[`OR1200_DU_DRR_IE] = 1'b1;
600
                end
601
                13'b0_01xx_xxxx_xxxx: begin
602
                        except_stop[`OR1200_DU_DRR_IME] = 1'b1;
603
                end
604
                13'b0_001x_xxxx_xxxx:
605
                        except_stop[`OR1200_DU_DRR_IPFE] = 1'b1;
606
                13'b0_0001_xxxx_xxxx: begin
607
                        except_stop[`OR1200_DU_DRR_BUSEE] = 1'b1;
608
                end
609
                13'b0_0000_1xxx_xxxx:
610
                        except_stop[`OR1200_DU_DRR_IIE] = 1'b1;
611
                13'b0_0000_01xx_xxxx: begin
612
                        except_stop[`OR1200_DU_DRR_AE] = 1'b1;
613
                end
614
                13'b0_0000_001x_xxxx: begin
615
                        except_stop[`OR1200_DU_DRR_DME] = 1'b1;
616
                end
617
                13'b0_0000_0001_xxxx:
618
                        except_stop[`OR1200_DU_DRR_DPFE] = 1'b1;
619
                13'b0_0000_0000_1xxx:
620
                        except_stop[`OR1200_DU_DRR_BUSEE] = 1'b1;
621
                13'b0_0000_0000_01xx: begin
622
                        except_stop[`OR1200_DU_DRR_RE] = 1'b1;
623
                end
624
                13'b0_0000_0000_001x: begin
625
                        except_stop[`OR1200_DU_DRR_TE] = 1'b1;
626
                end
627
                13'b0_0000_0000_0001:
628
                        except_stop[`OR1200_DU_DRR_SCE] = 1'b1;
629
                default:
630
                        except_stop = 14'b0000_0000_0000;
631
        endcase
632
end
633
 
634
//
635
// dbg_bp_o is registered
636
//
637
assign dbg_bp_o = dbg_bp_r;
638
 
639
//
640
// Breakpoint activation register
641
//
642
always @(posedge clk or posedge rst)
643
        if (rst)
644
                dbg_bp_r <= #1 1'b0;
645
        else if (!ex_freeze)
646
                dbg_bp_r <= #1 |except_stop
647
`ifdef OR1200_DU_DMR1_ST
648
                        | ~((ex_insn[31:26] == `OR1200_OR32_NOP) & ex_insn[16]) & dmr1[`OR1200_DU_DMR1_ST]
649
`endif
650
`ifdef OR1200_DU_DMR1_BT
651
                        | (branch_op != `OR1200_BRANCHOP_NOP) & dmr1[`OR1200_DU_DMR1_BT]
652
`endif
653
                        ;
654
        else
655
                dbg_bp_r <= #1 |except_stop;
656
 
657
//
658
// Write to DMR1
659
//
660
`ifdef OR1200_DU_DMR1
661
always @(posedge clk or posedge rst)
662
        if (rst)
663
                dmr1 <= 25'h000_0000;
664
        else if (dmr1_sel && spr_write)
665
`ifdef OR1200_DU_HWBKPTS
666
                dmr1 <= #1 spr_dat_i[24:0];
667
`else
668
                dmr1 <= #1 {1'b0, spr_dat_i[23:22], 22'h00_0000};
669
`endif
670
`else
671
assign dmr1 = 25'h000_0000;
672
`endif
673
 
674
//
675
// Write to DMR2
676
//
677
`ifdef OR1200_DU_DMR2
678
always @(posedge clk or posedge rst)
679
        if (rst)
680
                dmr2 <= 24'h00_0000;
681
        else if (dmr2_sel && spr_write)
682
                dmr2 <= #1 spr_dat_i[23:0];
683
`else
684
assign dmr2 = 24'h00_0000;
685
`endif
686
 
687
//
688
// Write to DSR
689
//
690
`ifdef OR1200_DU_DSR
691
always @(posedge clk or posedge rst)
692
        if (rst)
693
                dsr <= {`OR1200_DU_DSR_WIDTH{1'b0}};
694
        else if (dsr_sel && spr_write)
695
                dsr <= #1 spr_dat_i[`OR1200_DU_DSR_WIDTH-1:0];
696
`else
697
assign dsr = {`OR1200_DU_DSR_WIDTH{1'b0}};
698
`endif
699
 
700
//
701
// Write to DRR
702
//
703
`ifdef OR1200_DU_DRR
704
always @(posedge clk or posedge rst)
705
        if (rst)
706
                drr <= 14'b0;
707
        else if (drr_sel && spr_write)
708
                drr <= #1 spr_dat_i[13:0];
709
        else
710
                drr <= #1 drr | except_stop;
711
`else
712
assign drr = 14'b0;
713
`endif
714
 
715
//
716
// Write to DVR0
717
//
718
`ifdef OR1200_DU_DVR0
719
always @(posedge clk or posedge rst)
720
        if (rst)
721
                dvr0 <= 32'h0000_0000;
722
        else if (dvr0_sel && spr_write)
723
                dvr0 <= #1 spr_dat_i[31:0];
724
`else
725
assign dvr0 = 32'h0000_0000;
726
`endif
727
 
728
//
729
// Write to DVR1
730
//
731
`ifdef OR1200_DU_DVR1
732
always @(posedge clk or posedge rst)
733
        if (rst)
734
                dvr1 <= 32'h0000_0000;
735
        else if (dvr1_sel && spr_write)
736
                dvr1 <= #1 spr_dat_i[31:0];
737
`else
738
assign dvr1 = 32'h0000_0000;
739
`endif
740
 
741
//
742
// Write to DVR2
743
//
744
`ifdef OR1200_DU_DVR2
745
always @(posedge clk or posedge rst)
746
        if (rst)
747
                dvr2 <= 32'h0000_0000;
748
        else if (dvr2_sel && spr_write)
749
                dvr2 <= #1 spr_dat_i[31:0];
750
`else
751
assign dvr2 = 32'h0000_0000;
752
`endif
753
 
754
//
755
// Write to DVR3
756
//
757
`ifdef OR1200_DU_DVR3
758
always @(posedge clk or posedge rst)
759
        if (rst)
760
                dvr3 <= 32'h0000_0000;
761
        else if (dvr3_sel && spr_write)
762
                dvr3 <= #1 spr_dat_i[31:0];
763
`else
764
assign dvr3 = 32'h0000_0000;
765
`endif
766
 
767
//
768
// Write to DVR4
769
//
770
`ifdef OR1200_DU_DVR4
771
always @(posedge clk or posedge rst)
772
        if (rst)
773
                dvr4 <= 32'h0000_0000;
774
        else if (dvr4_sel && spr_write)
775
                dvr4 <= #1 spr_dat_i[31:0];
776
`else
777
assign dvr4 = 32'h0000_0000;
778
`endif
779
 
780
//
781
// Write to DVR5
782
//
783
`ifdef OR1200_DU_DVR5
784
always @(posedge clk or posedge rst)
785
        if (rst)
786
                dvr5 <= 32'h0000_0000;
787
        else if (dvr5_sel && spr_write)
788
                dvr5 <= #1 spr_dat_i[31:0];
789
`else
790
assign dvr5 = 32'h0000_0000;
791
`endif
792
 
793
//
794
// Write to DVR6
795
//
796
`ifdef OR1200_DU_DVR6
797
always @(posedge clk or posedge rst)
798
        if (rst)
799
                dvr6 <= 32'h0000_0000;
800
        else if (dvr6_sel && spr_write)
801
                dvr6 <= #1 spr_dat_i[31:0];
802
`else
803
assign dvr6 = 32'h0000_0000;
804
`endif
805
 
806
//
807
// Write to DVR7
808
//
809
`ifdef OR1200_DU_DVR7
810
always @(posedge clk or posedge rst)
811
        if (rst)
812
                dvr7 <= 32'h0000_0000;
813
        else if (dvr7_sel && spr_write)
814
                dvr7 <= #1 spr_dat_i[31:0];
815
`else
816
assign dvr7 = 32'h0000_0000;
817
`endif
818
 
819
//
820
// Write to DCR0
821
//
822
`ifdef OR1200_DU_DCR0
823
always @(posedge clk or posedge rst)
824
        if (rst)
825
                dcr0 <= 8'h00;
826
        else if (dcr0_sel && spr_write)
827
                dcr0 <= #1 spr_dat_i[7:0];
828
`else
829
assign dcr0 = 8'h00;
830
`endif
831
 
832
//
833
// Write to DCR1
834
//
835
`ifdef OR1200_DU_DCR1
836
always @(posedge clk or posedge rst)
837
        if (rst)
838
                dcr1 <= 8'h00;
839
        else if (dcr1_sel && spr_write)
840
                dcr1 <= #1 spr_dat_i[7:0];
841
`else
842
assign dcr1 = 8'h00;
843
`endif
844
 
845
//
846
// Write to DCR2
847
//
848
`ifdef OR1200_DU_DCR2
849
always @(posedge clk or posedge rst)
850
        if (rst)
851
                dcr2 <= 8'h00;
852
        else if (dcr2_sel && spr_write)
853
                dcr2 <= #1 spr_dat_i[7:0];
854
`else
855
assign dcr2 = 8'h00;
856
`endif
857
 
858
//
859
// Write to DCR3
860
//
861
`ifdef OR1200_DU_DCR3
862
always @(posedge clk or posedge rst)
863
        if (rst)
864
                dcr3 <= 8'h00;
865
        else if (dcr3_sel && spr_write)
866
                dcr3 <= #1 spr_dat_i[7:0];
867
`else
868
assign dcr3 = 8'h00;
869
`endif
870
 
871
//
872
// Write to DCR4
873
//
874
`ifdef OR1200_DU_DCR4
875
always @(posedge clk or posedge rst)
876
        if (rst)
877
                dcr4 <= 8'h00;
878
        else if (dcr4_sel && spr_write)
879
                dcr4 <= #1 spr_dat_i[7:0];
880
`else
881
assign dcr4 = 8'h00;
882
`endif
883
 
884
//
885
// Write to DCR5
886
//
887
`ifdef OR1200_DU_DCR5
888
always @(posedge clk or posedge rst)
889
        if (rst)
890
                dcr5 <= 8'h00;
891
        else if (dcr5_sel && spr_write)
892
                dcr5 <= #1 spr_dat_i[7:0];
893
`else
894
assign dcr5 = 8'h00;
895
`endif
896
 
897
//
898
// Write to DCR6
899
//
900
`ifdef OR1200_DU_DCR6
901
always @(posedge clk or posedge rst)
902
        if (rst)
903
                dcr6 <= 8'h00;
904
        else if (dcr6_sel && spr_write)
905
                dcr6 <= #1 spr_dat_i[7:0];
906
`else
907
assign dcr6 = 8'h00;
908
`endif
909
 
910
//
911
// Write to DCR7
912
//
913
`ifdef OR1200_DU_DCR7
914
always @(posedge clk or posedge rst)
915
        if (rst)
916
                dcr7 <= 8'h00;
917
        else if (dcr7_sel && spr_write)
918
                dcr7 <= #1 spr_dat_i[7:0];
919
`else
920
assign dcr7 = 8'h00;
921
`endif
922
 
923
//
924
// Write to DWCR0
925
//
926
`ifdef OR1200_DU_DWCR0
927
always @(posedge clk or posedge rst)
928
        if (rst)
929
                dwcr0 <= 32'h0000_0000;
930
        else if (dwcr0_sel && spr_write)
931
                dwcr0 <= #1 spr_dat_i[31:0];
932
        else if (incr_wpcntr0)
933
                dwcr0[`OR1200_DU_DWCR_COUNT] <= #1 dwcr0[`OR1200_DU_DWCR_COUNT] + 16'h0001;
934
`else
935
assign dwcr0 = 32'h0000_0000;
936
`endif
937
 
938
//
939
// Write to DWCR1
940
//
941
`ifdef OR1200_DU_DWCR1
942
always @(posedge clk or posedge rst)
943
        if (rst)
944
                dwcr1 <= 32'h0000_0000;
945
        else if (dwcr1_sel && spr_write)
946
                dwcr1 <= #1 spr_dat_i[31:0];
947
        else if (incr_wpcntr1)
948
                dwcr1[`OR1200_DU_DWCR_COUNT] <= #1 dwcr1[`OR1200_DU_DWCR_COUNT] + 16'h0001;
949
`else
950
assign dwcr1 = 32'h0000_0000;
951
`endif
952
 
953
//
954
// Read DU registers
955
//
956
`ifdef OR1200_DU_READREGS
957
always @(spr_addr or dsr or drr or dmr1 or dmr2
958
        or dvr0 or dvr1 or dvr2 or dvr3 or dvr4
959
        or dvr5 or dvr6 or dvr7
960
        or dcr0 or dcr1 or dcr2 or dcr3 or dcr4
961
        or dcr5 or dcr6 or dcr7
962
        or dwcr0 or dwcr1
963
`ifdef OR1200_DU_TB_IMPLEMENTED
964
        or tb_wadr or tbia_dat_o or tbim_dat_o
965
        or tbar_dat_o or tbts_dat_o
966
`endif
967
        )
968
        casex (spr_addr[`OR1200_DUOFS_BITS]) // synopsys parallel_case
969
`ifdef OR1200_DU_DVR0
970
                `OR1200_DU_DVR0:
971
                        spr_dat_o = dvr0;
972
`endif
973
`ifdef OR1200_DU_DVR1
974
                `OR1200_DU_DVR1:
975
                        spr_dat_o = dvr1;
976
`endif
977
`ifdef OR1200_DU_DVR2
978
                `OR1200_DU_DVR2:
979
                        spr_dat_o = dvr2;
980
`endif
981
`ifdef OR1200_DU_DVR3
982
                `OR1200_DU_DVR3:
983
                        spr_dat_o = dvr3;
984
`endif
985
`ifdef OR1200_DU_DVR4
986
                `OR1200_DU_DVR4:
987
                        spr_dat_o = dvr4;
988
`endif
989
`ifdef OR1200_DU_DVR5
990
                `OR1200_DU_DVR5:
991
                        spr_dat_o = dvr5;
992
`endif
993
`ifdef OR1200_DU_DVR6
994
                `OR1200_DU_DVR6:
995
                        spr_dat_o = dvr6;
996
`endif
997
`ifdef OR1200_DU_DVR7
998
                `OR1200_DU_DVR7:
999
                        spr_dat_o = dvr7;
1000
`endif
1001
`ifdef OR1200_DU_DCR0
1002
                `OR1200_DU_DCR0:
1003
                        spr_dat_o = {24'h00_0000, dcr0};
1004
`endif
1005
`ifdef OR1200_DU_DCR1
1006
                `OR1200_DU_DCR1:
1007
                        spr_dat_o = {24'h00_0000, dcr1};
1008
`endif
1009
`ifdef OR1200_DU_DCR2
1010
                `OR1200_DU_DCR2:
1011
                        spr_dat_o = {24'h00_0000, dcr2};
1012
`endif
1013
`ifdef OR1200_DU_DCR3
1014
                `OR1200_DU_DCR3:
1015
                        spr_dat_o = {24'h00_0000, dcr3};
1016
`endif
1017
`ifdef OR1200_DU_DCR4
1018
                `OR1200_DU_DCR4:
1019
                        spr_dat_o = {24'h00_0000, dcr4};
1020
`endif
1021
`ifdef OR1200_DU_DCR5
1022
                `OR1200_DU_DCR5:
1023
                        spr_dat_o = {24'h00_0000, dcr5};
1024
`endif
1025
`ifdef OR1200_DU_DCR6
1026
                `OR1200_DU_DCR6:
1027
                        spr_dat_o = {24'h00_0000, dcr6};
1028
`endif
1029
`ifdef OR1200_DU_DCR7
1030
                `OR1200_DU_DCR7:
1031
                        spr_dat_o = {24'h00_0000, dcr7};
1032
`endif
1033
`ifdef OR1200_DU_DMR1
1034
                `OR1200_DU_DMR1:
1035
                        spr_dat_o = {7'h00, dmr1};
1036
`endif
1037
`ifdef OR1200_DU_DMR2
1038
                `OR1200_DU_DMR2:
1039
                        spr_dat_o = {8'h00, dmr2};
1040
`endif
1041
`ifdef OR1200_DU_DWCR0
1042
                `OR1200_DU_DWCR0:
1043
                        spr_dat_o = dwcr0;
1044
`endif
1045
`ifdef OR1200_DU_DWCR1
1046
                `OR1200_DU_DWCR1:
1047
                        spr_dat_o = dwcr1;
1048
`endif
1049
`ifdef OR1200_DU_DSR
1050
                `OR1200_DU_DSR:
1051
                        spr_dat_o = {18'b0, dsr};
1052
`endif
1053
`ifdef OR1200_DU_DRR
1054
                `OR1200_DU_DRR:
1055
                        spr_dat_o = {18'b0, drr};
1056
`endif
1057
`ifdef OR1200_DU_TB_IMPLEMENTED
1058
                `OR1200_DU_TBADR:
1059
                        spr_dat_o = {24'h000000, tb_wadr};
1060
                `OR1200_DU_TBIA:
1061
                        spr_dat_o = tbia_dat_o;
1062
                `OR1200_DU_TBIM:
1063
                        spr_dat_o = tbim_dat_o;
1064
                `OR1200_DU_TBAR:
1065
                        spr_dat_o = tbar_dat_o;
1066
                `OR1200_DU_TBTS:
1067
                        spr_dat_o = tbts_dat_o;
1068
`endif
1069
                default:
1070
                        spr_dat_o = 32'h0000_0000;
1071
        endcase
1072
`endif
1073
 
1074
//
1075
// DSR alias
1076
//
1077
assign du_dsr = dsr;
1078
 
1079
`ifdef OR1200_DU_HWBKPTS
1080
 
1081
//
1082
// Compare To What (Match Condition 0)
1083
//
1084
always @(dcr0 or id_pc or dcpu_adr_i or dcpu_dat_dc
1085
        or dcpu_dat_lsu or dcpu_we_i)
1086
        case (dcr0[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1087
                3'b001: match_cond0_ct = id_pc;         // insn fetch EA
1088
                3'b010: match_cond0_ct = dcpu_adr_i;    // load EA
1089
                3'b011: match_cond0_ct = dcpu_adr_i;    // store EA
1090
                3'b100: match_cond0_ct = dcpu_dat_dc;   // load data
1091
                3'b101: match_cond0_ct = dcpu_dat_lsu;  // store data
1092
                3'b110: match_cond0_ct = dcpu_adr_i;    // load/store EA
1093
                default:match_cond0_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1094
        endcase
1095
 
1096
//
1097
// When To Compare (Match Condition 0)
1098
//
1099
always @(dcr0 or dcpu_cycstb_i)
1100
        case (dcr0[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1101
                3'b000: match_cond0_stb = 1'b0;         //comparison disabled
1102
                3'b001: match_cond0_stb = 1'b1;         // insn fetch EA
1103
                default:match_cond0_stb = dcpu_cycstb_i; // any load/store
1104
        endcase
1105
 
1106
//
1107
// Match Condition 0
1108
//
1109
always @(match_cond0_stb or dcr0 or dvr0 or match_cond0_ct)
1110
        casex ({match_cond0_stb, dcr0[`OR1200_DU_DCR_CC]})
1111
                4'b0_xxx,
1112
                4'b1_000,
1113
                4'b1_111: match0 = 1'b0;
1114
                4'b1_001: match0 =
1115
                        ((match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]) ==
1116
                        (dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]));
1117
                4'b1_010: match0 =
1118
                        ((match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]) <
1119
                        (dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]));
1120
                4'b1_011: match0 =
1121
                        ((match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]) <=
1122
                        (dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]));
1123
                4'b1_100: match0 =
1124
                        ((match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]) >
1125
                        (dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]));
1126
                4'b1_101: match0 =
1127
                        ((match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]) >=
1128
                        (dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]));
1129
                4'b1_110: match0 =
1130
                        ((match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]) !=
1131
                        (dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]));
1132
        endcase
1133
 
1134
//
1135
// Watchpoint 0
1136
//
1137
always @(dmr1 or match0)
1138
        case (dmr1[`OR1200_DU_DMR1_CW0])
1139
                2'b00: wp[0] = match0;
1140
                2'b01: wp[0] = match0;
1141
                2'b10: wp[0] = match0;
1142
                2'b11: wp[0] = 1'b0;
1143
        endcase
1144
 
1145
//
1146
// Compare To What (Match Condition 1)
1147
//
1148
always @(dcr1 or id_pc or dcpu_adr_i or dcpu_dat_dc
1149
        or dcpu_dat_lsu or dcpu_we_i)
1150
        case (dcr1[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1151
                3'b001: match_cond1_ct = id_pc;         // insn fetch EA
1152
                3'b010: match_cond1_ct = dcpu_adr_i;    // load EA
1153
                3'b011: match_cond1_ct = dcpu_adr_i;    // store EA
1154
                3'b100: match_cond1_ct = dcpu_dat_dc;   // load data
1155
                3'b101: match_cond1_ct = dcpu_dat_lsu;  // store data
1156
                3'b110: match_cond1_ct = dcpu_adr_i;    // load/store EA
1157
                default:match_cond1_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1158
        endcase
1159
 
1160
//
1161
// When To Compare (Match Condition 1)
1162
//
1163
always @(dcr1 or dcpu_cycstb_i)
1164
        case (dcr1[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1165
                3'b000: match_cond1_stb = 1'b0;         //comparison disabled
1166
                3'b001: match_cond1_stb = 1'b1;         // insn fetch EA
1167
                default:match_cond1_stb = dcpu_cycstb_i; // any load/store
1168
        endcase
1169
 
1170
//
1171
// Match Condition 1
1172
//
1173
always @(match_cond1_stb or dcr1 or dvr1 or match_cond1_ct)
1174
        casex ({match_cond1_stb, dcr1[`OR1200_DU_DCR_CC]})
1175
                4'b0_xxx,
1176
                4'b1_000,
1177
                4'b1_111: match1 = 1'b0;
1178
                4'b1_001: match1 =
1179
                        ((match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]) ==
1180
                        (dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]));
1181
                4'b1_010: match1 =
1182
                        ((match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]) <
1183
                        (dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]));
1184
                4'b1_011: match1 =
1185
                        ((match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]) <=
1186
                        (dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]));
1187
                4'b1_100: match1 =
1188
                        ((match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]) >
1189
                        (dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]));
1190
                4'b1_101: match1 =
1191
                        ((match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]) >=
1192
                        (dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]));
1193
                4'b1_110: match1 =
1194
                        ((match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]) !=
1195
                        (dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]));
1196
        endcase
1197
 
1198
//
1199
// Watchpoint 1
1200
//
1201
always @(dmr1 or match1 or wp)
1202
        case (dmr1[`OR1200_DU_DMR1_CW1])
1203
                2'b00: wp[1] = match1;
1204
                2'b01: wp[1] = match1 & wp[0];
1205
                2'b10: wp[1] = match1 | wp[0];
1206
                2'b11: wp[1] = 1'b0;
1207
        endcase
1208
 
1209
//
1210
// Compare To What (Match Condition 2)
1211
//
1212
always @(dcr2 or id_pc or dcpu_adr_i or dcpu_dat_dc
1213
        or dcpu_dat_lsu or dcpu_we_i)
1214
        case (dcr2[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1215
                3'b001: match_cond2_ct = id_pc;         // insn fetch EA
1216
                3'b010: match_cond2_ct = dcpu_adr_i;    // load EA
1217
                3'b011: match_cond2_ct = dcpu_adr_i;    // store EA
1218
                3'b100: match_cond2_ct = dcpu_dat_dc;   // load data
1219
                3'b101: match_cond2_ct = dcpu_dat_lsu;  // store data
1220
                3'b110: match_cond2_ct = dcpu_adr_i;    // load/store EA
1221
                default:match_cond2_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1222
        endcase
1223
 
1224
//
1225
// When To Compare (Match Condition 2)
1226
//
1227
always @(dcr2 or dcpu_cycstb_i)
1228
        case (dcr2[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1229
                3'b000: match_cond2_stb = 1'b0;         //comparison disabled
1230
                3'b001: match_cond2_stb = 1'b1;         // insn fetch EA
1231
                default:match_cond2_stb = dcpu_cycstb_i; // any load/store
1232
        endcase
1233
 
1234
//
1235
// Match Condition 2
1236
//
1237
always @(match_cond2_stb or dcr2 or dvr2 or match_cond2_ct)
1238
        casex ({match_cond2_stb, dcr2[`OR1200_DU_DCR_CC]})
1239
                4'b0_xxx,
1240
                4'b1_000,
1241
                4'b1_111: match2 = 1'b0;
1242
                4'b1_001: match2 =
1243
                        ((match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]) ==
1244
                        (dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]));
1245
                4'b1_010: match2 =
1246
                        ((match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]) <
1247
                        (dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]));
1248
                4'b1_011: match2 =
1249
                        ((match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]) <=
1250
                        (dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]));
1251
                4'b1_100: match2 =
1252
                        ((match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]) >
1253
                        (dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]));
1254
                4'b1_101: match2 =
1255
                        ((match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]) >=
1256
                        (dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]));
1257
                4'b1_110: match2 =
1258
                        ((match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]) !=
1259
                        (dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]));
1260
        endcase
1261
 
1262
//
1263
// Watchpoint 2
1264
//
1265
always @(dmr1 or match2 or wp)
1266
        case (dmr1[`OR1200_DU_DMR1_CW2])
1267
                2'b00: wp[2] = match2;
1268
                2'b01: wp[2] = match2 & wp[1];
1269
                2'b10: wp[2] = match2 | wp[1];
1270
                2'b11: wp[2] = 1'b0;
1271
        endcase
1272
 
1273
//
1274
// Compare To What (Match Condition 3)
1275
//
1276
always @(dcr3 or id_pc or dcpu_adr_i or dcpu_dat_dc
1277
        or dcpu_dat_lsu or dcpu_we_i)
1278
        case (dcr3[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1279
                3'b001: match_cond3_ct = id_pc;         // insn fetch EA
1280
                3'b010: match_cond3_ct = dcpu_adr_i;    // load EA
1281
                3'b011: match_cond3_ct = dcpu_adr_i;    // store EA
1282
                3'b100: match_cond3_ct = dcpu_dat_dc;   // load data
1283
                3'b101: match_cond3_ct = dcpu_dat_lsu;  // store data
1284
                3'b110: match_cond3_ct = dcpu_adr_i;    // load/store EA
1285
                default:match_cond3_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1286
        endcase
1287
 
1288
//
1289
// When To Compare (Match Condition 3)
1290
//
1291
always @(dcr3 or dcpu_cycstb_i)
1292
        case (dcr3[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1293
                3'b000: match_cond3_stb = 1'b0;         //comparison disabled
1294
                3'b001: match_cond3_stb = 1'b1;         // insn fetch EA
1295
                default:match_cond3_stb = dcpu_cycstb_i; // any load/store
1296
        endcase
1297
 
1298
//
1299
// Match Condition 3
1300
//
1301
always @(match_cond3_stb or dcr3 or dvr3 or match_cond3_ct)
1302
        casex ({match_cond3_stb, dcr3[`OR1200_DU_DCR_CC]})
1303
                4'b0_xxx,
1304
                4'b1_000,
1305
                4'b1_111: match3 = 1'b0;
1306
                4'b1_001: match3 =
1307
                        ((match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]) ==
1308
                        (dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]));
1309
                4'b1_010: match3 =
1310
                        ((match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]) <
1311
                        (dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]));
1312
                4'b1_011: match3 =
1313
                        ((match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]) <=
1314
                        (dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]));
1315
                4'b1_100: match3 =
1316
                        ((match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]) >
1317
                        (dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]));
1318
                4'b1_101: match3 =
1319
                        ((match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]) >=
1320
                        (dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]));
1321
                4'b1_110: match3 =
1322
                        ((match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]) !=
1323
                        (dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]));
1324
        endcase
1325
 
1326
//
1327
// Watchpoint 3
1328
//
1329
always @(dmr1 or match3 or wp)
1330
        case (dmr1[`OR1200_DU_DMR1_CW3])
1331
                2'b00: wp[3] = match3;
1332
                2'b01: wp[3] = match3 & wp[2];
1333
                2'b10: wp[3] = match3 | wp[2];
1334
                2'b11: wp[3] = 1'b0;
1335
        endcase
1336
 
1337
//
1338
// Compare To What (Match Condition 4)
1339
//
1340
always @(dcr4 or id_pc or dcpu_adr_i or dcpu_dat_dc
1341
        or dcpu_dat_lsu or dcpu_we_i)
1342
        case (dcr4[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1343
                3'b001: match_cond4_ct = id_pc;         // insn fetch EA
1344
                3'b010: match_cond4_ct = dcpu_adr_i;    // load EA
1345
                3'b011: match_cond4_ct = dcpu_adr_i;    // store EA
1346
                3'b100: match_cond4_ct = dcpu_dat_dc;   // load data
1347
                3'b101: match_cond4_ct = dcpu_dat_lsu;  // store data
1348
                3'b110: match_cond4_ct = dcpu_adr_i;    // load/store EA
1349
                default:match_cond4_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1350
        endcase
1351
 
1352
//
1353
// When To Compare (Match Condition 4)
1354
//
1355
always @(dcr4 or dcpu_cycstb_i)
1356
        case (dcr4[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1357
                3'b000: match_cond4_stb = 1'b0;         //comparison disabled
1358
                3'b001: match_cond4_stb = 1'b1;         // insn fetch EA
1359
                default:match_cond4_stb = dcpu_cycstb_i; // any load/store
1360
        endcase
1361
 
1362
//
1363
// Match Condition 4
1364
//
1365
always @(match_cond4_stb or dcr4 or dvr4 or match_cond4_ct)
1366
        casex ({match_cond4_stb, dcr4[`OR1200_DU_DCR_CC]})
1367
                4'b0_xxx,
1368
                4'b1_000,
1369
                4'b1_111: match4 = 1'b0;
1370
                4'b1_001: match4 =
1371
                        ((match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]) ==
1372
                        (dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]));
1373
                4'b1_010: match4 =
1374
                        ((match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]) <
1375
                        (dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]));
1376
                4'b1_011: match4 =
1377
                        ((match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]) <=
1378
                        (dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]));
1379
                4'b1_100: match4 =
1380
                        ((match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]) >
1381
                        (dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]));
1382
                4'b1_101: match4 =
1383
                        ((match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]) >=
1384
                        (dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]));
1385
                4'b1_110: match4 =
1386
                        ((match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]) !=
1387
                        (dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]));
1388
        endcase
1389
 
1390
//
1391
// Watchpoint 4
1392
//
1393
always @(dmr1 or match4 or wp)
1394
        case (dmr1[`OR1200_DU_DMR1_CW4])
1395
                2'b00: wp[4] = match4;
1396
                2'b01: wp[4] = match4 & wp[3];
1397
                2'b10: wp[4] = match4 | wp[3];
1398
                2'b11: wp[4] = 1'b0;
1399
        endcase
1400
 
1401
//
1402
// Compare To What (Match Condition 5)
1403
//
1404
always @(dcr5 or id_pc or dcpu_adr_i or dcpu_dat_dc
1405
        or dcpu_dat_lsu or dcpu_we_i)
1406
        case (dcr5[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1407
                3'b001: match_cond5_ct = id_pc;         // insn fetch EA
1408
                3'b010: match_cond5_ct = dcpu_adr_i;    // load EA
1409
                3'b011: match_cond5_ct = dcpu_adr_i;    // store EA
1410
                3'b100: match_cond5_ct = dcpu_dat_dc;   // load data
1411
                3'b101: match_cond5_ct = dcpu_dat_lsu;  // store data
1412
                3'b110: match_cond5_ct = dcpu_adr_i;    // load/store EA
1413
                default:match_cond5_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1414
        endcase
1415
 
1416
//
1417
// When To Compare (Match Condition 5)
1418
//
1419
always @(dcr5 or dcpu_cycstb_i)
1420
        case (dcr5[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1421
                3'b000: match_cond5_stb = 1'b0;         //comparison disabled
1422
                3'b001: match_cond5_stb = 1'b1;         // insn fetch EA
1423
                default:match_cond5_stb = dcpu_cycstb_i; // any load/store
1424
        endcase
1425
 
1426
//
1427
// Match Condition 5
1428
//
1429
always @(match_cond5_stb or dcr5 or dvr5 or match_cond5_ct)
1430
        casex ({match_cond5_stb, dcr5[`OR1200_DU_DCR_CC]})
1431
                4'b0_xxx,
1432
                4'b1_000,
1433
                4'b1_111: match5 = 1'b0;
1434
                4'b1_001: match5 =
1435
                        ((match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]) ==
1436
                        (dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]));
1437
                4'b1_010: match5 =
1438
                        ((match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]) <
1439
                        (dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]));
1440
                4'b1_011: match5 =
1441
                        ((match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]) <=
1442
                        (dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]));
1443
                4'b1_100: match5 =
1444
                        ((match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]) >
1445
                        (dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]));
1446
                4'b1_101: match5 =
1447
                        ((match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]) >=
1448
                        (dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]));
1449
                4'b1_110: match5 =
1450
                        ((match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]) !=
1451
                        (dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]));
1452
        endcase
1453
 
1454
//
1455
// Watchpoint 5
1456
//
1457
always @(dmr1 or match5 or wp)
1458
        case (dmr1[`OR1200_DU_DMR1_CW5])
1459
                2'b00: wp[5] = match5;
1460
                2'b01: wp[5] = match5 & wp[4];
1461
                2'b10: wp[5] = match5 | wp[4];
1462
                2'b11: wp[5] = 1'b0;
1463
        endcase
1464
 
1465
//
1466
// Compare To What (Match Condition 6)
1467
//
1468
always @(dcr6 or id_pc or dcpu_adr_i or dcpu_dat_dc
1469
        or dcpu_dat_lsu or dcpu_we_i)
1470
        case (dcr6[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1471
                3'b001: match_cond6_ct = id_pc;         // insn fetch EA
1472
                3'b010: match_cond6_ct = dcpu_adr_i;    // load EA
1473
                3'b011: match_cond6_ct = dcpu_adr_i;    // store EA
1474
                3'b100: match_cond6_ct = dcpu_dat_dc;   // load data
1475
                3'b101: match_cond6_ct = dcpu_dat_lsu;  // store data
1476
                3'b110: match_cond6_ct = dcpu_adr_i;    // load/store EA
1477
                default:match_cond6_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1478
        endcase
1479
 
1480
//
1481
// When To Compare (Match Condition 6)
1482
//
1483
always @(dcr6 or dcpu_cycstb_i)
1484
        case (dcr6[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1485
                3'b000: match_cond6_stb = 1'b0;         //comparison disabled
1486
                3'b001: match_cond6_stb = 1'b1;         // insn fetch EA
1487
                default:match_cond6_stb = dcpu_cycstb_i; // any load/store
1488
        endcase
1489
 
1490
//
1491
// Match Condition 6
1492
//
1493
always @(match_cond6_stb or dcr6 or dvr6 or match_cond6_ct)
1494
        casex ({match_cond6_stb, dcr6[`OR1200_DU_DCR_CC]})
1495
                4'b0_xxx,
1496
                4'b1_000,
1497
                4'b1_111: match6 = 1'b0;
1498
                4'b1_001: match6 =
1499
                        ((match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]) ==
1500
                        (dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]));
1501
                4'b1_010: match6 =
1502
                        ((match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]) <
1503
                        (dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]));
1504
                4'b1_011: match6 =
1505
                        ((match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]) <=
1506
                        (dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]));
1507
                4'b1_100: match6 =
1508
                        ((match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]) >
1509
                        (dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]));
1510
                4'b1_101: match6 =
1511
                        ((match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]) >=
1512
                        (dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]));
1513
                4'b1_110: match6 =
1514
                        ((match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]) !=
1515
                        (dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]));
1516
        endcase
1517
 
1518
//
1519
// Watchpoint 6
1520
//
1521
always @(dmr1 or match6 or wp)
1522
        case (dmr1[`OR1200_DU_DMR1_CW6])
1523
                2'b00: wp[6] = match6;
1524
                2'b01: wp[6] = match6 & wp[5];
1525
                2'b10: wp[6] = match6 | wp[5];
1526
                2'b11: wp[6] = 1'b0;
1527
        endcase
1528
 
1529
//
1530
// Compare To What (Match Condition 7)
1531
//
1532
always @(dcr7 or id_pc or dcpu_adr_i or dcpu_dat_dc
1533
        or dcpu_dat_lsu or dcpu_we_i)
1534
        case (dcr7[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1535
                3'b001: match_cond7_ct = id_pc;         // insn fetch EA
1536
                3'b010: match_cond7_ct = dcpu_adr_i;    // load EA
1537
                3'b011: match_cond7_ct = dcpu_adr_i;    // store EA
1538
                3'b100: match_cond7_ct = dcpu_dat_dc;   // load data
1539
                3'b101: match_cond7_ct = dcpu_dat_lsu;  // store data
1540
                3'b110: match_cond7_ct = dcpu_adr_i;    // load/store EA
1541
                default:match_cond7_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1542
        endcase
1543
 
1544
//
1545
// When To Compare (Match Condition 7)
1546
//
1547
always @(dcr7 or dcpu_cycstb_i)
1548
        case (dcr7[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1549
                3'b000: match_cond7_stb = 1'b0;         //comparison disabled
1550
                3'b001: match_cond7_stb = 1'b1;         // insn fetch EA
1551
                default:match_cond7_stb = dcpu_cycstb_i; // any load/store
1552
        endcase
1553
 
1554
//
1555
// Match Condition 7
1556
//
1557
always @(match_cond7_stb or dcr7 or dvr7 or match_cond7_ct)
1558
        casex ({match_cond7_stb, dcr7[`OR1200_DU_DCR_CC]})
1559
                4'b0_xxx,
1560
                4'b1_000,
1561
                4'b1_111: match7 = 1'b0;
1562
                4'b1_001: match7 =
1563
                        ((match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]) ==
1564
                        (dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]));
1565
                4'b1_010: match7 =
1566
                        ((match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]) <
1567
                        (dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]));
1568
                4'b1_011: match7 =
1569
                        ((match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]) <=
1570
                        (dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]));
1571
                4'b1_100: match7 =
1572
                        ((match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]) >
1573
                        (dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]));
1574
                4'b1_101: match7 =
1575
                        ((match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]) >=
1576
                        (dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]));
1577
                4'b1_110: match7 =
1578
                        ((match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]) !=
1579
                        (dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]));
1580
        endcase
1581
 
1582
//
1583
// Watchpoint 7
1584
//
1585
always @(dmr1 or match7 or wp)
1586
        case (dmr1[`OR1200_DU_DMR1_CW7])
1587
                2'b00: wp[7] = match7;
1588
                2'b01: wp[7] = match7 & wp[6];
1589
                2'b10: wp[7] = match7 | wp[6];
1590
                2'b11: wp[7] = 1'b0;
1591
        endcase
1592
 
1593
//
1594
// Increment Watchpoint Counter 0
1595
//
1596
always @(wp or dmr2)
1597
        if (dmr2[`OR1200_DU_DMR2_WCE0])
1598
                incr_wpcntr0 = |(wp & ~dmr2[`OR1200_DU_DMR2_AWTC]);
1599
        else
1600
                incr_wpcntr0 = 1'b0;
1601
 
1602
//
1603
// Match Condition Watchpoint Counter 0
1604
//
1605
always @(dwcr0)
1606
        if (dwcr0[`OR1200_DU_DWCR_MATCH] == dwcr0[`OR1200_DU_DWCR_COUNT])
1607
                wpcntr0_match = 1'b1;
1608
        else
1609
                wpcntr0_match = 1'b0;
1610
 
1611
 
1612
//
1613
// Watchpoint 8
1614
//
1615
always @(dmr1 or wpcntr0_match or wp)
1616
        case (dmr1[`OR1200_DU_DMR1_CW8])
1617
                2'b00: wp[8] = wpcntr0_match;
1618
                2'b01: wp[8] = wpcntr0_match & wp[7];
1619
                2'b10: wp[8] = wpcntr0_match | wp[7];
1620
                2'b11: wp[8] = 1'b0;
1621
        endcase
1622
 
1623
 
1624
//
1625
// Increment Watchpoint Counter 1
1626
//
1627
always @(wp or dmr2)
1628
        if (dmr2[`OR1200_DU_DMR2_WCE1])
1629
                incr_wpcntr1 = |(wp & dmr2[`OR1200_DU_DMR2_AWTC]);
1630
        else
1631
                incr_wpcntr1 = 1'b0;
1632
 
1633
//
1634
// Match Condition Watchpoint Counter 1
1635
//
1636
always @(dwcr1)
1637
        if (dwcr1[`OR1200_DU_DWCR_MATCH] == dwcr1[`OR1200_DU_DWCR_COUNT])
1638
                wpcntr1_match = 1'b1;
1639
        else
1640
                wpcntr1_match = 1'b0;
1641
 
1642
//
1643
// Watchpoint 9
1644
//
1645
always @(dmr1 or wpcntr1_match or wp)
1646
        case (dmr1[`OR1200_DU_DMR1_CW9])
1647
                2'b00: wp[9] = wpcntr1_match;
1648
                2'b01: wp[9] = wpcntr1_match & wp[8];
1649
                2'b10: wp[9] = wpcntr1_match | wp[8];
1650
                2'b11: wp[9] = 1'b0;
1651
        endcase
1652
 
1653
//
1654
// Watchpoint 10
1655
//
1656
always @(dmr1 or dbg_ewt_i or wp)
1657
        case (dmr1[`OR1200_DU_DMR1_CW10])
1658
                2'b00: wp[10] = dbg_ewt_i;
1659
                2'b01: wp[10] = dbg_ewt_i & wp[9];
1660
                2'b10: wp[10] = dbg_ewt_i | wp[9];
1661
                2'b11: wp[10] = 1'b0;
1662
        endcase
1663
 
1664
`endif
1665
 
1666
//
1667
// Watchpoints can cause trap exception
1668
//
1669
`ifdef OR1200_DU_HWBKPTS
1670
assign du_hwbkpt = |(wp & dmr2[`OR1200_DU_DMR2_WGB]);
1671
`else
1672
assign du_hwbkpt = 1'b0;
1673
`endif
1674
 
1675
`ifdef OR1200_DU_TB_IMPLEMENTED
1676
//
1677
// Simple trace buffer
1678
// (right now hardcoded for Xilinx Virtex FPGAs)
1679
//
1680
// Stores last 256 instruction addresses, instruction
1681
// machine words and ALU results
1682
//
1683
 
1684
//
1685
// Trace buffer write enable
1686
//
1687
assign tb_enw = ~ex_freeze & ~((ex_insn[31:26] == `OR1200_OR32_NOP) & ex_insn[16]);
1688
 
1689
//
1690
// Trace buffer write address pointer
1691
//
1692
always @(posedge clk or posedge rst)
1693
        if (rst)
1694
                tb_wadr <= #1 8'h00;
1695
        else if (tb_enw)
1696
                tb_wadr <= #1 tb_wadr + 8'd1;
1697
 
1698
//
1699
// Free running counter (time stamp)
1700
//
1701
always @(posedge clk or posedge rst)
1702
        if (rst)
1703
                tb_timstmp <= #1 32'h00000000;
1704
        else if (!dbg_bp_r)
1705
                tb_timstmp <= #1 tb_timstmp + 32'd1;
1706
 
1707
//
1708
// Trace buffer RAMs
1709
//
1710
 
1711
or1200_dpram_256x32 tbia_ram(
1712
        .clk_a(clk),
1713
        .rst_a(rst),
1714
        .addr_a(spr_addr[7:0]),
1715
        .ce_a(1'b1),
1716
        .oe_a(1'b1),
1717
        .do_a(tbia_dat_o),
1718
 
1719
        .clk_b(clk),
1720
        .rst_b(rst),
1721
        .addr_b(tb_wadr),
1722
        .di_b(spr_dat_npc),
1723
        .ce_b(1'b1),
1724
        .we_b(tb_enw)
1725
 
1726
);
1727
 
1728
or1200_dpram_256x32 tbim_ram(
1729
        .clk_a(clk),
1730
        .rst_a(rst),
1731
        .addr_a(spr_addr[7:0]),
1732
        .ce_a(1'b1),
1733
        .oe_a(1'b1),
1734
        .do_a(tbim_dat_o),
1735
 
1736
        .clk_b(clk),
1737
        .rst_b(rst),
1738
        .addr_b(tb_wadr),
1739
        .di_b(ex_insn),
1740
        .ce_b(1'b1),
1741
        .we_b(tb_enw)
1742
);
1743
 
1744
or1200_dpram_256x32 tbar_ram(
1745
        .clk_a(clk),
1746
        .rst_a(rst),
1747
        .addr_a(spr_addr[7:0]),
1748
        .ce_a(1'b1),
1749
        .oe_a(1'b1),
1750
        .do_a(tbar_dat_o),
1751
 
1752
        .clk_b(clk),
1753
        .rst_b(rst),
1754
        .addr_b(tb_wadr),
1755
        .di_b(rf_dataw),
1756
        .ce_b(1'b1),
1757
        .we_b(tb_enw)
1758
);
1759
 
1760
or1200_dpram_256x32 tbts_ram(
1761
        .clk_a(clk),
1762
        .rst_a(rst),
1763
        .addr_a(spr_addr[7:0]),
1764
        .ce_a(1'b1),
1765
        .oe_a(1'b1),
1766
        .do_a(tbts_dat_o),
1767
 
1768
        .clk_b(clk),
1769
        .rst_b(rst),
1770
        .addr_b(tb_wadr),
1771
        .di_b(tb_timstmp),
1772
        .ce_b(1'b1),
1773
        .we_b(tb_enw)
1774
);
1775
 
1776
`else
1777
 
1778
assign tbia_dat_o = 32'h0000_0000;
1779
assign tbim_dat_o = 32'h0000_0000;
1780
assign tbar_dat_o = 32'h0000_0000;
1781
assign tbts_dat_o = 32'h0000_0000;
1782
 
1783
`endif  // OR1200_DU_TB_IMPLEMENTED
1784
 
1785
`else   // OR1200_DU_IMPLEMENTED
1786
 
1787
//
1788
// When DU is not implemented, drive all outputs as would when DU is disabled
1789
//
1790
assign dbg_bp_o = 1'b0;
1791
assign du_dsr = {`OR1200_DU_DSR_WIDTH{1'b0}};
1792
assign du_hwbkpt = 1'b0;
1793
 
1794
//
1795
// Read DU registers
1796
//
1797
`ifdef OR1200_DU_READREGS
1798
assign spr_dat_o = 32'h0000_0000;
1799
`ifdef OR1200_DU_UNUSED_ZERO
1800
`endif
1801
`endif
1802
 
1803
`endif
1804
 
1805
endmodule

powered by: WebSVN 2.1.0

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