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

Subversion Repositories adv_debug_sys

[/] [adv_debug_sys/] [trunk/] [Patches/] [OR1200v1/] [or1200v1_hwbkpt.patch] - Blame information for rev 51

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

Line No. Rev Author Line
1 51 nyawn
--- ../../../Bennu/Hardware/or1200v1/rtl/verilog/or1200_defines.v       2010-08-25 23:25:38.000000000 -0500
2
+++ ./or1200_defines.v  2010-08-26 21:31:42.000000000 -0500
3
@@ -971,7 +971,7 @@
4
 // however already enough for use
5
 // with or32 gdb)
6
 //
7
-//`define OR1200_DU_HWBKPTS
8
+`define OR1200_DU_HWBKPTS
9
 
10
 // Number of DVR/DCR pairs if HW breakpoints enabled
11
 `define OR1200_DU_DVRDCR_PAIRS 8
12
@@ -1038,17 +1038,15 @@
13
 `define OR1200_DU_DMR1_CW7     15:14
14
 `define OR1200_DU_DMR1_CW8     17:16
15
 `define OR1200_DU_DMR1_CW9     19:18
16
-`define OR1200_DU_DMR1_CW10    21:20
17
+`define OR1200_DU_DMR1_RES     21:20
18
 `define OR1200_DU_DMR1_ST      22
19
 `define OR1200_DU_DMR1_BT      23
20
-`define OR1200_DU_DMR1_DXFW    24
21
-`define OR1200_DU_DMR1_ETE     25
22
 
23
 // DMR2 bits
24
 `define OR1200_DU_DMR2_WCE0    0
25
 `define OR1200_DU_DMR2_WCE1    1
26
-`define OR1200_DU_DMR2_AWTC    12:2
27
-`define OR1200_DU_DMR2_WGB     23:13
28
+`define OR1200_DU_DMR2_AWTC    11:2
29
+`define OR1200_DU_DMR2_WGB     21:12
30
 
31
 // DWCR bits
32
 `define OR1200_DU_DWCR_COUNT   15:0
33
--- /cygdrive/c/Projects/Bennu/Hardware/or1200v1/rtl/verilog/or1200_top.v       2010-08-25 23:25:40.000000000 -0500
34
+++ ./or1200_top.v      2010-06-12 16:59:02.000000000 -0500
35
@@ -43,7 +43,10 @@
36
 //
37
 // CVS Revision History
38
 //
39
-// $Log: or1200v1_hwbkpt.patch,v $
40
-// Revision 1.1  2010-08-27 02:43:07  Nathan
41
-// Moved patches for third-party software to a separate, dedicated directory structure.
42
-//
43
+// $Log: or1200v1_hwbkpt.patch,v $
44
+// Revision 1.1  2010-08-27 02:43:07  Nathan
45
+// Moved patches for third-party software to a separate, dedicated directory structure.
46
+//
47
+// Revision 1.13  2004/06/08 18:17:36  lampret
48
+// Non-functional changes. Coding style fixes.
49
+//
50
 // Revision 1.12  2004/04/05 08:29:57  lampret
51
 // Merged branch_qmem into main tree.
52
 //
