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

Subversion Repositories test_project

[/] [test_project/] [trunk/] [rtl/] [verilog/] [components/] [or1200r2/] [or1200_du.v] - Blame information for rev 45

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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