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

Subversion Repositories or1200_hp

[/] [or1200_hp/] [trunk/] [rtl/] [rtl_cm3/] [verilog/] [or1200_du.v] - Blame information for rev 2

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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