53
@@ -933,6 +936,7 @@ or1200_du or1200_du(
54
        .dcpu_cycstb_i(dcpu_cycstb_cpu),
55
        .dcpu_we_i(dcpu_we_cpu),
56
        .dcpu_adr_i(dcpu_adr_cpu),
57
+       .dcpu_be_i(dcpu_sel_cpu),
58
        .dcpu_dat_lsu(dcpu_dat_cpu),
59
        .dcpu_dat_dc(dcpu_dat_qmem),
60
        .icpu_cycstb_i(icpu_cycstb_cpu),
61
--- /cygdrive/c/Projects/Bennu/Hardware/or1200v1/rtl/verilog/or1200_du.v        2010-08-25 23:25:38.000000000 -0500
62
+++ ./or1200_du.v       2010-08-26 21:28:32.000000000 -0500
63
@@ -124,8 +124,8 @@
64
 module or1200_du(
65
        // RISC Internal Interface
66
        clk, rst,
67
-       dcpu_cycstb_i, dcpu_we_i, dcpu_adr_i, dcpu_dat_lsu,
68
-       dcpu_dat_dc, icpu_cycstb_i,
69
+       dcpu_cycstb_i, dcpu_we_i, dcpu_adr_i, dcpu_be_i,
70
+       dcpu_dat_lsu, dcpu_dat_dc, icpu_cycstb_i,
71
        ex_freeze, branch_op, ex_insn, id_pc,
72
        spr_dat_npc, rf_dataw,
73
        du_dsr, du_stall, du_addr, du_dat_i, du_dat_o,
74
@@ -152,6 +152,7 @@ input                               rst;            // Reset
75
 input                          dcpu_cycstb_i;  // LSU status
76
 input                          dcpu_we_i;      // LSU status
77
 input  [31:0]                  dcpu_adr_i;     // LSU addr
78
+input   [3:0]       dcpu_be_i;
79
 input  [31:0]                  dcpu_dat_lsu;   // LSU store data
80
 input  [31:0]                  dcpu_dat_dc;    // LSU load data
81
 input  [`OR1200_FETCHOP_WIDTH-1:0]     icpu_cycstb_i;  // IFETCH unit status
82
@@ -192,6 +193,7 @@ input       [dw-1:0]        dbg_dat_i;      // External Da
83
 output [dw-1:0]        dbg_dat_o;      // External Data Output
84
 output                 dbg_ack_o;      // External Data Acknowledge (not WB compatible)
85
 
86
+reg    [9:0]           wp;
87
 
88
 //
89
 // Some connections go directly from the CPU through DU to Debug I/F
90
@@ -216,7 +218,7 @@ assign dbg_is_o = 2'b00;
91
 assign dbg_lss_o = dcpu_cycstb_i ? {dcpu_we_i, 3'b000} : 4'b0000;
92
 assign dbg_is_o = {1'b0, icpu_cycstb_i};
93
 `endif
94
-assign dbg_wp_o = 11'b000_0000_0000;
95
+assign dbg_wp_o = {1'b0, wp};  //11'b000_0000_0000;
96
 assign dbg_dat_o = du_dat_i;
97
 
98
 //
99
@@ -253,9 +255,9 @@ wire        [24:0]                  dmr1;           // DMR1 not impleme
100
 // Debug Mode Register 2
101
 //
102
 `ifdef OR1200_DU_DMR2
103
-reg    [23:0]                  dmr2;           // DMR2 implemented
104
+reg    [21:0]                  dmr2;           // DMR2 implemented
105
 `else
106
-wire   [23:0]                  dmr2;           // DMR2 not implemented
107
+wire   [21:0]                  dmr2;           // DMR2 not implemented
108
 `endif
109
 
110
 //
111
@@ -473,6 +475,14 @@ reg        [31:0]                  match_cond4_ct;
112
 reg    [31:0]                  match_cond5_ct;
113
 reg    [31:0]                  match_cond6_ct;
114
 reg    [31:0]                  match_cond7_ct;
115
+reg    [31:0]                  match_cond0_tmp;
116
+reg    [31:0]                  match_cond1_tmp;
117
+reg    [31:0]                  match_cond2_tmp;
118
+reg    [31:0]                  match_cond3_tmp;
119
+reg    [31:0]                  match_cond4_tmp;
120
+reg    [31:0]                  match_cond5_tmp;
121
+reg    [31:0]                  match_cond6_tmp;
122
+reg    [31:0]                  match_cond7_tmp;
123
 reg                            match_cond0_stb;
124
 reg                            match_cond1_stb;
125
 reg                            match_cond2_stb;
126
@@ -491,9 +501,16 @@ reg                                match6;
127
 reg                            match7;
128
 reg                            wpcntr0_match;
129
 reg                            wpcntr1_match;
130
-reg                            incr_wpcntr0;
131
-reg                            incr_wpcntr1;
132
-reg    [10:0]                  wp;
133
+reg             wpcntr0_armed;
134
+reg             wpcntr0_oneshot;
135
+reg             wpcntr1_armed;
136
+reg             wpcntr1_oneshot;
137
+wire                   incr_wpcntr0;
138
+reg             incr_wpcntr0_latched;
139
+wire            incr_wpcntr1;
140
+reg             incr_wpcntr1_latched;
141
+reg             du_hwbkpt_latched;
142
+reg [9:0]       wp_latched;
143
 `endif
144
 wire                           du_hwbkpt;
145
 `ifdef OR1200_DU_READREGS
146
@@ -670,11 +687,11 @@ assign dmr1 = 25'h000_0000;
147
 `ifdef OR1200_DU_DMR2
148
 always @(posedge clk or posedge rst)
149
        if (rst)
150
-               dmr2 <= 24'h00_0000;
151
+               dmr2 <= 22'h00_0000;
152
        else if (dmr2_sel && spr_write)
153
-               dmr2 <= #1 spr_dat_i[23:0];
154
+               dmr2 <= #1 spr_dat_i[21:0];
155
 `else
156
-assign dmr2 = 24'h00_0000;
157
+assign dmr2 = 22'h00_0000;
158
 `endif
159
 
160
 //
161
@@ -815,9 +832,9 @@ assign dvr7 = 32'h0000_0000;
162
 `ifdef OR1200_DU_DCR0
163
 always @(posedge clk or posedge rst)
164
        if (rst)
165
-               dcr0 <= 8'h00;
166
+               dcr0 <= 8'h01;
167
        else if (dcr0_sel && spr_write)
168
-               dcr0 <= #1 spr_dat_i[7:0];
169
+               dcr0 <= #1 {spr_dat_i[7:1], 1'b1};
170
 `else
171
 assign dcr0 = 8'h00;
172
 `endif
173
@@ -828,9 +845,9 @@ assign dcr0 = 8'h00;
174
 `ifdef OR1200_DU_DCR1
175
 always @(posedge clk or posedge rst)
176
        if (rst)
177
-               dcr1 <= 8'h00;
178
+               dcr1 <= 8'h01;
179
        else if (dcr1_sel && spr_write)
180
-               dcr1 <= #1 spr_dat_i[7:0];
181
+               dcr1 <= #1 {spr_dat_i[7:1], 1'b1};
182
 `else
183
 assign dcr1 = 8'h00;
184
 `endif
185
@@ -841,9 +858,9 @@ assign dcr1 = 8'h00;
186
 `ifdef OR1200_DU_DCR2
187
 always @(posedge clk or posedge rst)
188
        if (rst)
189
-               dcr2 <= 8'h00;
190
+               dcr2 <= 8'h01;
191
        else if (dcr2_sel && spr_write)
192
-               dcr2 <= #1 spr_dat_i[7:0];
193
+               dcr2 <= #1 {spr_dat_i[7:1], 1'b1};
194
 `else
195
 assign dcr2 = 8'h00;
196
 `endif
197
@@ -854,9 +871,9 @@ assign dcr2 = 8'h00;
198
 `ifdef OR1200_DU_DCR3
199
 always @(posedge clk or posedge rst)
200
        if (rst)
201
-               dcr3 <= 8'h00;
202
+               dcr3 <= 8'h01;
203
        else if (dcr3_sel && spr_write)
204
-               dcr3 <= #1 spr_dat_i[7:0];
205
+               dcr3 <= #1 {spr_dat_i[7:1], 1'b1};
206
 `else
207
 assign dcr3 = 8'h00;
208
 `endif
209
@@ -867,9 +884,9 @@ assign dcr3 = 8'h00;
210
 `ifdef OR1200_DU_DCR4
211
 always @(posedge clk or posedge rst)
212
        if (rst)
213
-               dcr4 <= 8'h00;
214
+               dcr4 <= 8'h01;
215
        else if (dcr4_sel && spr_write)
216
-               dcr4 <= #1 spr_dat_i[7:0];
217
+               dcr4 <= #1 {spr_dat_i[7:1], 1'b1};
218
 `else
219
 assign dcr4 = 8'h00;
220
 `endif
221
@@ -880,9 +897,9 @@ assign dcr4 = 8'h00;
222
 `ifdef OR1200_DU_DCR5
223
 always @(posedge clk or posedge rst)
224
        if (rst)
225
-               dcr5 <= 8'h00;
226
+               dcr5 <= 8'h01;
227
        else if (dcr5_sel && spr_write)
228
-               dcr5 <= #1 spr_dat_i[7:0];
229
+               dcr5 <= #1 {spr_dat_i[7:1], 1'b1};
230
 `else
231
 assign dcr5 = 8'h00;
232
 `endif
233
@@ -893,9 +910,9 @@ assign dcr5 = 8'h00;
234
 `ifdef OR1200_DU_DCR6
235
 always @(posedge clk or posedge rst)
236
        if (rst)
237
-               dcr6 <= 8'h00;
238
+               dcr6 <= 8'h01;
239
        else if (dcr6_sel && spr_write)
240
-               dcr6 <= #1 spr_dat_i[7:0];
241
+               dcr6 <= #1 {spr_dat_i[7:1], 1'b1};
242
 `else
243
 assign dcr6 = 8'h00;
244
 `endif
245
@@ -906,9 +923,9 @@ assign dcr6 = 8'h00;
246
 `ifdef OR1200_DU_DCR7
247
 always @(posedge clk or posedge rst)
248
        if (rst)
249
-               dcr7 <= 8'h00;
250
+               dcr7 <= 8'h01;
251
        else if (dcr7_sel && spr_write)
252
-               dcr7 <= #1 spr_dat_i[7:0];
253
+               dcr7 <= #1 {spr_dat_i[7:1], 1'b1};
254
 `else
255
 assign dcr7 = 8'h00;
256
 `endif
257
@@ -952,7 +969,7 @@ always @(spr_addr or dsr or drr or dmr1
258
        or dvr5 or dvr6 or dvr7
259
        or dcr0 or dcr1 or dcr2 or dcr3 or dcr4
260
        or dcr5 or dcr6 or dcr7
261
-       or dwcr0 or dwcr1
262
+       or dwcr0 or dwcr1 or wp_latched
263
 `ifdef OR1200_DU_TB_IMPLEMENTED
264
        or tb_wadr or tbia_dat_o or tbim_dat_o
265
        or tbar_dat_o or tbts_dat_o
266
@@ -1029,7 +1046,7 @@ always @(spr_addr or dsr or drr or dmr1
267
 `endif
268
 `ifdef OR1200_DU_DMR2
269
                `OR1200_DU_DMR2:
270
-                       spr_dat_o = {8'h00, dmr2};
271
+                       spr_dat_o = {wp_latched, dmr2};
272
 `endif
273
 `ifdef OR1200_DU_DWCR0
274
                `OR1200_DU_DWCR0:
275
@@ -1077,23 +1094,50 @@ assign du_dsr = dsr;
276
 always @(dcr0 or id_pc or dcpu_adr_i or dcpu_dat_dc
277
        or dcpu_dat_lsu or dcpu_we_i)
278
        case (dcr0[`OR1200_DU_DCR_CT])          // synopsys parallel_case
279
-               3'b001: match_cond0_ct = id_pc;         // insn fetch EA
280
-               3'b010: match_cond0_ct = dcpu_adr_i;    // load EA
281
-               3'b011: match_cond0_ct = dcpu_adr_i;    // store EA
282
-               3'b100: match_cond0_ct = dcpu_dat_dc;   // load data
283
-               3'b101: match_cond0_ct = dcpu_dat_lsu;  // store data
284
-               3'b110: match_cond0_ct = dcpu_adr_i;    // load/store EA
285
-               default:match_cond0_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
286
-       endcase
287
+               3'b001: match_cond0_tmp = id_pc;                // insn fetch EA
288
+               3'b010: match_cond0_tmp = dcpu_adr_i;   // load EA
289
+               3'b011: match_cond0_tmp = dcpu_adr_i;   // store EA
290
+               3'b100: match_cond0_tmp = dcpu_dat_dc;  // load data
291
+               3'b101: match_cond0_tmp = dcpu_dat_lsu; // store data
292
+               3'b110: match_cond0_tmp = dcpu_adr_i;   // load/store EA
293
+               default:match_cond0_tmp = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
294
+       endcase
295
+
296
+// Transparently handle 8/16/32 bit bus accesses (Match Condition 0)
297
+// For addresses, leave unchanged
298
+// for 32-bit data, leave unchanged
299
+// for 8- or 16-bit data, move the active byte lane(s) to the LSB position
300
+// This will allow the value to be compared to the LSB(s) of the DVR
301
+always @(match_cond0_tmp or dcr0 or dcpu_be_i)
302
+  case (dcr0[`OR1200_DU_DCR_CT])               // synopsys parallel_case
303
+    3'b100,
304
+    3'b101,
305
+    3'b111:  begin // We're comparing to data
306
+      case (dcpu_be_i)
307
+        4'b1000: match_cond0_ct = { {24{dcr0[`OR1200_DU_DCR_SC] & match_cond0_tmp[31]}}, match_cond0_tmp[31:24]};
308
+        4'b0100: match_cond0_ct = { {24{dcr0[`OR1200_DU_DCR_SC] & match_cond0_tmp[23]}}, match_cond0_tmp[23:16]};
309
+        4'b0010: match_cond0_ct = { {24{dcr0[`OR1200_DU_DCR_SC] & match_cond0_tmp[15]}}, match_cond0_tmp[15:8]};
310
+        4'b0001: match_cond0_ct = { {24{dcr0[`OR1200_DU_DCR_SC] & match_cond0_tmp[7] }}, match_cond0_tmp[7:0]};
311
+        4'b1100: match_cond0_ct = { {16{dcr0[`OR1200_DU_DCR_SC] & match_cond0_tmp[31]}}, match_cond0_tmp[31:16]};
312
+        4'b0011: match_cond0_ct = { {16{dcr0[`OR1200_DU_DCR_SC] & match_cond0_tmp[15]}}, match_cond0_tmp[15:0]};
313
+        default: match_cond0_ct = match_cond0_tmp;
314
+      endcase
315
+    end
316
+    default: match_cond0_ct = match_cond0_tmp;  // We're comparing an address
317
+  endcase
318
 
319
 //
320
 // When To Compare (Match Condition 0)
321
 //
322
-always @(dcr0 or dcpu_cycstb_i)
323
-       case (dcr0[`OR1200_DU_DCR_CT])          // synopsys parallel_case
324
+always @(dcr0 or dcpu_cycstb_i or dcpu_we_i)
325
+       case (dcr0[`OR1200_DU_DCR_CT])          // synopsys parallel_case
326
                3'b000: match_cond0_stb = 1'b0;         //comparison disabled
327
                3'b001: match_cond0_stb = 1'b1;         // insn fetch EA
328
-               default:match_cond0_stb = dcpu_cycstb_i; // any load/store
329
+               3'b010: match_cond0_stb = (dcpu_cycstb_i & (~dcpu_we_i));  // data load addr
330
+               3'b011: match_cond0_stb = (dcpu_cycstb_i & dcpu_we_i);     // data store addr
331
+               3'b100: match_cond0_stb = (dcpu_cycstb_i & (~dcpu_we_i));  // data load val
332
+               3'b101: match_cond0_stb = (dcpu_cycstb_i & dcpu_we_i);     // data store val
333
+               default: match_cond0_stb = dcpu_cycstb_i; // any load/store
334
        endcase
335
 
336
 //
337
@@ -1105,33 +1149,32 @@ always @(match_cond0_stb or dcr0 or dvr0
338
                4'b1_000,
339
                4'b1_111: match0 = 1'b0;
340
                4'b1_001: match0 =
341
-                       ((match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]) ==
342
-                       (dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]));
343
+                       (match_cond0_ct == dvr0);
344
                4'b1_010: match0 =
345
-                       ((match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]) <
346
-                       (dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]));
347
+                       ({(match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]), match_cond0_ct[30:0]} <
348
+                        {(dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]), dvr0[30:0]} );
349
                4'b1_011: match0 =
