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

Subversion Repositories or1200_hp

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

powered by: WebSVN 2.1.0

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