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 68

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