350
-                       ((match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]) <=
351
-                       (dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]));
352
+                       ({(match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]), match_cond0_ct[30:0]} <=
353
+                        {(dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]), dvr0[30:0]} );
354
                4'b1_100: match0 =
355
-                       ((match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]) >
356
-                       (dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]));
357
+                       ({(match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]), match_cond0_ct[30:0]} >
358
+                        {(dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]), dvr0[30:0]} );
359
                4'b1_101: match0 =
360
-                       ((match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]) >=
361
-                       (dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]));
362
+                       ({(match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]), match_cond0_ct[30:0]} >=
363
+                        {(dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]), dvr0[30:0]} );
364
                4'b1_110: match0 =
365
-                       ((match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]) !=
366
-                       (dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]));
367
+                       (match_cond0_ct != dvr0);
368
        endcase
369
 
370
+
371
 //
372
 // Watchpoint 0
373
 //
374
-always @(dmr1 or match0)
375
+always @(dmr1 or match0 or dbg_ewt_i)
376
        case (dmr1[`OR1200_DU_DMR1_CW0])
377
                2'b00: wp[0] = match0;
378
-               2'b01: wp[0] = match0;
379
-               2'b10: wp[0] = match0;
380
+               2'b01: wp[0] = match0 &  dbg_ewt_i;
381
+               2'b10: wp[0] = match0 |  dbg_ewt_i;
382
                2'b11: wp[0] = 1'b0;
383
        endcase
384
 
385
@@ -1141,23 +1184,50 @@ always @(dmr1 or match0)
386
 always @(dcr1 or id_pc or dcpu_adr_i or dcpu_dat_dc
387
        or dcpu_dat_lsu or dcpu_we_i)
388
        case (dcr1[`OR1200_DU_DCR_CT])          // synopsys parallel_case
389
-               3'b001: match_cond1_ct = id_pc;         // insn fetch EA
390
-               3'b010: match_cond1_ct = dcpu_adr_i;    // load EA
391
-               3'b011: match_cond1_ct = dcpu_adr_i;    // store EA
392
-               3'b100: match_cond1_ct = dcpu_dat_dc;   // load data
393
-               3'b101: match_cond1_ct = dcpu_dat_lsu;  // store data
394
-               3'b110: match_cond1_ct = dcpu_adr_i;    // load/store EA
395
-               default:match_cond1_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
396
-       endcase
397
+               3'b001: match_cond1_tmp = id_pc;                // insn fetch EA
398
+               3'b010: match_cond1_tmp = dcpu_adr_i;   // load EA
399
+               3'b011: match_cond1_tmp = dcpu_adr_i;   // store EA
400
+               3'b100: match_cond1_tmp = dcpu_dat_dc;  // load data
401
+               3'b101: match_cond1_tmp = dcpu_dat_lsu; // store data
402
+               3'b110: match_cond1_tmp = dcpu_adr_i;   // load/store EA
403
+               default:match_cond1_tmp = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
404
+       endcase
405
+
406
+// Transparently handle 8/16/32 bit bus accesses (Match Condition 1)
407
+// For addresses, leave unchanged
408
+// for 32-bit data, leave unchanged
409
+// for 8- or 16-bit data, move the active byte lane(s) to the LSB position
410
+// This will allow the value to be compared to the LSB(s) of the DVR
411
+always @(match_cond1_tmp or dcr1 or dcpu_be_i)
412
+  case (dcr1[`OR1200_DU_DCR_CT])               // synopsys parallel_case
413
+    3'b100,
414
+    3'b101,
415
+    3'b111:  begin // We're comparing to data
416
+      case (dcpu_be_i)
417
+        4'b1000: match_cond1_ct = { {24{dcr1[`OR1200_DU_DCR_SC] & match_cond1_tmp[31]}}, match_cond1_tmp[31:24]};
418
+        4'b0100: match_cond1_ct = { {24{dcr1[`OR1200_DU_DCR_SC] & match_cond1_tmp[23]}}, match_cond1_tmp[23:16]};
419
+        4'b0010: match_cond1_ct = { {24{dcr1[`OR1200_DU_DCR_SC] & match_cond1_tmp[15]}}, match_cond1_tmp[15:8]};
420
+        4'b0001: match_cond1_ct = { {24{dcr1[`OR1200_DU_DCR_SC] & match_cond1_tmp[7] }}, match_cond1_tmp[7:0]};
421
+        4'b1100: match_cond1_ct = { {16{dcr1[`OR1200_DU_DCR_SC] & match_cond1_tmp[31]}}, match_cond1_tmp[31:16]};
422
+        4'b0011: match_cond1_ct = { {16{dcr1[`OR1200_DU_DCR_SC] & match_cond1_tmp[15]}}, match_cond1_tmp[15:0]};
423
+        default: match_cond1_ct = match_cond1_tmp;
424
+      endcase
425
+    end
426
+    default: match_cond1_ct = match_cond1_tmp;  // We're comparing an address
427
+  endcase
428
 
429
 //
430
 // When To Compare (Match Condition 1)
431
 //
432
-always @(dcr1 or dcpu_cycstb_i)
433
-       case (dcr1[`OR1200_DU_DCR_CT])          // synopsys parallel_case
434
+always @(dcr1 or dcpu_cycstb_i or dcpu_we_i)
435
+       case (dcr1[`OR1200_DU_DCR_CT])          // synopsys parallel_case
436
                3'b000: match_cond1_stb = 1'b0;         //comparison disabled
437
                3'b001: match_cond1_stb = 1'b1;         // insn fetch EA
438
-               default:match_cond1_stb = dcpu_cycstb_i; // any load/store
439
+               3'b010: match_cond1_stb = (dcpu_cycstb_i & (~dcpu_we_i));  // data load addr
440
+               3'b011: match_cond1_stb = (dcpu_cycstb_i & dcpu_we_i);     // data store addr
441
+               3'b100: match_cond1_stb = (dcpu_cycstb_i & (~dcpu_we_i));  // data load val
442
+               3'b101: match_cond1_stb = (dcpu_cycstb_i & dcpu_we_i);     // data store val
443
+               default: match_cond1_stb = dcpu_cycstb_i; // any load/store
444
        endcase
445
 
446
 //
447
@@ -1169,23 +1239,21 @@ always @(match_cond1_stb or dcr1 or dvr1
448
                4'b1_000,
449
                4'b1_111: match1 = 1'b0;
450
                4'b1_001: match1 =
451
-                       ((match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]) ==
452
-                       (dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]));
453
+                       (match_cond1_ct == dvr1);
454
                4'b1_010: match1 =
455
-                       ((match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]) <
456
-                       (dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]));
457
+                       ({(match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]), match_cond1_ct[30:0]} <
458
+                        {(dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]), dvr1[30:0]} );
459
                4'b1_011: match1 =
460
-                       ((match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]) <=
461
-                       (dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]));
462
+                       ({(match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]), match_cond1_ct[30:0]} <=
463
+                        {(dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]), dvr1[30:0]} );
464
                4'b1_100: match1 =
465
-                       ((match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]) >
466
-                       (dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]));
467
+                       ({(match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]), match_cond1_ct[30:0]} >
468
+                        {(dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]), dvr1[30:0]} );
469
                4'b1_101: match1 =
470
-                       ((match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]) >=
471
-                       (dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]));
472
+                       ({(match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]), match_cond1_ct[30:0]} >=
473
+                        {(dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]), dvr1[30:0]} );
474
                4'b1_110: match1 =
475
-                       ((match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]) !=
476
-                       (dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]));
477
+                       (match_cond1_ct != dvr1);
478
        endcase
479
 
480
 //
481
@@ -1199,29 +1267,57 @@ always @(dmr1 or match1 or wp)
482
                2'b11: wp[1] = 1'b0;
483
        endcase
484
 
485
+
486
 //
487
 // Compare To What (Match Condition 2)
488
 //
489
 always @(dcr2 or id_pc or dcpu_adr_i or dcpu_dat_dc
490
        or dcpu_dat_lsu or dcpu_we_i)
491
        case (dcr2[`OR1200_DU_DCR_CT])          // synopsys parallel_case
492
-               3'b001: match_cond2_ct = id_pc;         // insn fetch EA
493
-               3'b010: match_cond2_ct = dcpu_adr_i;    // load EA
494
-               3'b011: match_cond2_ct = dcpu_adr_i;    // store EA
495
-               3'b100: match_cond2_ct = dcpu_dat_dc;   // load data
496
-               3'b101: match_cond2_ct = dcpu_dat_lsu;  // store data
497
-               3'b110: match_cond2_ct = dcpu_adr_i;    // load/store EA
498
-               default:match_cond2_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
499
-       endcase
500
+               3'b001: match_cond2_tmp = id_pc;                // insn fetch EA
501
+               3'b010: match_cond2_tmp = dcpu_adr_i;   // load EA
502
+               3'b011: match_cond2_tmp = dcpu_adr_i;   // store EA
503
+               3'b100: match_cond2_tmp = dcpu_dat_dc;  // load data
504
+               3'b101: match_cond2_tmp = dcpu_dat_lsu; // store data
505
+               3'b110: match_cond2_tmp = dcpu_adr_i;   // load/store EA
506
+               default:match_cond2_tmp = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
507
+       endcase
508
+
509
+// Transparently handle 8/16/32 bit bus accesses (Match Condition 2)
510
+// For addresses, leave unchanged
511
+// for 32-bit data, leave unchanged
512
+// for 8- or 16-bit data, move the active byte lane(s) to the LSB position
513
+// This will allow the value to be compared to the LSB(s) of the DVR
514
+always @(match_cond2_tmp or dcr2 or dcpu_be_i)
515
+  case (dcr2[`OR1200_DU_DCR_CT])               // synopsys parallel_case
516
+    3'b100,
517
+    3'b101,
518
+    3'b111:  begin // We're comparing to data
519
+      case (dcpu_be_i)
520
+        4'b1000: match_cond2_ct = { {24{dcr2[`OR1200_DU_DCR_SC] & match_cond2_tmp[31]}}, match_cond2_tmp[31:24]};
521
+        4'b0100: match_cond2_ct = { {24{dcr2[`OR1200_DU_DCR_SC] & match_cond2_tmp[23]}}, match_cond2_tmp[23:16]};
522
+        4'b0010: match_cond2_ct = { {24{dcr2[`OR1200_DU_DCR_SC] & match_cond2_tmp[15]}}, match_cond2_tmp[15:8]};
523
+        4'b0001: match_cond2_ct = { {24{dcr2[`OR1200_DU_DCR_SC] & match_cond2_tmp[7] }}, match_cond2_tmp[7:0]};
524
+        4'b1100: match_cond2_ct = { {16{dcr2[`OR1200_DU_DCR_SC] & match_cond2_tmp[31]}}, match_cond2_tmp[31:16]};
525
+        4'b0011: match_cond2_ct = { {16{dcr2[`OR1200_DU_DCR_SC] & match_cond2_tmp[15]}}, match_cond2_tmp[15:0]};
526
+        default: match_cond2_ct = match_cond2_tmp;
527
+      endcase
528
+    end
529
+    default: match_cond2_ct = match_cond2_tmp;  // We're comparing an address
530
+  endcase
531
 
532
 //
533
 // When To Compare (Match Condition 2)
534
 //
535
-always @(dcr2 or dcpu_cycstb_i)
536
-       case (dcr2[`OR1200_DU_DCR_CT])          // synopsys parallel_case
537
+always @(dcr2 or dcpu_cycstb_i or dcpu_we_i)
538
+       case (dcr2[`OR1200_DU_DCR_CT])          // synopsys parallel_case
539
                3'b000: match_cond2_stb = 1'b0;         //comparison disabled
540
                3'b001: match_cond2_stb = 1'b1;         // insn fetch EA
541
-               default:match_cond2_stb = dcpu_cycstb_i; // any load/store
542
+               3'b010: match_cond2_stb = (dcpu_cycstb_i & (~dcpu_we_i));  // data load addr
543
+               3'b011: match_cond2_stb = (dcpu_cycstb_i & dcpu_we_i);     // data store addr
544
+               3'b100: match_cond2_stb = (dcpu_cycstb_i & (~dcpu_we_i));  // data load val
545
+               3'b101: match_cond2_stb = (dcpu_cycstb_i & dcpu_we_i);     // data store val
546
+               default: match_cond2_stb = dcpu_cycstb_i; // any load/store
547
        endcase
548
 
549
 //
550
@@ -1233,23 +1329,21 @@ always @(match_cond2_stb or dcr2 or dvr2
551
                4'b1_000,
552
                4'b1_111: match2 = 1'b0;
553
                4'b1_001: match2 =
554
-                       ((match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]) ==
555
-                       (dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]));
556
+                       (match_cond2_ct == dvr2);
557
                4'b1_010: match2 =
558
-                       ((match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]) <
559
-                       (dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]));
560
+                       ({(match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]), match_cond2_ct[30:0]} <
561
+                        {(dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]), dvr2[30:0]} );
562
                4'b1_011: match2 =
563
-                       ((match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]) <=
564
-                       (dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]));
565
+                       ({(match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]), match_cond2_ct[30:0]} <=
566
+                        {(dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]), dvr2[30:0]} );
567
                4'b1_100: match2 =
568
-                       ((match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]) >
569
-                       (dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]));
570
+                       ({(match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]), match_cond2_ct[30:0]} >
571
+                        {(dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]), dvr2[30:0]} );
572
                4'b1_101: match2 =
573
-                       ((match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]) >=
574
-                       (dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]));
575
+                       ({(match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]), match_cond2_ct[30:0]} >=
576
+                        {(dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]), dvr2[30:0]} );
577
                4'b1_110: match2 =
578
-                       ((match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]) !=
579
-                       (dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]));
580
+                       (match_cond2_ct != dvr2);
581
        endcase
582
 
583
 //
584
@@ -1263,29 +1357,57 @@ always @(dmr1 or match2 or wp)
585
                2'b11: wp[2] = 1'b0;
586
        endcase
587
 
588
+
589
 //
590
 // Compare To What (Match Condition 3)
591
 //
592
 always @(dcr3 or id_pc or dcpu_adr_i or dcpu_dat_dc
593
        or dcpu_dat_lsu or dcpu_we_i)
594
        case (dcr3[`OR1200_DU_DCR_CT])          // synopsys parallel_case
595
-               3'b001: match_cond3_ct = id_pc;         // insn fetch EA
596
-               3'b010: match_cond3_ct = dcpu_adr_i;    // load EA
597
-               3'b011: match_cond3_ct = dcpu_adr_i;    // store EA
598
-               3'b100: match_cond3_ct = dcpu_dat_dc;   // load data
599
-               3'b101: match_cond3_ct = dcpu_dat_lsu;  // store data
600
-               3'b110: match_cond3_ct = dcpu_adr_i;    // load/store EA
601
-               default:match_cond3_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
602
-       endcase
603
+               3'b001: match_cond3_tmp = id_pc;                // insn fetch EA
604
+               3'b010: match_cond3_tmp = dcpu_adr_i;   // load EA
605
+               3'b011: match_cond3_tmp = dcpu_adr_i;   // store EA
606
+               3'b100: match_cond3_tmp = dcpu_dat_dc;  // load data
607
+               3'b101: match_cond3_tmp = dcpu_dat_lsu; // store data
608
+               3'b110: match_cond3_tmp = dcpu_adr_i;   // load/store EA
609
+               default:match_cond3_tmp = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
610
+       endcase
611
+
612
+// Transparently handle 8/16/32 bit bus accesses (Match Condition 3)
613
+// For addresses, leave unchanged
614
+// for 32-bit data, leave unchanged
615
+// for 8- or 16-bit data, move the active byte lane(s) to the LSB position
616
+// This will allow the value to be compared to the LSB(s) of the DVR
617
+always @(match_cond3_tmp or dcr3 or dcpu_be_i)
618
+  case (dcr3[`OR1200_DU_DCR_CT])               // synopsys parallel_case
619
+    3'b100,
620
+    3'b101,
621
+    3'b111:  begin // We're comparing to data
622
+      case (dcpu_be_i)
623
+        4'b1000: match_cond3_ct = { {24{dcr3[`OR1200_DU_DCR_SC] & match_cond3_tmp[31]}}, match_cond3_tmp[31:24]};
624
+        4'b0100: match_cond3_ct = { {24{dcr3[`OR1200_DU_DCR_SC] & match_cond3_tmp[23]}}, match_cond3_tmp[23:16]};
625
+        4'b0010: match_cond3_ct = { {24{dcr3[`OR1200_DU_DCR_SC] & match_cond3_tmp[15]}}, match_cond3_tmp[15:8]};
626
+        4'b0001: match_cond3_ct = { {24{dcr3[`OR1200_DU_DCR_SC] & match_cond3_tmp[7] }}, match_cond3_tmp[7:0]};
627
+        4'b1100: match_cond3_ct = { {16{dcr3[`OR1200_DU_DCR_SC] & match_cond3_tmp[31]}}, match_cond3_tmp[31:16]};
628
+        4'b0011: match_cond3_ct = { {16{dcr3[`OR1200_DU_DCR_SC] & match_cond3_tmp[15]}}, match_cond3_tmp[15:0]};
629
+        default: match_cond3_ct = match_cond3_tmp;
630
+      endcase
631
+    end
632
+    default: match_cond3_ct = match_cond3_tmp;  // We're comparing an address
633
+  endcase
634
 
635
 //
636
 // When To Compare (Match Condition 3)
637
 //
638
-always @(dcr3 or dcpu_cycstb_i)
639
-       case (dcr3[`OR1200_DU_DCR_CT])          // synopsys parallel_case
640
+always @(dcr3 or dcpu_cycstb_i or dcpu_we_i)
641
+       case (dcr3[`OR1200_DU_DCR_CT])          // synopsys parallel_case
642
                3'b000: match_cond3_stb = 1'b0;         //comparison disabled
643
                3'b001: match_cond3_stb = 1'b1;         // insn fetch EA
644
-               default:match_cond3_stb = dcpu_cycstb_i; // any load/store
645
+               3'b010: match_cond3_stb = (dcpu_cycstb_i & (~dcpu_we_i));  // data load addr
646
+               3'b011: match_cond3_stb = (dcpu_cycstb_i & dcpu_we_i);     // data store addr
647
+               3'b100: match_cond3_stb = (dcpu_cycstb_i & (~dcpu_we_i));  // data load val
648
+               3'b101: match_cond3_stb = (dcpu_cycstb_i & dcpu_we_i);     // data store val
649
+               default: match_cond3_stb = dcpu_cycstb_i; // any load/store
650
        endcase
651
 
652
 //
653
@@ -1297,23 +1419,21 @@ always @(match_cond3_stb or dcr3 or dvr3
654
                4'b1_000,
655
                4'b1_111: match3 = 1'b0;
656
                4'b1_001: match3 =
657
-                       ((match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]) ==
658
-                       (dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]));
659
+                       (match_cond3_ct == dvr3);
660
                4'b1_010: match3 =
661
-                       ((match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]) <
662
-                       (dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]));
663
+                       ({(match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]), match_cond3_ct[30:0]} <
664
+                        {(dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]), dvr3[30:0]} );
665
                4'b1_011: match3 =
666
-                       ((match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]) <=
667
-                       (dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]));
668
+                       ({(match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]), match_cond3_ct[30:0]} <=
669
+                        {(dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]), dvr3[30:0]} );
670
                4'b1_100: match3 =
671
-                       ((match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]) >
672
-                       (dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]));
673
+                       ({(match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]), match_cond3_ct[30:0]} >
674
+                        {(dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]), dvr3[30:0]} );
675
                4'b1_101: match3 =
676
-                       ((match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]) >=
677
-                       (dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]));
678
+                       ({(match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]), match_cond3_ct[30:0]} >=
679
+                        {(dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]), dvr3[30:0]} );
680
                4'b1_110: match3 =
681
-                       ((match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]) !=
682
-                       (dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]));
683
+                       (match_cond3_ct != dvr3);
684
        endcase
685
 
686
 //
687
@@ -1327,29 +1447,57 @@ always @(dmr1 or match3 or wp)
688
                2'b11: wp[3] = 1'b0;
689
        endcase
690
 
691
+
692
 //
693
 // Compare To What (Match Condition 4)
694
 //
695
 always @(dcr4 or id_pc or dcpu_adr_i or dcpu_dat_dc
696
        or dcpu_dat_lsu or dcpu_we_i)
697
        case (dcr4[`OR1200_DU_DCR_CT])          // synopsys parallel_case
698
-               3'b001: match_cond4_ct = id_pc;         // insn fetch EA
699
-               3'b010: match_cond4_ct = dcpu_adr_i;    // load EA
700
-               3'b011: match_cond4_ct = dcpu_adr_i;    // store EA
701
-               3'b100: match_cond4_ct = dcpu_dat_dc;   // load data
702
-               3'b101: match_cond4_ct = dcpu_dat_lsu;  // store data
703
-               3'b110: match_cond4_ct = dcpu_adr_i;    // load/store EA
704
-               default:match_cond4_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
705
-       endcase
706
+               3'b001: match_cond4_tmp = id_pc;                // insn fetch EA
707
+               3'b010: match_cond4_tmp = dcpu_adr_i;   // load EA
708
+               3'b011: match_cond4_tmp = dcpu_adr_i;   // store EA
709
+               3'b100: match_cond4_tmp = dcpu_dat_dc;  // load data
710
+               3'b101: match_cond4_tmp = dcpu_dat_lsu; // store data
711
+               3'b110: match_cond4_tmp = dcpu_adr_i;   // load/store EA
712
+               default:match_cond4_tmp = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
713
+       endcase
714
+
715
+// Transparently handle 8/16/32 bit bus accesses (Match Condition 4)
716
+// For addresses, leave unchanged
717
+// for 32-bit data, leave unchanged
718
+// for 8- or 16-bit data, move the active byte lane(s) to the LSB position
719
+// This will allow the value to be compared to the LSB(s) of the DVR
720
+always @(match_cond4_tmp or dcr4 or dcpu_be_i)
721
+  case (dcr4[`OR1200_DU_DCR_CT])               // synopsys parallel_case
722
+    3'b100,
723
+    3'b101,
724
+    3'b111:  begin // We're comparing to data
725
+      case (dcpu_be_i)
726
+        4'b1000: match_cond4_ct = { {24{dcr4[`OR1200_DU_DCR_SC] & match_cond4_tmp[31]}}, match_cond4_tmp[31:24]};
727
+        4'b0100: match_cond4_ct = { {24{dcr4[`OR1200_DU_DCR_SC] & match_cond4_tmp[23]}}, match_cond4_tmp[23:16]};
728
+        4'b0010: match_cond4_ct = { {24{dcr4[`OR1200_DU_DCR_SC] & match_cond4_tmp[15]}}, match_cond4_tmp[15:8]};
729
+        4'b0001: match_cond4_ct = { {24{dcr4[`OR1200_DU_DCR_SC] & match_cond4_tmp[7] }}, match_cond4_tmp[7:0]};
730
+        4'b1100: match_cond4_ct = { {16{dcr4[`OR1200_DU_DCR_SC] & match_cond4_tmp[31]}}, match_cond4_tmp[31:16]};
731
+        4'b0011: match_cond4_ct = { {16{dcr4[`OR1200_DU_DCR_SC] & match_cond4_tmp[15]}}, match_cond4_tmp[15:0]};
732
+        default: match_cond4_ct = match_cond4_tmp;
733
+      endcase
734
+    end
735
+    default: match_cond4_ct = match_cond4_tmp;  // We're comparing an address
736
+  endcase
737
 
738
 //
739
 // When To Compare (Match Condition 4)
740
 //
741
-always @(dcr4 or dcpu_cycstb_i)
742
-       case (dcr4[`OR1200_DU_DCR_CT])          // synopsys parallel_case
743
+always @(dcr4 or dcpu_cycstb_i or dcpu_we_i)
744
+       case (dcr4[`OR1200_DU_DCR_CT])          // synopsys parallel_case
745
                3'b000: match_cond4_stb = 1'b0;         //comparison disabled
746
                3'b001: match_cond4_stb = 1'b1;         // insn fetch EA
747
-               default:match_cond4_stb = dcpu_cycstb_i; // any load/store
748
+               3'b010: match_cond4_stb = (dcpu_cycstb_i & (~dcpu_we_i));  // data load addr
749
+               3'b011: match_cond4_stb = (dcpu_cycstb_i & dcpu_we_i);     // data store addr
750
+               3'b100: match_cond4_stb = (dcpu_cycstb_i & (~dcpu_we_i));  // data load val
751
+               3'b101: match_cond4_stb = (dcpu_cycstb_i & dcpu_we_i);     // data store val
752
+               default: match_cond4_stb = dcpu_cycstb_i; // any load/store
753
        endcase
754
 
755
 //
756
@@ -1361,23 +1509,21 @@ always @(match_cond4_stb or dcr4 or dvr4
757
                4'b1_000,
758
                4'b1_111: match4 = 1'b0;
759
                4'b1_001: match4 =
760
-                       ((match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]) ==
761
-                       (dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]));
762
+                       (match_cond4_ct == dvr4);
763
                4'b1_010: match4 =
764
-                       ((match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]) <
765
-                       (dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]));
766
+                       ({(match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]), match_cond4_ct[30:0]} <
767
+                        {(dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]), dvr4[30:0]} );
768
                4'b1_011: match4 =
769
-                       ((match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]) <=
770
-                       (dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]));
771
+                       ({(match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]), match_cond4_ct[30:0]} <=
772
+                        {(dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]), dvr4[30:0]} );
773
                4'b1_100: match4 =
774
-                       ((match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]) >
775
-                       (dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]));
776
+                       ({(match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]), match_cond4_ct[30:0]} >
777
+                        {(dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]), dvr4[30:0]} );
778
                4'b1_101: match4 =
779
-                       ((match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]) >=
780
-                       (dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]));
781
+                       ({(match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]), match_cond4_ct[30:0]} >=
782
+                        {(dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]), dvr4[30:0]} );
783
                4'b1_110: match4 =
784
-                       ((match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]) !=
785
-                       (dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]));
786
+                       (match_cond4_ct != dvr4);
787
        endcase
788
 
789
 //
790
@@ -1391,29 +1537,57 @@ always @(dmr1 or match4 or wp)
791
                2'b11: wp[4] = 1'b0;
792
        endcase
793
 
794
+
795
 //
796
 // Compare To What (Match Condition 5)
797
 //
798
 always @(dcr5 or id_pc or dcpu_adr_i or dcpu_dat_dc
799
        or dcpu_dat_lsu or dcpu_we_i)
800
        case (dcr5[`OR1200_DU_DCR_CT])          // synopsys parallel_case
801
-               3'b001: match_cond5_ct = id_pc;         // insn fetch EA
802
-               3'b010: match_cond5_ct = dcpu_adr_i;    // load EA
803
-               3'b011: match_cond5_ct = dcpu_adr_i;    // store EA
804
-               3'b100: match_cond5_ct = dcpu_dat_dc;   // load data
805
-               3'b101: match_cond5_ct = dcpu_dat_lsu;  // store data
806
-               3'b110: match_cond5_ct = dcpu_adr_i;    // load/store EA
807
-               default:match_cond5_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
808
-       endcase
809
+               3'b001: match_cond5_tmp = id_pc;                // insn fetch EA
810
+               3'b010: match_cond5_tmp = dcpu_adr_i;   // load EA
811
+               3'b011: match_cond5_tmp = dcpu_adr_i;   // store EA
812
+               3'b100: match_cond5_tmp = dcpu_dat_dc;  // load data
813
+               3'b101: match_cond5_tmp = dcpu_dat_lsu; // store data
814
+               3'b110: match_cond5_tmp = dcpu_adr_i;   // load/store EA
815
+               default:match_cond5_tmp = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
816
+       endcase
817
+
818
+// Transparently handle 8/16/32 bit bus accesses (Match Condition 5)
819
+// For addresses, leave unchanged
820
+// for 32-bit data, leave unchanged
821
+// for 8- or 16-bit data, move the active byte lane(s) to the LSB position
822
+// This will allow the value to be compared to the LSB(s) of the DVR
823
+always @(match_cond5_tmp or dcr5 or dcpu_be_i)
824
+  case (dcr5[`OR1200_DU_DCR_CT])               // synopsys parallel_case
825
+    3'b100,
826
+    3'b101,
827
+    3'b111:  begin // We're comparing to data
828
+      case (dcpu_be_i)
829
+        4'b1000: match_cond5_ct = { {24{dcr5[`OR1200_DU_DCR_SC] & match_cond5_tmp[31]}}, match_cond5_tmp[31:24]};
830
+        4'b0100: match_cond5_ct = { {24{dcr5[`OR1200_DU_DCR_SC] & match_cond5_tmp[23]}}, match_cond5_tmp[23:16]};
831
+        4'b0010: match_cond5_ct = { {24{dcr5[`OR1200_DU_DCR_SC] & match_cond5_tmp[15]}}, match_cond5_tmp[15:8]};
832
+        4'b0001: match_cond5_ct = { {24{dcr5[`OR1200_DU_DCR_SC] & match_cond5_tmp[7] }}, match_cond5_tmp[7:0]};
833
+        4'b1100: match_cond5_ct = { {16{dcr5[`OR1200_DU_DCR_SC] & match_cond5_tmp[31]}}, match_cond5_tmp[31:16]};
834
+        4'b0011: match_cond5_ct = { {16{dcr5[`OR1200_DU_DCR_SC] & match_cond5_tmp[15]}}, match_cond5_tmp[15:0]};
835
+        default: match_cond5_ct = match_cond5_tmp;
836
+      endcase
837
+    end
838
+    default: match_cond5_ct = match_cond5_tmp;  // We're comparing an address
839
+  endcase
840
 
841
 //
842
 // When To Compare (Match Condition 5)
843
 //
844
-always @(dcr5 or dcpu_cycstb_i)
845
-       case (dcr5[`OR1200_DU_DCR_CT])          // synopsys parallel_case
846
+always @(dcr5 or dcpu_cycstb_i or dcpu_we_i)
847
+       case (dcr5[`OR1200_DU_DCR_CT])          // synopsys parallel_case
848
                3'b000: match_cond5_stb = 1'b0;         //comparison disabled
849
                3'b001: match_cond5_stb = 1'b1;         // insn fetch EA
850
-               default:match_cond5_stb = dcpu_cycstb_i; // any load/store
851
+               3'b010: match_cond5_stb = (dcpu_cycstb_i & (~dcpu_we_i));  // data load addr
852
+               3'b011: match_cond5_stb = (dcpu_cycstb_i & dcpu_we_i);     // data store addr
853
+               3'b100: match_cond5_stb = (dcpu_cycstb_i & (~dcpu_we_i));  // data load val
854
+               3'b101: match_cond5_stb = (dcpu_cycstb_i & dcpu_we_i);     // data store val
855
+               default: match_cond5_stb = dcpu_cycstb_i; // any load/store
856
        endcase
857
 
858
 //
859
@@ -1425,23 +1599,21 @@ always @(match_cond5_stb or dcr5 or dvr5
860
                4'b1_000,
861
                4'b1_111: match5 = 1'b0;
862
                4'b1_001: match5 =
863
-                       ((match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]) ==
864
-                       (dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]));
865
+                       (match_cond5_ct == dvr5);
866
                4'b1_010: match5 =
867
-                       ((match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]) <
868
-                       (dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]));
869
+                       ({(match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]), match_cond5_ct[30:0]} <
870
+                        {(dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]), dvr5[30:0]} );
871
                4'b1_011: match5 =
872
-                       ((match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]) <=
873
-                       (dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]));
874
+                       ({(match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]), match_cond5_ct[30:0]} <=
875
+                        {(dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]), dvr5[30:0]} );
876
                4'b1_100: match5 =
877
-                       ((match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]) >
878
-                       (dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]));
879
+                       ({(match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]), match_cond5_ct[30:0]} >
880
+                        {(dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]), dvr5[30:0]} );
881
                4'b1_101: match5 =
882
-                       ((match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]) >=
883
-                       (dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]));
884
+                       ({(match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]), match_cond5_ct[30:0]} >=
885
+                        {(dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]), dvr5[30:0]} );
886
                4'b1_110: match5 =
887
-                       ((match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]) !=
888
-                       (dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]));
889
+                       (match_cond5_ct != dvr5);
890
        endcase
891
 
892
 //
893
@@ -1455,29 +1627,57 @@ always @(dmr1 or match5 or wp)
894
                2'b11: wp[5] = 1'b0;
895
        endcase
896
 
897
+
898
 //
899
 // Compare To What (Match Condition 6)
900
 //
901
 always @(dcr6 or id_pc or dcpu_adr_i or dcpu_dat_dc
902
        or dcpu_dat_lsu or dcpu_we_i)
903
        case (dcr6[`OR1200_DU_DCR_CT])          // synopsys parallel_case
904
-               3'b001: match_cond6_ct = id_pc;         // insn fetch EA
905
-               3'b010: match_cond6_ct = dcpu_adr_i;    // load EA
906
-               3'b011: match_cond6_ct = dcpu_adr_i;    // store EA
907
-               3'b100: match_cond6_ct = dcpu_dat_dc;   // load data
908
-               3'b101: match_cond6_ct = dcpu_dat_lsu;  // store data
909
-               3'b110: match_cond6_ct = dcpu_adr_i;    // load/store EA
910
-               default:match_cond6_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
911
-       endcase
912
+               3'b001: match_cond6_tmp = id_pc;                // insn fetch EA
913
+               3'b010: match_cond6_tmp = dcpu_adr_i;   // load EA
914
+               3'b011: match_cond6_tmp = dcpu_adr_i;   // store EA
915
+               3'b100: match_cond6_tmp = dcpu_dat_dc;  // load data
916
+               3'b101: match_cond6_tmp = dcpu_dat_lsu; // store data
917
+               3'b110: match_cond6_tmp = dcpu_adr_i;   // load/store EA
918
+               default:match_cond6_tmp = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
919
+       endcase
920
+
921
+// Transparently handle 8/16/32 bit bus accesses:
922
+// For addresses, leave unchanged
923
+// for 32-bit data, leave unchanged
924
+// for 8- or 16-bit data, move the active byte lane(s) to the LSB position
925
+// This will allow the value to be compared to the LSB(s) of the DVR
926
+always @(match_cond6_tmp or dcr6 or dcpu_be_i)
927
+  case (dcr6[`OR1200_DU_DCR_CT])               // synopsys parallel_case
928
+    3'b100,
929
+    3'b101,
930
+    3'b111:  begin // We're comparing to data
931
+      case (dcpu_be_i)
932
+        4'b1000: match_cond6_ct = { {24{dcr6[`OR1200_DU_DCR_SC] & match_cond6_tmp[31]}}, match_cond6_tmp[31:24]};
933
+        4'b0100: match_cond6_ct = { {24{dcr6[`OR1200_DU_DCR_SC] & match_cond6_tmp[23]}}, match_cond6_tmp[23:16]};
934
+        4'b0010: match_cond6_ct = { {24{dcr6[`OR1200_DU_DCR_SC] & match_cond6_tmp[15]}}, match_cond6_tmp[15:8]};
935
+        4'b0001: match_cond6_ct = { {24{dcr6[`OR1200_DU_DCR_SC] & match_cond6_tmp[7] }}, match_cond6_tmp[7:0]};
936
+        4'b1100: match_cond6_ct = { {16{dcr6[`OR1200_DU_DCR_SC] & match_cond6_tmp[31]}}, match_cond6_tmp[31:16]};
937
+        4'b0011: match_cond6_ct = { {16{dcr6[`OR1200_DU_DCR_SC] & match_cond6_tmp[15]}}, match_cond6_tmp[15:0]};
938
+        default: match_cond6_ct = match_cond6_tmp;
939
+      endcase
940
+    end
941
+    default: match_cond6_ct = match_cond6_tmp;  // We're comparing an address
942
+  endcase
943
 
944
 //
945
 // When To Compare (Match Condition 6)
946
 //
947
-always @(dcr6 or dcpu_cycstb_i)
948
-       case (dcr6[`OR1200_DU_DCR_CT])          // synopsys parallel_case
949
+always @(dcr6 or dcpu_cycstb_i or dcpu_we_i)
950
+       case (dcr6[`OR1200_DU_DCR_CT])          // synopsys parallel_case
951
                3'b000: match_cond6_stb = 1'b0;         //comparison disabled
952
                3'b001: match_cond6_stb = 1'b1;         // insn fetch EA
953
-               default:match_cond6_stb = dcpu_cycstb_i; // any load/store
954
+               3'b010: match_cond6_stb = (dcpu_cycstb_i & (~dcpu_we_i));  // data load addr
955
+               3'b011: match_cond6_stb = (dcpu_cycstb_i & dcpu_we_i);     // data store addr
956
+               3'b100: match_cond6_stb = (dcpu_cycstb_i & (~dcpu_we_i));  // data load val
957
+               3'b101: match_cond6_stb = (dcpu_cycstb_i & dcpu_we_i);     // data store val
958
+               default: match_cond6_stb = dcpu_cycstb_i; // any load/store
959
        endcase
960
 
961
 //
962
@@ -1489,23 +1689,21 @@ always @(match_cond6_stb or dcr6 or dvr6
963
                4'b1_000,
964
                4'b1_111: match6 = 1'b0;
965
                4'b1_001: match6 =
966
-                       ((match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]) ==
967
-                       (dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]));
968
+                       (match_cond6_ct == dvr6);
969
                4'b1_010: match6 =
970
-                       ((match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]) <
971
-                       (dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]));
972
+                       ({(match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]), match_cond6_ct[30:0]} <
973
+                        {(dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]), dvr6[30:0]} );
974
                4'b1_011: match6 =
975
-                       ((match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]) <=
976
-                       (dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]));
977
+                       ({(match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]), match_cond6_ct[30:0]} <=
978
+                        {(dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]), dvr6[30:0]} );
979
                4'b1_100: match6 =
980
-                       ((match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]) >
981
-                       (dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]));
982
+                       ({(match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]), match_cond6_ct[30:0]} >
983
+                        {(dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]), dvr6[30:0]} );
984
                4'b1_101: match6 =
985
-                       ((match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]) >=
986
-                       (dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]));
987
+                       ({(match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]), match_cond6_ct[30:0]} >=
988
+                        {(dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]), dvr6[30:0]} );
989
                4'b1_110: match6 =
990
-                       ((match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]) !=
991
-                       (dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]));
992
+                       (match_cond6_ct != dvr6);
993
        endcase
994
 
995
 //
996
@@ -1525,27 +1723,58 @@ always @(dmr1 or match6 or wp)
997
 always @(dcr7 or id_pc or dcpu_adr_i or dcpu_dat_dc
998
        or dcpu_dat_lsu or dcpu_we_i)
999
        case (dcr7[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1000
-               3'b001: match_cond7_ct = id_pc;         // insn fetch EA
1001
-               3'b010: match_cond7_ct = dcpu_adr_i;    // load EA
1002
-               3'b011: match_cond7_ct = dcpu_adr_i;    // store EA
1003
-               3'b100: match_cond7_ct = dcpu_dat_dc;   // load data
1004
-               3'b101: match_cond7_ct = dcpu_dat_lsu;  // store data
1005
-               3'b110: match_cond7_ct = dcpu_adr_i;    // load/store EA
1006
-               default:match_cond7_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1007
-       endcase
1008
+               3'b001: match_cond7_tmp = id_pc;                // insn fetch EA -- *** use spr_dat_npc?? ***
1009
+               3'b010: match_cond7_tmp = dcpu_adr_i;   // load EA
1010
+               3'b011: match_cond7_tmp = dcpu_adr_i;   // store EA
1011
+               3'b100: match_cond7_tmp = dcpu_dat_dc;  // load data
1012
+               3'b101: match_cond7_tmp = dcpu_dat_lsu; // store data
1013
+               3'b110: match_cond7_tmp = dcpu_adr_i;   // load/store EA
1014
+               default:match_cond7_tmp = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1015
+       endcase
1016
+
1017
+// Transparently handle 8/16/32 bit bus accesses:
1018
+// For addresses, leave unchanged
1019
+// for 32-bit data, leave unchanged
1020
+// for 8- or 16-bit data, move the active byte lane(s) to the LSB position
1021
+// This will allow the value to be compared to the LSB(s) of the DVR.
1022
+// If we're doing a signed compare (DCR_SC is set), we sign-extend.  If not, zero-pad.
1023
+// This means that for a signed comparison, the DVR must ALWAYS be a 32-bit signed
1024
+// number, even if only doing on 8-bit compare!
1025
+always @(match_cond7_tmp or dcr7 or dcpu_be_i)
1026
+  case (dcr7[`OR1200_DU_DCR_CT])               // synopsys parallel_case
1027
+    3'b100,
1028
+    3'b101,
1029
+    3'b111:  begin // We're comparing to data
1030
+      case (dcpu_be_i)
1031
+        4'b1000: match_cond7_ct = { {24{dcr7[`OR1200_DU_DCR_SC] & match_cond7_tmp[31]}}, match_cond7_tmp[31:24]};
1032
+        4'b0100: match_cond7_ct = { {24{dcr7[`OR1200_DU_DCR_SC] & match_cond7_tmp[23]}}, match_cond7_tmp[23:16]};
1033
+        4'b0010: match_cond7_ct = { {24{dcr7[`OR1200_DU_DCR_SC] & match_cond7_tmp[15]}}, match_cond7_tmp[15:8]};
1034
+        4'b0001: match_cond7_ct = { {24{dcr7[`OR1200_DU_DCR_SC] & match_cond7_tmp[7] }}, match_cond7_tmp[7:0]};
1035
+        4'b1100: match_cond7_ct = { {16{dcr7[`OR1200_DU_DCR_SC] & match_cond7_tmp[31]}}, match_cond7_tmp[31:16]};
1036
+        4'b0011: match_cond7_ct = { {16{dcr7[`OR1200_DU_DCR_SC] & match_cond7_tmp[15]}}, match_cond7_tmp[15:0]};
1037
+        default: match_cond7_ct = match_cond7_tmp;
1038
+      endcase
1039
+    end
1040
+    default: match_cond7_ct = match_cond7_tmp;  // We're comparing an address
1041
+  endcase
1042
 
1043
 //
1044
 // When To Compare (Match Condition 7)
1045
 //
1046
-always @(dcr7 or dcpu_cycstb_i)
1047
+always @(dcr7 or dcpu_cycstb_i or dcpu_we_i)
1048
        case (dcr7[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1049
                3'b000: match_cond7_stb = 1'b0;         //comparison disabled
1050
                3'b001: match_cond7_stb = 1'b1;         // insn fetch EA
1051
-               default:match_cond7_stb = dcpu_cycstb_i; // any load/store
1052
+               3'b010: match_cond7_stb = (dcpu_cycstb_i & (~dcpu_we_i));  // data load addr
1053
+               3'b011: match_cond7_stb = (dcpu_cycstb_i & dcpu_we_i);     // data store addr
1054
+               3'b100: match_cond7_stb = (dcpu_cycstb_i & (~dcpu_we_i));  // data load val
1055
+               3'b101: match_cond7_stb = (dcpu_cycstb_i & dcpu_we_i);     // data store val
1056
+               default: match_cond7_stb = dcpu_cycstb_i; // any load/store
1057
        endcase
1058
 
1059
 //
1060
 // Match Condition 7
1061
+// To do a signed comparison, we invert the MSB then do an unsigned comparison.
1062
 //
1063
 always @(match_cond7_stb or dcr7 or dvr7 or match_cond7_ct)
1064
        casex ({match_cond7_stb, dcr7[`OR1200_DU_DCR_CC]})
1065
@@ -1553,23 +1782,21 @@ always @(match_cond7_stb or dcr7 or dvr7
1066
                4'b1_000,
1067
                4'b1_111: match7 = 1'b0;
1068
                4'b1_001: match7 =
1069
-                       ((match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]) ==
1070
-                       (dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]));
1071
+                       (match_cond7_ct == dvr7);
1072
                4'b1_010: match7 =
1073
-                       ((match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]) <
1074
-                       (dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]));
1075
+                       ({(match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]), match_cond7_ct[30:0]} <
1076
+                        {(dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]), dvr7[30:0]} );
1077
                4'b1_011: match7 =
1078
-                       ((match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]) <=
1079
-                       (dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]));
1080
+                       ({(match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]), match_cond7_ct[30:0]} <=
1081
+                        {(dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]), dvr7[30:0]} );
1082
                4'b1_100: match7 =
1083
-                       ((match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]) >
1084
-                       (dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]));
1085
+                       ({(match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]), match_cond7_ct[30:0]} >
1086
+                        {(dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]), dvr7[30:0]} );
1087
                4'b1_101: match7 =
1088
-                       ((match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]) >=
1089
-                       (dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]));
1090
+                       ({(match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]), match_cond7_ct[30:0]} >=
1091
+                        {(dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]), dvr7[30:0]} );
1092
                4'b1_110: match7 =
1093
-                       ((match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]) !=
1094
-                       (dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]));
1095
+                       (match_cond7_ct != dvr7);
1096
        endcase
1097
 
1098
 //
1099
@@ -1586,11 +1813,19 @@ always @(dmr1 or match7 or wp)
1100
 //
1101
 // Increment Watchpoint Counter 0
1102
 //
1103
-always @(wp or dmr2)
1104
-       if (dmr2[`OR1200_DU_DMR2_WCE0])
1105
-               incr_wpcntr0 = |(wp & ~dmr2[`OR1200_DU_DMR2_AWTC]);
1106
-       else
1107
-               incr_wpcntr0 = 1'b0;
1108
+
1109
+// A watchpoint may hold it's wp bit high for >1 clock while ex_freeze
1110
+// is high, but drop it when ex_freeze is low.  So, increment on wp will over-increment,
1111
+// but AND'ing with ex_freeze will never increment.  Solution:  hold the wp when set,
1112
+// inc the counter only when ex_freeze is false.
1113
+always @ (posedge clk)
1114
+begin
1115
+  if(rst) incr_wpcntr0_latched <= 1'b0;
1116
+  else if(ex_freeze & (|(wp & ~dmr2[`OR1200_DU_DMR2_AWTC]))) incr_wpcntr0_latched <= 1'b1;
1117
+  else if(~ex_freeze) incr_wpcntr0_latched <= 1'b0;
1118
+end
1119
+
1120
+assign incr_wpcntr0 = dmr2[`OR1200_DU_DMR2_WCE0] & (~ex_freeze & (incr_wpcntr0_latched | (|(wp & ~dmr2[`OR1200_DU_DMR2_AWTC]))));
1121
 
1122
 //
1123
 // Match Condition Watchpoint Counter 0
1124
@@ -1601,15 +1836,35 @@ always @(dwcr0)
1125
        else
1126
                wpcntr0_match = 1'b0;
1127
 
1128
+//
1129
+// Breakpoint Triggering - Counter 1
1130
+// While the standard watchpoint hardware won't give a match for more than one
1131
+// clock cycle, the counters will give a constant match.  This will be registered,
1132
+// causing a second trap condition after a continue.  To fix this, just pulse the
1133
+// break output high for 1 clock cycle, and don't do it again until the match
1134
+// condition has been negated for at least 1 clock cycle.  The new break output
1135
+// is called wpcntrX_oneshot.
1136
+//
1137
+always @ (posedge clk)
1138
+begin
1139
+       if(wpcntr0_match & wpcntr0_armed) wpcntr0_oneshot = 1'b1;
1140
+       else wpcntr0_oneshot = 1'b0;
1141
+end
1142
+
1143
+always @(posedge clk)
1144
+begin
1145
+       if(wpcntr0_match) wpcntr0_armed = 1'b0;
1146
+       else wpcntr0_armed = 1'b1;
1147
+end
1148
 
1149
 //
1150
-// Watchpoint 8
1151
+// Watchpoint 8 (Counter 0)
1152
 //
1153
-always @(dmr1 or wpcntr0_match or wp)
1154
+always @(dmr1 or wpcntr0_oneshot or wp)
1155
        case (dmr1[`OR1200_DU_DMR1_CW8])
1156
-               2'b00: wp[8] = wpcntr0_match;
1157
-               2'b01: wp[8] = wpcntr0_match & wp[7];
1158
-               2'b10: wp[8] = wpcntr0_match | wp[7];
1159
+               2'b00: wp[8] = wpcntr0_oneshot;
1160
+               2'b01: wp[8] = wpcntr0_oneshot & wp[3];
1161
+               2'b10: wp[8] = wpcntr0_oneshot | wp[3];
1162
                2'b11: wp[8] = 1'b0;
1163
        endcase
1164
 
1165
@@ -1617,11 +1872,18 @@ always @(dmr1 or wpcntr0_match or wp)
1166
 //
1167
 // Increment Watchpoint Counter 1
1168
 //
1169
-always @(wp or dmr2)
1170
-       if (dmr2[`OR1200_DU_DMR2_WCE1])
1171
-               incr_wpcntr1 = |(wp & dmr2[`OR1200_DU_DMR2_AWTC]);
1172
-       else
1173
-               incr_wpcntr1 = 1'b0;
1174
+// A watchpoint may hold it's wp bit high for >1 clock while ex_freeze
1175
+// is high, but drop it when ex_freeze is low.  So, increment on wp will over-increment,
1176
+// but AND'ing with ex_freeze will never increment.  Solution:  hold the wp when set,
1177
+// inc the counter only when ex_freeze is false.
1178
+always @ (posedge clk)
1179
+begin
1180
+  if(rst) incr_wpcntr1_latched <= 1'b0;
1181
+  else if(ex_freeze & (|(wp & dmr2[`OR1200_DU_DMR2_AWTC]))) incr_wpcntr1_latched <= 1'b1;
1182
+  else if(~ex_freeze) incr_wpcntr1_latched <= 1'b0;
1183
+end
1184
+
1185
+assign incr_wpcntr1 = dmr2[`OR1200_DU_DMR2_WCE1] & (~ex_freeze & (incr_wpcntr1_latched | (|(wp & dmr2[`OR1200_DU_DMR2_AWTC]))));
1186
 
1187
 //
1188
 // Match Condition Watchpoint Counter 1
1189
@@ -1633,36 +1895,70 @@ always @(dwcr1)
1190
                wpcntr1_match = 1'b0;
1191
 
1192
 //
1193
-// Watchpoint 9
1194
-//
1195
-always @(dmr1 or wpcntr1_match or wp)
1196
-       case (dmr1[`OR1200_DU_DMR1_CW9])
1197
-               2'b00: wp[9] = wpcntr1_match;
1198
-               2'b01: wp[9] = wpcntr1_match & wp[8];
1199
-               2'b10: wp[9] = wpcntr1_match | wp[8];
1200
-               2'b11: wp[9] = 1'b0;
1201
-       endcase
1202
+// Breakpoint Triggering - Counter 1
1203
+// While the standard watchpoint hardware won't give a match for more than one
1204
+// clock cycle, the counters will give a constant match.  This will be registered,
1205
+// causing a second trap condition after a continue.  To fix this, just pulse the
1206
+// break output high for 1 clock cycle, and don't do it again until the match
1207
+// condition has been negated for at least 1 clock cycle.  The new break output
1208
+// is called wpcntrX_oneshot.
1209
+//
1210
+always @ (posedge clk)
1211
+begin
1212
+       if(wpcntr1_match & wpcntr1_armed) wpcntr1_oneshot = 1'b1;
1213
+       else wpcntr1_oneshot = 1'b0;
1214
+end
1215
+
1216
+always @(posedge clk)
1217
+begin
1218
+       if(wpcntr1_match) wpcntr1_armed = 1'b0;
1219
+       else wpcntr1_armed = 1'b1;
1220
+end
1221
 
1222
 //
1223
-// Watchpoint 10
1224
+// Watchpoint 9 (Counter 1)
1225
 //
1226
-always @(dmr1 or dbg_ewt_i or wp)
1227
-       case (dmr1[`OR1200_DU_DMR1_CW10])
1228
-               2'b00: wp[10] = dbg_ewt_i;
1229
-               2'b01: wp[10] = dbg_ewt_i & wp[9];
1230
-               2'b10: wp[10] = dbg_ewt_i | wp[9];
1231
-               2'b11: wp[10] = 1'b0;
1232
+always @(dmr1 or wpcntr1_oneshot or wp)
1233
+       case (dmr1[`OR1200_DU_DMR1_CW9])
1234
+               2'b00: wp[9] = wpcntr1_oneshot;
1235
+               2'b01: wp[9] = wpcntr1_oneshot & wp[7];
1236
+               2'b10: wp[9] = wpcntr1_oneshot | wp[7];
1237
+               2'b11: wp[9] = 1'b0;
1238
        endcase
1239
 
1240
 `endif
1241
 
1242
+
1243
 //
1244
 // Watchpoints can cause trap exception
1245
 //
1246
 `ifdef OR1200_DU_HWBKPTS
1247
-assign du_hwbkpt = |(wp & dmr2[`OR1200_DU_DMR2_WGB]);
1248
+
1249
+// We must hold the du_hwbkpt signal high until it's noticed by the execution unit,
1250
+// which means until the 'freeze' signal goes inactive.
1251
+
1252
+always @ (posedge clk)
1253
+begin
1254
+  if(rst) du_hwbkpt_latched <= 1'b0;
1255
+  else if(ex_freeze & (|(wp & dmr2[`OR1200_DU_DMR2_WGB]))) du_hwbkpt_latched <= 1'b1;
1256
+  else if(~ex_freeze) du_hwbkpt_latched <= 1'b0;
1257
+end
1258
+
1259
+assign du_hwbkpt = du_hwbkpt_latched | (|(wp & dmr2[`OR1200_DU_DMR2_WGB]));
1260
+
1261
+  `ifdef OR1200_DU_DMR2
1262
+// Spec doesn't state what resets the WGB bits in DMR2.
1263
+// This implementation resets on any write to the DMR2.
1264
+always @ (posedge clk)
1265
+begin
1266
+       if(rst | (dmr2_sel & spr_write)) wp_latched <= 10'h000;
1267
+       else if((|(wp & dmr2[`OR1200_DU_DMR2_WGB]))/*du_hwbkpt*/ & !(|wp_latched)) wp_latched <= (wp & dmr2[`OR1200_DU_DMR2_WGB]);
1268
+end
1269
+  `endif
1270
+
1271
 `else
1272
 assign du_hwbkpt = 1'b0;
1273
+assign wp_latched = 10'h000;
1274
 `endif
1275
 
1276
 `ifdef OR1200_DU_TB_IMPLEMENTED

powered by: WebSVN 2.1.0

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