Warning, /frameworks/syntax-highlighting/autotests/input/or1200_du.v is written in an unsupported language. File is not indexed.

0001 //////////////////////////////////////////////////////////////////////
0002 ////                                                              ////
0003 ////  OR1200's Debug Unit                                         ////
0004 ////                                                              ////
0005 ////  This file is part of the OpenRISC 1200 project              ////
0006 ////  http://www.opencores.org/project,or1k                       ////
0007 ////                                                              ////
0008 ////  Description                                                 ////
0009 ////  Basic OR1200 debug unit.                                    ////
0010 ////                                                              ////
0011 ////  To Do:                                                      ////
0012 ////   - make it smaller and faster                               ////
0013 ////                                                              ////
0014 ////  Author(s):                                                  ////
0015 ////      - Damjan Lampret, lampret@opencores.org                 ////
0016 ////                                                              ////
0017 //////////////////////////////////////////////////////////////////////
0018 ////                                                              ////
0019 //// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
0020 ////                                                              ////
0021 //// This source file may be used and distributed without         ////
0022 //// restriction provided that this copyright statement is not    ////
0023 //// removed from the file and that any derivative work contains  ////
0024 //// the original copyright notice and the associated disclaimer. ////
0025 ////                                                              ////
0026 //// This source file is free software; you can redistribute it   ////
0027 //// and/or modify it under the terms of the GNU Lesser General   ////
0028 //// Public License as published by the Free Software Foundation; ////
0029 //// either version 2.1 of the License, or (at your option) any   ////
0030 //// later version.                                               ////
0031 ////                                                              ////
0032 //// This source is distributed in the hope that it will be       ////
0033 //// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
0034 //// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
0035 //// PURPOSE.  See the GNU Lesser General Public License for more ////
0036 //// details.                                                     ////
0037 ////                                                              ////
0038 //// You should have received a copy of the GNU Lesser General    ////
0039 //// Public License along with this source; if not, download it   ////
0040 //// from http://www.opencores.org/lgpl.shtml                     ////
0041 ////                                                              ////
0042 //////////////////////////////////////////////////////////////////////
0043 //
0044 //
0045 // $Log: or1200_du.v,v $
0046 // Revision 2.0  2010/06/30 11:00:00  ORSoC
0047 // Minor update: 
0048 // Bugs fixed. 
0049 
0050 // synopsys translate_off
0051 `include "timescale.v"
0052 // synopsys translate_on
0053 `include "or1200_defines.v"
0054 
0055 //
0056 // Debug unit
0057 //
0058 
0059 module or1200_du(
0060         // RISC Internal Interface
0061         clk, rst,
0062         dcpu_cycstb_i, dcpu_we_i, dcpu_adr_i, dcpu_dat_lsu,
0063         dcpu_dat_dc, icpu_cycstb_i,
0064         ex_freeze, branch_op, ex_insn, id_pc,
0065         spr_dat_npc, rf_dataw,
0066         du_dsr, du_dmr1, du_stall, du_addr, du_dat_i, du_dat_o,
0067         du_read, du_write, du_except_stop, du_hwbkpt, du_flush_pipe,
0068         spr_cs, spr_write, spr_addr, spr_dat_i, spr_dat_o,
0069 
0070         // External Debug Interface
0071         dbg_stall_i, dbg_ewt_i, dbg_lss_o, dbg_is_o, dbg_wp_o, dbg_bp_o,
0072         dbg_stb_i, dbg_we_i, dbg_adr_i, dbg_dat_i, dbg_dat_o, dbg_ack_o
0073 );
0074 
0075 parameter dw = `OR1200_OPERAND_WIDTH;
0076 parameter aw = `OR1200_OPERAND_WIDTH;
0077 
0078 //
0079 // I/O
0080 //
0081 
0082 //
0083 // RISC Internal Interface
0084 //
0085 input                           clk;            // Clock
0086 input                           rst;            // Reset
0087 input                           dcpu_cycstb_i;  // LSU status
0088 input                           dcpu_we_i;      // LSU status
0089 input   [31:0]                  dcpu_adr_i;     // LSU addr
0090 input   [31:0]                  dcpu_dat_lsu;   // LSU store data
0091 input   [31:0]                  dcpu_dat_dc;    // LSU load data
0092 input   [`OR1200_FETCHOP_WIDTH-1:0]     icpu_cycstb_i;  // IFETCH unit status
0093 input                           ex_freeze;      // EX stage freeze
0094 input   [`OR1200_BRANCHOP_WIDTH-1:0]    branch_op;      // Branch op
0095 input   [dw-1:0]                ex_insn;        // EX insn
0096 input   [31:0]                  id_pc;          // insn fetch EA
0097 input   [31:0]                  spr_dat_npc;    // Next PC (for trace)
0098 input   [31:0]                  rf_dataw;       // ALU result (for trace)
0099 output  [`OR1200_DU_DSR_WIDTH-1:0]     du_dsr;          // DSR
0100 output  [24: 0]                 du_dmr1;
0101 output                          du_stall;       // Debug Unit Stall
0102 output  [aw-1:0]                du_addr;        // Debug Unit Address
0103 input   [dw-1:0]                du_dat_i;       // Debug Unit Data In
0104 output  [dw-1:0]                du_dat_o;       // Debug Unit Data Out
0105 output                          du_read;        // Debug Unit Read Enable
0106 output                          du_write;       // Debug Unit Write Enable
0107 input   [13:0]                  du_except_stop; // Exception masked by DSR
0108 output                          du_hwbkpt;      // Cause trap exception (HW Breakpoints)
0109 output                          du_flush_pipe;  // Cause pipeline flush and pc<-npc
0110 input                           spr_cs;         // SPR Chip Select
0111 input                           spr_write;      // SPR Read/Write
0112 input   [aw-1:0]                spr_addr;       // SPR Address
0113 input   [dw-1:0]                spr_dat_i;      // SPR Data Input
0114 output  [dw-1:0]                spr_dat_o;      // SPR Data Output
0115 
0116 //
0117 // External Debug Interface
0118 //
0119 input                   dbg_stall_i;    // External Stall Input
0120 input                   dbg_ewt_i;      // External Watchpoint Trigger Input
0121 output  [3:0]           dbg_lss_o;      // External Load/Store Unit Status
0122 output  [1:0]           dbg_is_o;       // External Insn Fetch Status
0123 output  [10:0]          dbg_wp_o;       // Watchpoints Outputs
0124 output                  dbg_bp_o;       // Breakpoint Output
0125 input                   dbg_stb_i;      // External Address/Data Strobe
0126 input                   dbg_we_i;       // External Write Enable
0127 input   [aw-1:0]        dbg_adr_i;      // External Address Input
0128 input   [dw-1:0]        dbg_dat_i;      // External Data Input
0129 output  [dw-1:0]        dbg_dat_o;      // External Data Output
0130 output                  dbg_ack_o;      // External Data Acknowledge (not WB compatible)
0131 reg     [dw-1:0]        dbg_dat_o;      // External Data Output
0132 reg                     dbg_ack_o;      // External Data Acknowledge (not WB compatible)
0133 
0134 
0135 //
0136 // Some connections go directly from the CPU through DU to Debug I/F
0137 //
0138 `ifdef OR1200_DU_STATUS_UNIMPLEMENTED
0139 assign dbg_lss_o = 4'b0000;
0140 
0141 reg     [1:0]                   dbg_is_o;
0142 //
0143 // Show insn activity (temp, must be removed)
0144 //
0145 always @(posedge clk or `OR1200_RST_EVENT rst)
0146         if (rst == `OR1200_RST_VALUE)
0147                 dbg_is_o <=  2'b00;
0148         else if (!ex_freeze & ~((ex_insn[31:26] == `OR1200_OR32_NOP) & ex_insn[16]))
0149                 dbg_is_o <=  ~dbg_is_o;
0150 `ifdef UNUSED
0151 assign dbg_is_o = 2'b00;
0152 `endif
0153 `else
0154 assign dbg_lss_o = dcpu_cycstb_i ? {dcpu_we_i, 3'b000} : 4'b0000;
0155 assign dbg_is_o = {1'b0, icpu_cycstb_i};
0156 `endif
0157 assign dbg_wp_o = 11'b000_0000_0000;
0158 
0159 //
0160 // Some connections go directly from Debug I/F through DU to the CPU
0161 //
0162 assign du_stall = dbg_stall_i;
0163 assign du_addr = dbg_adr_i;
0164 assign du_dat_o = dbg_dat_i;
0165 assign du_read = dbg_stb_i && !dbg_we_i;
0166 assign du_write = dbg_stb_i && dbg_we_i;
0167 
0168 //
0169 // After a sw breakpoint, the replaced instruction need to be executed.
0170 // We flush the entire pipeline and set the pc to the current address
0171 // to execute the restored address.
0172 //
0173 
0174 reg du_flush_pipe_r;
0175 reg dbg_stall_i_r;
0176 
0177 assign du_flush_pipe = du_flush_pipe_r;
0178 
0179 //
0180 // Register du_flush_pipe
0181 //
0182 always @(posedge clk or `OR1200_RST_EVENT rst) begin
0183         if (rst == `OR1200_RST_VALUE) begin
0184                 du_flush_pipe_r   <=  1'b0;
0185         end
0186         else begin
0187                 du_flush_pipe_r   <=  (dbg_stall_i_r && !dbg_stall_i && |du_except_stop);
0188         end
0189 end
0190 
0191 //
0192 // Detect dbg_stall falling edge
0193 //
0194 always @(posedge clk or `OR1200_RST_EVENT rst) begin
0195         if (rst == `OR1200_RST_VALUE) begin
0196                 dbg_stall_i_r   <=  1'b0;
0197         end
0198         else begin
0199                 dbg_stall_i_r   <=  dbg_stall_i;
0200         end
0201 end
0202 
0203 reg                             dbg_ack;
0204 //
0205 // Generate acknowledge -- just delay stb signal
0206 //
0207 always @(posedge clk or `OR1200_RST_EVENT rst) begin
0208         if (rst == `OR1200_RST_VALUE) begin
0209                 dbg_ack   <=  1'b0;
0210                 dbg_ack_o <=  1'b0;
0211         end
0212         else begin
0213                 dbg_ack   <=  dbg_stb_i;                // valid when du_dat_i 
0214                 dbg_ack_o <=  dbg_ack & dbg_stb_i;      // valid when dbg_dat_o 
0215         end
0216 end
0217 
0218 // 
0219 // Register data output
0220 //
0221 always @(posedge clk)
0222     dbg_dat_o <=  du_dat_i;
0223 
0224 `ifdef OR1200_DU_IMPLEMENTED
0225 
0226 //
0227 // Debug Mode Register 1
0228 //
0229 `ifdef OR1200_DU_DMR1
0230 reg     [24:0]                  dmr1;           // DMR1 implemented
0231 `else
0232 wire    [24:0]                  dmr1;           // DMR1 not implemented
0233 `endif
0234 assign du_dmr1 = dmr1;
0235 
0236 //
0237 // Debug Mode Register 2
0238 //
0239 `ifdef OR1200_DU_DMR2
0240 reg     [23:0]                  dmr2;           // DMR2 implemented
0241 `else
0242 wire    [23:0]                  dmr2;           // DMR2 not implemented
0243 `endif
0244 
0245 //
0246 // Debug Stop Register
0247 //
0248 `ifdef OR1200_DU_DSR
0249 reg     [`OR1200_DU_DSR_WIDTH-1:0]      dsr;            // DSR implemented
0250 `else
0251 wire    [`OR1200_DU_DSR_WIDTH-1:0]      dsr;            // DSR not implemented
0252 `endif
0253 
0254 //
0255 // Debug Reason Register
0256 //
0257 `ifdef OR1200_DU_DRR
0258 reg     [13:0]                  drr;            // DRR implemented
0259 `else
0260 wire    [13:0]                  drr;            // DRR not implemented
0261 `endif
0262 
0263 //
0264 // Debug Value Register N
0265 //
0266 `ifdef OR1200_DU_DVR0
0267 reg     [31:0]                  dvr0;
0268 `else
0269 wire    [31:0]                  dvr0;
0270 `endif
0271 
0272 //
0273 // Debug Value Register N
0274 //
0275 `ifdef OR1200_DU_DVR1
0276 reg     [31:0]                  dvr1;
0277 `else
0278 wire    [31:0]                  dvr1;
0279 `endif
0280 
0281 //
0282 // Debug Value Register N
0283 //
0284 `ifdef OR1200_DU_DVR2
0285 reg     [31:0]                  dvr2;
0286 `else
0287 wire    [31:0]                  dvr2;
0288 `endif
0289 
0290 //
0291 // Debug Value Register N
0292 //
0293 `ifdef OR1200_DU_DVR3
0294 reg     [31:0]                  dvr3;
0295 `else
0296 wire    [31:0]                  dvr3;
0297 `endif
0298 
0299 //
0300 // Debug Value Register N
0301 //
0302 `ifdef OR1200_DU_DVR4
0303 reg     [31:0]                  dvr4;
0304 `else
0305 wire    [31:0]                  dvr4;
0306 `endif
0307 
0308 //
0309 // Debug Value Register N
0310 //
0311 `ifdef OR1200_DU_DVR5
0312 reg     [31:0]                  dvr5;
0313 `else
0314 wire    [31:0]                  dvr5;
0315 `endif
0316 
0317 //
0318 // Debug Value Register N
0319 //
0320 `ifdef OR1200_DU_DVR6
0321 reg     [31:0]                  dvr6;
0322 `else
0323 wire    [31:0]                  dvr6;
0324 `endif
0325 
0326 //
0327 // Debug Value Register N
0328 //
0329 `ifdef OR1200_DU_DVR7
0330 reg     [31:0]                  dvr7;
0331 `else
0332 wire    [31:0]                  dvr7;
0333 `endif
0334 
0335 //
0336 // Debug Control Register N
0337 //
0338 `ifdef OR1200_DU_DCR0
0339 reg     [7:0]                   dcr0;
0340 `else
0341 wire    [7:0]                   dcr0;
0342 `endif
0343 
0344 //
0345 // Debug Control Register N
0346 //
0347 `ifdef OR1200_DU_DCR1
0348 reg     [7:0]                   dcr1;
0349 `else
0350 wire    [7:0]                   dcr1;
0351 `endif
0352 
0353 //
0354 // Debug Control Register N
0355 //
0356 `ifdef OR1200_DU_DCR2
0357 reg     [7:0]                   dcr2;
0358 `else
0359 wire    [7:0]                   dcr2;
0360 `endif
0361 
0362 //
0363 // Debug Control Register N
0364 //
0365 `ifdef OR1200_DU_DCR3
0366 reg     [7:0]                   dcr3;
0367 `else
0368 wire    [7:0]                   dcr3;
0369 `endif
0370 
0371 //
0372 // Debug Control Register N
0373 //
0374 `ifdef OR1200_DU_DCR4
0375 reg     [7:0]                   dcr4;
0376 `else
0377 wire    [7:0]                   dcr4;
0378 `endif
0379 
0380 //
0381 // Debug Control Register N
0382 //
0383 `ifdef OR1200_DU_DCR5
0384 reg     [7:0]                   dcr5;
0385 `else
0386 wire    [7:0]                   dcr5;
0387 `endif
0388 
0389 //
0390 // Debug Control Register N
0391 //
0392 `ifdef OR1200_DU_DCR6
0393 reg     [7:0]                   dcr6;
0394 `else
0395 wire    [7:0]                   dcr6;
0396 `endif
0397 
0398 //
0399 // Debug Control Register N
0400 //
0401 `ifdef OR1200_DU_DCR7
0402 reg     [7:0]                   dcr7;
0403 `else
0404 wire    [7:0]                   dcr7;
0405 `endif
0406 
0407 //
0408 // Debug Watchpoint Counter Register 0
0409 //
0410 `ifdef OR1200_DU_DWCR0
0411 reg     [31:0]                  dwcr0;
0412 `else
0413 wire    [31:0]                  dwcr0;
0414 `endif
0415 
0416 //
0417 // Debug Watchpoint Counter Register 1
0418 //
0419 `ifdef OR1200_DU_DWCR1
0420 reg     [31:0]                  dwcr1;
0421 `else
0422 wire    [31:0]                  dwcr1;
0423 `endif
0424 
0425 //
0426 // Internal wires
0427 //
0428 wire                            dmr1_sel;       // DMR1 select
0429 wire                            dmr2_sel;       // DMR2 select
0430 wire                            dsr_sel;        // DSR select
0431 wire                            drr_sel;        // DRR select
0432 wire                            dvr0_sel,
0433                                 dvr1_sel,
0434                                 dvr2_sel,
0435                                 dvr3_sel,
0436                                 dvr4_sel,
0437                                 dvr5_sel,
0438                                 dvr6_sel,
0439                                 dvr7_sel;       // DVR selects
0440 wire                            dcr0_sel,
0441                                 dcr1_sel,
0442                                 dcr2_sel,
0443                                 dcr3_sel,
0444                                 dcr4_sel,
0445                                 dcr5_sel,
0446                                 dcr6_sel,
0447                                 dcr7_sel;       // DCR selects
0448 wire                            dwcr0_sel,
0449                                 dwcr1_sel;      // DWCR selects
0450 reg                             dbg_bp_r;
0451 reg                             ex_freeze_q;
0452 `ifdef OR1200_DU_HWBKPTS
0453 reg     [31:0]                  match_cond0_ct;
0454 reg     [31:0]                  match_cond1_ct;
0455 reg     [31:0]                  match_cond2_ct;
0456 reg     [31:0]                  match_cond3_ct;
0457 reg     [31:0]                  match_cond4_ct;
0458 reg     [31:0]                  match_cond5_ct;
0459 reg     [31:0]                  match_cond6_ct;
0460 reg     [31:0]                  match_cond7_ct;
0461 reg                             match_cond0_stb;
0462 reg                             match_cond1_stb;
0463 reg                             match_cond2_stb;
0464 reg                             match_cond3_stb;
0465 reg                             match_cond4_stb;
0466 reg                             match_cond5_stb;
0467 reg                             match_cond6_stb;
0468 reg                             match_cond7_stb;
0469 reg                             match0;
0470 reg                             match1;
0471 reg                             match2;
0472 reg                             match3;
0473 reg                             match4;
0474 reg                             match5;
0475 reg                             match6;
0476 reg                             match7;
0477 reg                             wpcntr0_match;
0478 reg                             wpcntr1_match;
0479 reg                             incr_wpcntr0;
0480 reg                             incr_wpcntr1;
0481 reg     [10:0]                  wp;
0482 `endif
0483 wire                            du_hwbkpt;
0484 reg                             du_hwbkpt_hold;
0485 `ifdef OR1200_DU_READREGS
0486 reg     [31:0]                  spr_dat_o;
0487 `endif
0488 reg     [13:0]                  except_stop;    // Exceptions that stop because of DSR
0489 `ifdef OR1200_DU_TB_IMPLEMENTED
0490 wire                            tb_enw;
0491 reg     [7:0]                   tb_wadr;
0492 reg [31:0]                      tb_timstmp;
0493 `endif
0494 wire    [31:0]                  tbia_dat_o;
0495 wire    [31:0]                  tbim_dat_o;
0496 wire    [31:0]                  tbar_dat_o;
0497 wire    [31:0]                  tbts_dat_o;
0498 
0499 //
0500 // DU registers address decoder
0501 //
0502 `ifdef OR1200_DU_DMR1
0503 assign dmr1_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DMR1));
0504 `endif
0505 `ifdef OR1200_DU_DMR2
0506 assign dmr2_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DMR2));
0507 `endif
0508 `ifdef OR1200_DU_DSR
0509 assign dsr_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DSR));
0510 `endif
0511 `ifdef OR1200_DU_DRR
0512 assign drr_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DRR));
0513 `endif
0514 `ifdef OR1200_DU_DVR0
0515 assign dvr0_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DVR0));
0516 `endif
0517 `ifdef OR1200_DU_DVR1
0518 assign dvr1_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DVR1));
0519 `endif
0520 `ifdef OR1200_DU_DVR2
0521 assign dvr2_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DVR2));
0522 `endif
0523 `ifdef OR1200_DU_DVR3
0524 assign dvr3_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DVR3));
0525 `endif
0526 `ifdef OR1200_DU_DVR4
0527 assign dvr4_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DVR4));
0528 `endif
0529 `ifdef OR1200_DU_DVR5
0530 assign dvr5_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DVR5));
0531 `endif
0532 `ifdef OR1200_DU_DVR6
0533 assign dvr6_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DVR6));
0534 `endif
0535 `ifdef OR1200_DU_DVR7
0536 assign dvr7_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DVR7));
0537 `endif
0538 `ifdef OR1200_DU_DCR0
0539 assign dcr0_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DCR0));
0540 `endif
0541 `ifdef OR1200_DU_DCR1
0542 assign dcr1_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DCR1));
0543 `endif
0544 `ifdef OR1200_DU_DCR2
0545 assign dcr2_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DCR2));
0546 `endif
0547 `ifdef OR1200_DU_DCR3
0548 assign dcr3_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DCR3));
0549 `endif
0550 `ifdef OR1200_DU_DCR4
0551 assign dcr4_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DCR4));
0552 `endif
0553 `ifdef OR1200_DU_DCR5
0554 assign dcr5_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DCR5));
0555 `endif
0556 `ifdef OR1200_DU_DCR6
0557 assign dcr6_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DCR6));
0558 `endif
0559 `ifdef OR1200_DU_DCR7
0560 assign dcr7_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DCR7));
0561 `endif
0562 `ifdef OR1200_DU_DWCR0
0563 assign dwcr0_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DWCR0));
0564 `endif
0565 `ifdef OR1200_DU_DWCR1
0566 assign dwcr1_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_DWCR1));
0567 `endif
0568 
0569 // Track previous ex_freeze to detect when signals are updated
0570 always @(posedge clk)
0571   ex_freeze_q <= ex_freeze;
0572 
0573 //
0574 // Decode started exception
0575 //
0576 // du_except_stop comes from or1200_except
0577 //   
0578 always @(du_except_stop or ex_freeze_q) begin
0579         except_stop = 14'b00_0000_0000_0000;
0580         casez (du_except_stop)
0581                 14'b1?_????_????_????:
0582                         except_stop[`OR1200_DU_DRR_TTE] = 1'b1;
0583                 14'b01_????_????_????: begin
0584                         except_stop[`OR1200_DU_DRR_IE] = 1'b1;
0585                 end
0586                 14'b00_1???_????_????: begin
0587                         except_stop[`OR1200_DU_DRR_IME] = 1'b1;
0588                 end
0589                 14'b00_01??_????_????:
0590                         except_stop[`OR1200_DU_DRR_IPFE] = 1'b1;
0591                 14'b00_001?_????_????: begin
0592                         except_stop[`OR1200_DU_DRR_BUSEE] = 1'b1;
0593                 end
0594                 14'b00_0001_????_????:
0595                         except_stop[`OR1200_DU_DRR_IIE] = 1'b1;
0596                 14'b00_0000_1???_????: begin
0597                         except_stop[`OR1200_DU_DRR_AE] = 1'b1;
0598                 end
0599                 14'b00_0000_01??_????: begin
0600                         except_stop[`OR1200_DU_DRR_DME] = 1'b1;
0601                 end
0602                 14'b00_0000_001?_????:
0603                         except_stop[`OR1200_DU_DRR_DPFE] = 1'b1;
0604                 14'b00_0000_0001_????:
0605                         except_stop[`OR1200_DU_DRR_BUSEE] = 1'b1;
0606                 14'b00_0000_0000_1???: begin
0607                         except_stop[`OR1200_DU_DRR_RE] = 1'b1;
0608                 end
0609                 14'b00_0000_0000_01??: begin
0610                         except_stop[`OR1200_DU_DRR_TE] = 1'b1 & ~ex_freeze_q;
0611                 end
0612                 14'b00_0000_0000_001?: begin
0613                         except_stop[`OR1200_DU_DRR_FPE] = 1'b1;
0614                 end       
0615                 14'b00_0000_0000_0001:
0616                         except_stop[`OR1200_DU_DRR_SCE] = 1'b1 & ~ex_freeze_q;
0617                 default:
0618                         except_stop = 14'b00_0000_0000_0000;
0619         endcase // casez (du_except_stop)
0620 end
0621 
0622 //
0623 // dbg_bp_o is registered
0624 //
0625 assign dbg_bp_o = dbg_bp_r;
0626 
0627 //
0628 // Breakpoint activation register
0629 //
0630 always @(posedge clk or `OR1200_RST_EVENT rst)
0631         if (rst == `OR1200_RST_VALUE)
0632                 dbg_bp_r <=  1'b0;
0633         else if (!ex_freeze)
0634                 dbg_bp_r <=  |except_stop
0635 `ifdef OR1200_DU_DMR1_ST
0636                         | ~((ex_insn[31:26] == `OR1200_OR32_NOP) & ex_insn[16]) & dmr1[`OR1200_DU_DMR1_ST]
0637 `endif
0638 `ifdef OR1200_DU_DMR1_BT
0639                         | (branch_op != `OR1200_BRANCHOP_NOP) & (branch_op != `OR1200_BRANCHOP_RFE) & dmr1[`OR1200_DU_DMR1_BT]
0640 `endif
0641                         ;
0642         else
0643                 dbg_bp_r <=  |except_stop;
0644 
0645 //
0646 // Write to DMR1
0647 //
0648 `ifdef OR1200_DU_DMR1
0649 always @(posedge clk or `OR1200_RST_EVENT rst)
0650         if (rst == `OR1200_RST_VALUE)
0651                 dmr1 <= 25'h000_0000;
0652         else if (dmr1_sel && spr_write)
0653 `ifdef OR1200_DU_HWBKPTS
0654                 dmr1 <=  spr_dat_i[24:0];
0655 `else
0656                 dmr1 <=  {1'b0, spr_dat_i[23:22], 22'h00_0000};
0657 `endif
0658 `else
0659 assign dmr1 = 25'h000_0000;
0660 `endif
0661 
0662 //
0663 // Write to DMR2
0664 //
0665 `ifdef OR1200_DU_DMR2
0666 always @(posedge clk or `OR1200_RST_EVENT rst)
0667         if (rst == `OR1200_RST_VALUE)
0668                 dmr2 <= 24'h00_0000;
0669         else if (dmr2_sel && spr_write)
0670                 dmr2 <=  spr_dat_i[23:0];
0671 `else
0672 assign dmr2 = 24'h00_0000;
0673 `endif
0674 
0675 //
0676 // Write to DSR
0677 //
0678 `ifdef OR1200_DU_DSR
0679 always @(posedge clk or `OR1200_RST_EVENT rst)
0680         if (rst == `OR1200_RST_VALUE)
0681                 dsr <= {`OR1200_DU_DSR_WIDTH{1'b0}};
0682         else if (dsr_sel && spr_write)
0683                 dsr <=  spr_dat_i[`OR1200_DU_DSR_WIDTH-1:0];
0684 `else
0685 assign dsr = {`OR1200_DU_DSR_WIDTH{1'b0}};
0686 `endif
0687 
0688 //
0689 // Write to DRR
0690 //
0691 `ifdef OR1200_DU_DRR
0692 always @(posedge clk or `OR1200_RST_EVENT rst)
0693         if (rst == `OR1200_RST_VALUE)
0694                 drr <= 14'b0;
0695         else if (drr_sel && spr_write)
0696                 drr <=  spr_dat_i[13:0];
0697         else
0698                 drr <=  drr | except_stop;
0699 `else
0700 assign drr = 14'b0;
0701 `endif
0702 
0703 //
0704 // Write to DVR0
0705 //
0706 `ifdef OR1200_DU_DVR0
0707 always @(posedge clk or `OR1200_RST_EVENT rst)
0708         if (rst == `OR1200_RST_VALUE)
0709                 dvr0 <= 32'h0000_0000;
0710         else if (dvr0_sel && spr_write)
0711                 dvr0 <=  spr_dat_i[31:0];
0712 `else
0713 assign dvr0 = 32'h0000_0000;
0714 `endif
0715 
0716 //
0717 // Write to DVR1
0718 //
0719 `ifdef OR1200_DU_DVR1
0720 always @(posedge clk or `OR1200_RST_EVENT rst)
0721         if (rst == `OR1200_RST_VALUE)
0722                 dvr1 <= 32'h0000_0000;
0723         else if (dvr1_sel && spr_write)
0724                 dvr1 <=  spr_dat_i[31:0];
0725 `else
0726 assign dvr1 = 32'h0000_0000;
0727 `endif
0728 
0729 //
0730 // Write to DVR2
0731 //
0732 `ifdef OR1200_DU_DVR2
0733 always @(posedge clk or `OR1200_RST_EVENT rst)
0734         if (rst == `OR1200_RST_VALUE)
0735                 dvr2 <= 32'h0000_0000;
0736         else if (dvr2_sel && spr_write)
0737                 dvr2 <=  spr_dat_i[31:0];
0738 `else
0739 assign dvr2 = 32'h0000_0000;
0740 `endif
0741 
0742 //
0743 // Write to DVR3
0744 //
0745 `ifdef OR1200_DU_DVR3
0746 always @(posedge clk or `OR1200_RST_EVENT rst)
0747         if (rst == `OR1200_RST_VALUE)
0748                 dvr3 <= 32'h0000_0000;
0749         else if (dvr3_sel && spr_write)
0750                 dvr3 <=  spr_dat_i[31:0];
0751 `else
0752 assign dvr3 = 32'h0000_0000;
0753 `endif
0754 
0755 //
0756 // Write to DVR4
0757 //
0758 `ifdef OR1200_DU_DVR4
0759 always @(posedge clk or `OR1200_RST_EVENT rst)
0760         if (rst == `OR1200_RST_VALUE)
0761                 dvr4 <= 32'h0000_0000;
0762         else if (dvr4_sel && spr_write)
0763                 dvr4 <=  spr_dat_i[31:0];
0764 `else
0765 assign dvr4 = 32'h0000_0000;
0766 `endif
0767 
0768 //
0769 // Write to DVR5
0770 //
0771 `ifdef OR1200_DU_DVR5
0772 always @(posedge clk or `OR1200_RST_EVENT rst)
0773         if (rst == `OR1200_RST_VALUE)
0774                 dvr5 <= 32'h0000_0000;
0775         else if (dvr5_sel && spr_write)
0776                 dvr5 <=  spr_dat_i[31:0];
0777 `else
0778 assign dvr5 = 32'h0000_0000;
0779 `endif
0780 
0781 //
0782 // Write to DVR6
0783 //
0784 `ifdef OR1200_DU_DVR6
0785 always @(posedge clk or `OR1200_RST_EVENT rst)
0786         if (rst == `OR1200_RST_VALUE)
0787                 dvr6 <= 32'h0000_0000;
0788         else if (dvr6_sel && spr_write)
0789                 dvr6 <=  spr_dat_i[31:0];
0790 `else
0791 assign dvr6 = 32'h0000_0000;
0792 `endif
0793 
0794 //
0795 // Write to DVR7
0796 //
0797 `ifdef OR1200_DU_DVR7
0798 always @(posedge clk or `OR1200_RST_EVENT rst)
0799         if (rst == `OR1200_RST_VALUE)
0800                 dvr7 <= 32'h0000_0000;
0801         else if (dvr7_sel && spr_write)
0802                 dvr7 <=  spr_dat_i[31:0];
0803 `else
0804 assign dvr7 = 32'h0000_0000;
0805 `endif
0806 
0807 //
0808 // Write to DCR0
0809 //
0810 `ifdef OR1200_DU_DCR0
0811 always @(posedge clk or `OR1200_RST_EVENT rst)
0812         if (rst == `OR1200_RST_VALUE)
0813                 dcr0 <= 8'h00;
0814         else if (dcr0_sel && spr_write)
0815                 dcr0 <=  spr_dat_i[7:0];
0816 `else
0817 assign dcr0 = 8'h00;
0818 `endif
0819 
0820 //
0821 // Write to DCR1
0822 //
0823 `ifdef OR1200_DU_DCR1
0824 always @(posedge clk or `OR1200_RST_EVENT rst)
0825         if (rst == `OR1200_RST_VALUE)
0826                 dcr1 <= 8'h00;
0827         else if (dcr1_sel && spr_write)
0828                 dcr1 <=  spr_dat_i[7:0];
0829 `else
0830 assign dcr1 = 8'h00;
0831 `endif
0832 
0833 //
0834 // Write to DCR2
0835 //
0836 `ifdef OR1200_DU_DCR2
0837 always @(posedge clk or `OR1200_RST_EVENT rst)
0838         if (rst == `OR1200_RST_VALUE)
0839                 dcr2 <= 8'h00;
0840         else if (dcr2_sel && spr_write)
0841                 dcr2 <=  spr_dat_i[7:0];
0842 `else
0843 assign dcr2 = 8'h00;
0844 `endif
0845 
0846 //
0847 // Write to DCR3
0848 //
0849 `ifdef OR1200_DU_DCR3
0850 always @(posedge clk or `OR1200_RST_EVENT rst)
0851         if (rst == `OR1200_RST_VALUE)
0852                 dcr3 <= 8'h00;
0853         else if (dcr3_sel && spr_write)
0854                 dcr3 <=  spr_dat_i[7:0];
0855 `else
0856 assign dcr3 = 8'h00;
0857 `endif
0858 
0859 //
0860 // Write to DCR4
0861 //
0862 `ifdef OR1200_DU_DCR4
0863 always @(posedge clk or `OR1200_RST_EVENT rst)
0864         if (rst == `OR1200_RST_VALUE)
0865                 dcr4 <= 8'h00;
0866         else if (dcr4_sel && spr_write)
0867                 dcr4 <=  spr_dat_i[7:0];
0868 `else
0869 assign dcr4 = 8'h00;
0870 `endif
0871 
0872 //
0873 // Write to DCR5
0874 //
0875 `ifdef OR1200_DU_DCR5
0876 always @(posedge clk or `OR1200_RST_EVENT rst)
0877         if (rst == `OR1200_RST_VALUE)
0878                 dcr5 <= 8'h00;
0879         else if (dcr5_sel && spr_write)
0880                 dcr5 <=  spr_dat_i[7:0];
0881 `else
0882 assign dcr5 = 8'h00;
0883 `endif
0884 
0885 //
0886 // Write to DCR6
0887 //
0888 `ifdef OR1200_DU_DCR6
0889 always @(posedge clk or `OR1200_RST_EVENT rst)
0890         if (rst == `OR1200_RST_VALUE)
0891                 dcr6 <= 8'h00;
0892         else if (dcr6_sel && spr_write)
0893                 dcr6 <=  spr_dat_i[7:0];
0894 `else
0895 assign dcr6 = 8'h00;
0896 `endif
0897 
0898 //
0899 // Write to DCR7
0900 //
0901 `ifdef OR1200_DU_DCR7
0902 always @(posedge clk or `OR1200_RST_EVENT rst)
0903         if (rst == `OR1200_RST_VALUE)
0904                 dcr7 <= 8'h00;
0905         else if (dcr7_sel && spr_write)
0906                 dcr7 <=  spr_dat_i[7:0];
0907 `else
0908 assign dcr7 = 8'h00;
0909 `endif
0910 
0911 //
0912 // Write to DWCR0
0913 //
0914 `ifdef OR1200_DU_DWCR0
0915 always @(posedge clk or `OR1200_RST_EVENT rst)
0916         if (rst == `OR1200_RST_VALUE)
0917                 dwcr0 <= 32'h0000_0000;
0918         else if (dwcr0_sel && spr_write)
0919                 dwcr0 <=  spr_dat_i[31:0];
0920         else if (incr_wpcntr0)
0921                 dwcr0[`OR1200_DU_DWCR_COUNT] <=  dwcr0[`OR1200_DU_DWCR_COUNT] + 16'h0001;
0922 `else
0923 assign dwcr0 = 32'h0000_0000;
0924 `endif
0925 
0926 //
0927 // Write to DWCR1
0928 //
0929 `ifdef OR1200_DU_DWCR1
0930 always @(posedge clk or `OR1200_RST_EVENT rst)
0931         if (rst == `OR1200_RST_VALUE)
0932                 dwcr1 <= 32'h0000_0000;
0933         else if (dwcr1_sel && spr_write)
0934                 dwcr1 <=  spr_dat_i[31:0];
0935         else if (incr_wpcntr1)
0936                 dwcr1[`OR1200_DU_DWCR_COUNT] <=  dwcr1[`OR1200_DU_DWCR_COUNT] + 16'h0001;
0937 `else
0938 assign dwcr1 = 32'h0000_0000;
0939 `endif
0940 
0941 //
0942 // Read DU registers
0943 //
0944 `ifdef OR1200_DU_READREGS
0945 always @(spr_addr or dsr or drr or dmr1 or dmr2
0946         or dvr0 or dvr1 or dvr2 or dvr3 or dvr4
0947         or dvr5 or dvr6 or dvr7
0948         or dcr0 or dcr1 or dcr2 or dcr3 or dcr4
0949         or dcr5 or dcr6 or dcr7
0950         or dwcr0 or dwcr1
0951 `ifdef OR1200_DU_TB_IMPLEMENTED
0952         or tb_wadr or tbia_dat_o or tbim_dat_o
0953         or tbar_dat_o or tbts_dat_o
0954 `endif
0955         )
0956         casez (spr_addr[`OR1200_DUOFS_BITS]) // synopsys parallel_case
0957 `ifdef OR1200_DU_DVR0
0958                 `OR1200_DU_DVR0:
0959                         spr_dat_o = dvr0;
0960 `endif
0961 `ifdef OR1200_DU_DVR1
0962                 `OR1200_DU_DVR1:
0963                         spr_dat_o = dvr1;
0964 `endif
0965 `ifdef OR1200_DU_DVR2
0966                 `OR1200_DU_DVR2:
0967                         spr_dat_o = dvr2;
0968 `endif
0969 `ifdef OR1200_DU_DVR3
0970                 `OR1200_DU_DVR3:
0971                         spr_dat_o = dvr3;
0972 `endif
0973 `ifdef OR1200_DU_DVR4
0974                 `OR1200_DU_DVR4:
0975                         spr_dat_o = dvr4;
0976 `endif
0977 `ifdef OR1200_DU_DVR5
0978                 `OR1200_DU_DVR5:
0979                         spr_dat_o = dvr5;
0980 `endif
0981 `ifdef OR1200_DU_DVR6
0982                 `OR1200_DU_DVR6:
0983                         spr_dat_o = dvr6;
0984 `endif
0985 `ifdef OR1200_DU_DVR7
0986                 `OR1200_DU_DVR7:
0987                         spr_dat_o = dvr7;
0988 `endif
0989 `ifdef OR1200_DU_DCR0
0990                 `OR1200_DU_DCR0:
0991                         spr_dat_o = {24'h00_0000, dcr0};
0992 `endif
0993 `ifdef OR1200_DU_DCR1
0994                 `OR1200_DU_DCR1:
0995                         spr_dat_o = {24'h00_0000, dcr1};
0996 `endif
0997 `ifdef OR1200_DU_DCR2
0998                 `OR1200_DU_DCR2:
0999                         spr_dat_o = {24'h00_0000, dcr2};
1000 `endif
1001 `ifdef OR1200_DU_DCR3
1002                 `OR1200_DU_DCR3:
1003                         spr_dat_o = {24'h00_0000, dcr3};
1004 `endif
1005 `ifdef OR1200_DU_DCR4
1006                 `OR1200_DU_DCR4:
1007                         spr_dat_o = {24'h00_0000, dcr4};
1008 `endif
1009 `ifdef OR1200_DU_DCR5
1010                 `OR1200_DU_DCR5:
1011                         spr_dat_o = {24'h00_0000, dcr5};
1012 `endif
1013 `ifdef OR1200_DU_DCR6
1014                 `OR1200_DU_DCR6:
1015                         spr_dat_o = {24'h00_0000, dcr6};
1016 `endif
1017 `ifdef OR1200_DU_DCR7
1018                 `OR1200_DU_DCR7:
1019                         spr_dat_o = {24'h00_0000, dcr7};
1020 `endif
1021 `ifdef OR1200_DU_DMR1
1022                 `OR1200_DU_DMR1:
1023                         spr_dat_o = {7'h00, dmr1};
1024 `endif
1025 `ifdef OR1200_DU_DMR2
1026                 `OR1200_DU_DMR2:
1027                         spr_dat_o = {8'h00, dmr2};
1028 `endif
1029 `ifdef OR1200_DU_DWCR0
1030                 `OR1200_DU_DWCR0:
1031                         spr_dat_o = dwcr0;
1032 `endif
1033 `ifdef OR1200_DU_DWCR1
1034                 `OR1200_DU_DWCR1:
1035                         spr_dat_o = dwcr1;
1036 `endif
1037 `ifdef OR1200_DU_DSR
1038                 `OR1200_DU_DSR:
1039                         spr_dat_o = {18'b0, dsr};
1040 `endif
1041 `ifdef OR1200_DU_DRR
1042                 `OR1200_DU_DRR:
1043                         spr_dat_o = {18'b0, drr};
1044 `endif
1045 `ifdef OR1200_DU_TB_IMPLEMENTED
1046                 `OR1200_DU_TBADR:
1047                         spr_dat_o = {24'h000000, tb_wadr};
1048                 `OR1200_DU_TBIA:
1049                         spr_dat_o = tbia_dat_o;
1050                 `OR1200_DU_TBIM:
1051                         spr_dat_o = tbim_dat_o;
1052                 `OR1200_DU_TBAR:
1053                         spr_dat_o = tbar_dat_o;
1054                 `OR1200_DU_TBTS:
1055                         spr_dat_o = tbts_dat_o;
1056 `endif
1057                 default:
1058                         spr_dat_o = 32'h0000_0000;
1059         endcase
1060 `endif
1061 
1062 //
1063 // DSR alias
1064 //
1065 assign du_dsr = dsr;
1066 
1067 `ifdef OR1200_DU_HWBKPTS
1068 
1069 //
1070 // Compare To What (Match Condition 0)
1071 //
1072 always @(dcr0 or id_pc or dcpu_adr_i or dcpu_dat_dc
1073         or dcpu_dat_lsu or dcpu_we_i)
1074         case (dcr0[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1075                 3'b001: match_cond0_ct = id_pc;         // insn fetch EA
1076                 3'b010: match_cond0_ct = dcpu_adr_i;    // load EA
1077                 3'b011: match_cond0_ct = dcpu_adr_i;    // store EA
1078                 3'b100: match_cond0_ct = dcpu_dat_dc;   // load data
1079                 3'b101: match_cond0_ct = dcpu_dat_lsu;  // store data
1080                 3'b110: match_cond0_ct = dcpu_adr_i;    // load/store EA
1081                 default:match_cond0_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1082         endcase
1083 
1084 //
1085 // When To Compare (Match Condition 0)
1086 //
1087 always @(dcr0 or dcpu_cycstb_i)
1088         case (dcr0[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1089                 3'b000: match_cond0_stb = 1'b0;         //comparison disabled
1090                 3'b001: match_cond0_stb = 1'b1;         // insn fetch EA
1091                 default:match_cond0_stb = dcpu_cycstb_i; // any load/store
1092         endcase
1093 
1094 //
1095 // Match Condition 0
1096 //
1097 always @(match_cond0_stb or dcr0 or dvr0 or match_cond0_ct)
1098         casex ({match_cond0_stb, dcr0[`OR1200_DU_DCR_CC]})
1099                 4'b0_xxx,
1100                 4'b1_000,
1101                 4'b1_111: match0 = 1'b0;
1102                 4'b1_001: match0 =
1103                         ({(match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]), match_cond0_ct[30:0]} ==
1104                          {(dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]), dvr0[30:0]});
1105                 4'b1_010: match0 = 
1106                         ({(match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]), match_cond0_ct[30:0]} <
1107                          {(dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]), dvr0[30:0]});
1108                 4'b1_011: match0 = 
1109                         ({(match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]), match_cond0_ct[30:0]} <=
1110                          {(dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]), dvr0[30:0]});
1111                 4'b1_100: match0 = 
1112                         ({(match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]), match_cond0_ct[30:0]} >
1113                          {(dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]), dvr0[30:0]});
1114                 4'b1_101: match0 = 
1115                         ({(match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]), match_cond0_ct[30:0]} >=
1116                          {(dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]), dvr0[30:0]});
1117                 4'b1_110: match0 = 
1118                         ({(match_cond0_ct[31] ^ dcr0[`OR1200_DU_DCR_SC]), match_cond0_ct[30:0]} !=
1119                          {(dvr0[31] ^ dcr0[`OR1200_DU_DCR_SC]), dvr0[30:0]});
1120         endcase
1121 
1122 //
1123 // Watchpoint 0
1124 //
1125 always @(dmr1 or match0)
1126         case (dmr1[`OR1200_DU_DMR1_CW0])
1127                 2'b00: wp[0] = match0;
1128                 2'b01: wp[0] = match0;
1129                 2'b10: wp[0] = match0;
1130                 2'b11: wp[0] = 1'b0;
1131         endcase
1132 
1133 //
1134 // Compare To What (Match Condition 1)
1135 //
1136 always @(dcr1 or id_pc or dcpu_adr_i or dcpu_dat_dc
1137         or dcpu_dat_lsu or dcpu_we_i)
1138         case (dcr1[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1139                 3'b001: match_cond1_ct = id_pc;         // insn fetch EA
1140                 3'b010: match_cond1_ct = dcpu_adr_i;    // load EA
1141                 3'b011: match_cond1_ct = dcpu_adr_i;    // store EA
1142                 3'b100: match_cond1_ct = dcpu_dat_dc;   // load data
1143                 3'b101: match_cond1_ct = dcpu_dat_lsu;  // store data
1144                 3'b110: match_cond1_ct = dcpu_adr_i;    // load/store EA
1145                 default:match_cond1_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1146         endcase
1147 
1148 //
1149 // When To Compare (Match Condition 1)
1150 //
1151 always @(dcr1 or dcpu_cycstb_i)
1152         case (dcr1[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1153                 3'b000: match_cond1_stb = 1'b0;         //comparison disabled
1154                 3'b001: match_cond1_stb = 1'b1;         // insn fetch EA
1155                 default:match_cond1_stb = dcpu_cycstb_i; // any load/store
1156         endcase
1157 
1158 //
1159 // Match Condition 1
1160 //
1161 always @(match_cond1_stb or dcr1 or dvr1 or match_cond1_ct)
1162         casex ({match_cond1_stb, dcr1[`OR1200_DU_DCR_CC]})
1163                 4'b0_xxx,
1164                 4'b1_000,
1165                 4'b1_111: match1 = 1'b0;
1166                 4'b1_001: match1 =
1167                         ({(match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]), match_cond1_ct[30:0]} ==
1168                          {(dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]), dvr1[30:0]});
1169                 4'b1_010: match1 = 
1170                         ({(match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]), match_cond1_ct[30:0]} <
1171                          {(dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]), dvr1[30:0]});
1172                 4'b1_011: match1 = 
1173                         ({(match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]), match_cond1_ct[30:0]} <=
1174                          {(dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]), dvr1[30:0]});
1175                 4'b1_100: match1 = 
1176                         ({(match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]), match_cond1_ct[30:0]} >
1177                          {(dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]), dvr1[30:0]});
1178                 4'b1_101: match1 = 
1179                         ({(match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]), match_cond1_ct[30:0]} >=
1180                          {(dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]), dvr1[30:0]});
1181                 4'b1_110: match1 = 
1182                         ({(match_cond1_ct[31] ^ dcr1[`OR1200_DU_DCR_SC]), match_cond1_ct[30:0]} !=
1183                          {(dvr1[31] ^ dcr1[`OR1200_DU_DCR_SC]), dvr1[30:0]});
1184         endcase
1185 
1186 //
1187 // Watchpoint 1
1188 //
1189 always @(dmr1 or match1 or wp)
1190         case (dmr1[`OR1200_DU_DMR1_CW1])
1191                 2'b00: wp[1] = match1;
1192                 2'b01: wp[1] = match1 & wp[0];
1193                 2'b10: wp[1] = match1 | wp[0];
1194                 2'b11: wp[1] = 1'b0;
1195         endcase
1196 
1197 //
1198 // Compare To What (Match Condition 2)
1199 //
1200 always @(dcr2 or id_pc or dcpu_adr_i or dcpu_dat_dc
1201         or dcpu_dat_lsu or dcpu_we_i)
1202         case (dcr2[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1203                 3'b001: match_cond2_ct = id_pc;         // insn fetch EA
1204                 3'b010: match_cond2_ct = dcpu_adr_i;    // load EA
1205                 3'b011: match_cond2_ct = dcpu_adr_i;    // store EA
1206                 3'b100: match_cond2_ct = dcpu_dat_dc;   // load data
1207                 3'b101: match_cond2_ct = dcpu_dat_lsu;  // store data
1208                 3'b110: match_cond2_ct = dcpu_adr_i;    // load/store EA
1209                 default:match_cond2_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1210         endcase
1211 
1212 //
1213 // When To Compare (Match Condition 2)
1214 //
1215 always @(dcr2 or dcpu_cycstb_i)
1216         case (dcr2[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1217                 3'b000: match_cond2_stb = 1'b0;         //comparison disabled
1218                 3'b001: match_cond2_stb = 1'b1;         // insn fetch EA
1219                 default:match_cond2_stb = dcpu_cycstb_i; // any load/store
1220         endcase
1221 
1222 //
1223 // Match Condition 2
1224 //
1225 always @(match_cond2_stb or dcr2 or dvr2 or match_cond2_ct)
1226         casex ({match_cond2_stb, dcr2[`OR1200_DU_DCR_CC]})
1227                 4'b0_xxx,
1228                 4'b1_000,
1229                 4'b1_111: match2 = 1'b0;
1230                 4'b1_001: match2 =
1231                         ({(match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]), match_cond2_ct[30:0]} ==
1232                          {(dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]), dvr2[30:0]});
1233                 4'b1_010: match2 = 
1234                         ({(match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]), match_cond2_ct[30:0]} <
1235                          {(dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]), dvr2[30:0]});
1236                 4'b1_011: match2 = 
1237                         ({(match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]), match_cond2_ct[30:0]} <=
1238                          {(dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]), dvr2[30:0]});
1239                 4'b1_100: match2 = 
1240                         ({(match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]), match_cond2_ct[30:0]} >
1241                          {(dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]), dvr2[30:0]});
1242                 4'b1_101: match2 = 
1243                         ({(match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]), match_cond2_ct[30:0]} >=
1244                          {(dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]), dvr2[30:0]});
1245                 4'b1_110: match2 = 
1246                         ({(match_cond2_ct[31] ^ dcr2[`OR1200_DU_DCR_SC]), match_cond2_ct[30:0]} !=
1247                          {(dvr2[31] ^ dcr2[`OR1200_DU_DCR_SC]), dvr2[30:0]});
1248         endcase
1249 
1250 //
1251 // Watchpoint 2
1252 //
1253 always @(dmr1 or match2 or wp)
1254         case (dmr1[`OR1200_DU_DMR1_CW2])
1255                 2'b00: wp[2] = match2;
1256                 2'b01: wp[2] = match2 & wp[1];
1257                 2'b10: wp[2] = match2 | wp[1];
1258                 2'b11: wp[2] = 1'b0;
1259         endcase
1260 
1261 //
1262 // Compare To What (Match Condition 3)
1263 //
1264 always @(dcr3 or id_pc or dcpu_adr_i or dcpu_dat_dc
1265         or dcpu_dat_lsu or dcpu_we_i)
1266         case (dcr3[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1267                 3'b001: match_cond3_ct = id_pc;         // insn fetch EA
1268                 3'b010: match_cond3_ct = dcpu_adr_i;    // load EA
1269                 3'b011: match_cond3_ct = dcpu_adr_i;    // store EA
1270                 3'b100: match_cond3_ct = dcpu_dat_dc;   // load data
1271                 3'b101: match_cond3_ct = dcpu_dat_lsu;  // store data
1272                 3'b110: match_cond3_ct = dcpu_adr_i;    // load/store EA
1273                 default:match_cond3_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1274         endcase
1275 
1276 //
1277 // When To Compare (Match Condition 3)
1278 //
1279 always @(dcr3 or dcpu_cycstb_i)
1280         case (dcr3[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1281                 3'b000: match_cond3_stb = 1'b0;         //comparison disabled
1282                 3'b001: match_cond3_stb = 1'b1;         // insn fetch EA
1283                 default:match_cond3_stb = dcpu_cycstb_i; // any load/store
1284         endcase
1285 
1286 //
1287 // Match Condition 3
1288 //
1289 always @(match_cond3_stb or dcr3 or dvr3 or match_cond3_ct)
1290         casex ({match_cond3_stb, dcr3[`OR1200_DU_DCR_CC]})
1291                 4'b0_xxx,
1292                 4'b1_000,
1293                 4'b1_111: match3 = 1'b0;
1294                 4'b1_001: match3 =
1295                         ({(match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]), match_cond3_ct[30:0]} ==
1296                          {(dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]), dvr3[30:0]});
1297                 4'b1_010: match3 = 
1298                         ({(match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]), match_cond3_ct[30:0]} <
1299                          {(dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]), dvr3[30:0]});
1300                 4'b1_011: match3 = 
1301                         ({(match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]), match_cond3_ct[30:0]} <=
1302                          {(dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]), dvr3[30:0]});
1303                 4'b1_100: match3 = 
1304                         ({(match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]), match_cond3_ct[30:0]} >
1305                          {(dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]), dvr3[30:0]});
1306                 4'b1_101: match3 = 
1307                         ({(match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]), match_cond3_ct[30:0]} >=
1308                          {(dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]), dvr3[30:0]});
1309                 4'b1_110: match3 = 
1310                         ({(match_cond3_ct[31] ^ dcr3[`OR1200_DU_DCR_SC]), match_cond3_ct[30:0]} !=
1311                          {(dvr3[31] ^ dcr3[`OR1200_DU_DCR_SC]), dvr3[30:0]});
1312         endcase
1313 
1314 //
1315 // Watchpoint 3
1316 //
1317 always @(dmr1 or match3 or wp)
1318         case (dmr1[`OR1200_DU_DMR1_CW3])
1319                 2'b00: wp[3] = match3;
1320                 2'b01: wp[3] = match3 & wp[2];
1321                 2'b10: wp[3] = match3 | wp[2];
1322                 2'b11: wp[3] = 1'b0;
1323         endcase
1324 
1325 //
1326 // Compare To What (Match Condition 4)
1327 //
1328 always @(dcr4 or id_pc or dcpu_adr_i or dcpu_dat_dc
1329         or dcpu_dat_lsu or dcpu_we_i)
1330         case (dcr4[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1331                 3'b001: match_cond4_ct = id_pc;         // insn fetch EA
1332                 3'b010: match_cond4_ct = dcpu_adr_i;    // load EA
1333                 3'b011: match_cond4_ct = dcpu_adr_i;    // store EA
1334                 3'b100: match_cond4_ct = dcpu_dat_dc;   // load data
1335                 3'b101: match_cond4_ct = dcpu_dat_lsu;  // store data
1336                 3'b110: match_cond4_ct = dcpu_adr_i;    // load/store EA
1337                 default:match_cond4_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1338         endcase
1339 
1340 //
1341 // When To Compare (Match Condition 4)
1342 //
1343 always @(dcr4 or dcpu_cycstb_i)
1344         case (dcr4[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1345                 3'b000: match_cond4_stb = 1'b0;         //comparison disabled
1346                 3'b001: match_cond4_stb = 1'b1;         // insn fetch EA
1347                 default:match_cond4_stb = dcpu_cycstb_i; // any load/store
1348         endcase
1349 
1350 //
1351 // Match Condition 4
1352 //
1353 always @(match_cond4_stb or dcr4 or dvr4 or match_cond4_ct)
1354         casex ({match_cond4_stb, dcr4[`OR1200_DU_DCR_CC]})
1355                 4'b0_xxx,
1356                 4'b1_000,
1357                 4'b1_111: match4 = 1'b0;
1358                 4'b1_001: match4 =
1359                         ({(match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]), match_cond4_ct[30:0]} ==
1360                          {(dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]), dvr4[30:0]});
1361                 4'b1_010: match4 = 
1362                         ({(match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]), match_cond4_ct[30:0]} <
1363                          {(dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]), dvr4[30:0]});
1364                 4'b1_011: match4 = 
1365                         ({(match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]), match_cond4_ct[30:0]} <=
1366                          {(dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]), dvr4[30:0]});
1367                 4'b1_100: match4 = 
1368                         ({(match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]), match_cond4_ct[30:0]} >
1369                          {(dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]), dvr4[30:0]});
1370                 4'b1_101: match4 = 
1371                         ({(match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]), match_cond4_ct[30:0]} >=
1372                          {(dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]), dvr4[30:0]});
1373                 4'b1_110: match4 = 
1374                         ({(match_cond4_ct[31] ^ dcr4[`OR1200_DU_DCR_SC]), match_cond4_ct[30:0]} !=
1375                          {(dvr4[31] ^ dcr4[`OR1200_DU_DCR_SC]), dvr4[30:0]});
1376         endcase
1377 
1378 //
1379 // Watchpoint 4
1380 //
1381 always @(dmr1 or match4 or wp)
1382         case (dmr1[`OR1200_DU_DMR1_CW4])
1383                 2'b00: wp[4] = match4;
1384                 2'b01: wp[4] = match4 & wp[3];
1385                 2'b10: wp[4] = match4 | wp[3];
1386                 2'b11: wp[4] = 1'b0;
1387         endcase
1388 
1389 //
1390 // Compare To What (Match Condition 5)
1391 //
1392 always @(dcr5 or id_pc or dcpu_adr_i or dcpu_dat_dc
1393         or dcpu_dat_lsu or dcpu_we_i)
1394         case (dcr5[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1395                 3'b001: match_cond5_ct = id_pc;         // insn fetch EA
1396                 3'b010: match_cond5_ct = dcpu_adr_i;    // load EA
1397                 3'b011: match_cond5_ct = dcpu_adr_i;    // store EA
1398                 3'b100: match_cond5_ct = dcpu_dat_dc;   // load data
1399                 3'b101: match_cond5_ct = dcpu_dat_lsu;  // store data
1400                 3'b110: match_cond5_ct = dcpu_adr_i;    // load/store EA
1401                 default:match_cond5_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1402         endcase
1403 
1404 //
1405 // When To Compare (Match Condition 5)
1406 //
1407 always @(dcr5 or dcpu_cycstb_i)
1408         case (dcr5[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1409                 3'b000: match_cond5_stb = 1'b0;         //comparison disabled
1410                 3'b001: match_cond5_stb = 1'b1;         // insn fetch EA
1411                 default:match_cond5_stb = dcpu_cycstb_i; // any load/store
1412         endcase
1413 
1414 //
1415 // Match Condition 5
1416 //
1417 always @(match_cond5_stb or dcr5 or dvr5 or match_cond5_ct)
1418         casex ({match_cond5_stb, dcr5[`OR1200_DU_DCR_CC]})
1419                 4'b0_xxx,
1420                 4'b1_000,
1421                 4'b1_111: match5 = 1'b0;
1422                 4'b1_001: match5 =
1423                         ({(match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]), match_cond5_ct[30:0]} ==
1424                          {(dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]), dvr5[30:0]});
1425                 4'b1_010: match5 = 
1426                         ({(match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]), match_cond5_ct[30:0]} <
1427                          {(dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]), dvr5[30:0]});
1428                 4'b1_011: match5 = 
1429                         ({(match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]), match_cond5_ct[30:0]} <=
1430                          {(dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]), dvr5[30:0]});
1431                 4'b1_100: match5 = 
1432                         ({(match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]), match_cond5_ct[30:0]} >
1433                          {(dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]), dvr5[30:0]});
1434                 4'b1_101: match5 = 
1435                         ({(match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]), match_cond5_ct[30:0]} >=
1436                          {(dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]), dvr5[30:0]});
1437                 4'b1_110: match5 = 
1438                         ({(match_cond5_ct[31] ^ dcr5[`OR1200_DU_DCR_SC]), match_cond5_ct[30:0]} !=
1439                          {(dvr5[31] ^ dcr5[`OR1200_DU_DCR_SC]), dvr5[30:0]});
1440         endcase
1441 
1442 //
1443 // Watchpoint 5
1444 //
1445 always @(dmr1 or match5 or wp)
1446         case (dmr1[`OR1200_DU_DMR1_CW5])
1447                 2'b00: wp[5] = match5;
1448                 2'b01: wp[5] = match5 & wp[4];
1449                 2'b10: wp[5] = match5 | wp[4];
1450                 2'b11: wp[5] = 1'b0;
1451         endcase
1452 
1453 //
1454 // Compare To What (Match Condition 6)
1455 //
1456 always @(dcr6 or id_pc or dcpu_adr_i or dcpu_dat_dc
1457         or dcpu_dat_lsu or dcpu_we_i)
1458         case (dcr6[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1459                 3'b001: match_cond6_ct = id_pc;         // insn fetch EA
1460                 3'b010: match_cond6_ct = dcpu_adr_i;    // load EA
1461                 3'b011: match_cond6_ct = dcpu_adr_i;    // store EA
1462                 3'b100: match_cond6_ct = dcpu_dat_dc;   // load data
1463                 3'b101: match_cond6_ct = dcpu_dat_lsu;  // store data
1464                 3'b110: match_cond6_ct = dcpu_adr_i;    // load/store EA
1465                 default:match_cond6_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1466         endcase
1467 
1468 //
1469 // When To Compare (Match Condition 6)
1470 //
1471 always @(dcr6 or dcpu_cycstb_i)
1472         case (dcr6[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1473                 3'b000: match_cond6_stb = 1'b0;         //comparison disabled
1474                 3'b001: match_cond6_stb = 1'b1;         // insn fetch EA
1475                 default:match_cond6_stb = dcpu_cycstb_i; // any load/store
1476         endcase
1477 
1478 //
1479 // Match Condition 6
1480 //
1481 always @(match_cond6_stb or dcr6 or dvr6 or match_cond6_ct)
1482         casex ({match_cond6_stb, dcr6[`OR1200_DU_DCR_CC]})
1483                 4'b0_xxx,
1484                 4'b1_000,
1485                 4'b1_111: match6 = 1'b0;
1486                 4'b1_001: match6 =
1487                         ({(match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]), match_cond6_ct[30:0]} ==
1488                          {(dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]), dvr6[30:0]});
1489                 4'b1_010: match6 = 
1490                         ({(match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]), match_cond6_ct[30:0]} <
1491                          {(dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]), dvr6[30:0]});
1492                 4'b1_011: match6 = 
1493                         ({(match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]), match_cond6_ct[30:0]} <=
1494                          {(dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]), dvr6[30:0]});
1495                 4'b1_100: match6 = 
1496                         ({(match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]), match_cond6_ct[30:0]} >
1497                          {(dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]), dvr6[30:0]});
1498                 4'b1_101: match6 = 
1499                         ({(match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]), match_cond6_ct[30:0]} >=
1500                          {(dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]), dvr6[30:0]});
1501                 4'b1_110: match6 = 
1502                         ({(match_cond6_ct[31] ^ dcr6[`OR1200_DU_DCR_SC]), match_cond6_ct[30:0]} !=
1503                          {(dvr6[31] ^ dcr6[`OR1200_DU_DCR_SC]), dvr6[30:0]});
1504         endcase
1505 
1506 //
1507 // Watchpoint 6
1508 //
1509 always @(dmr1 or match6 or wp)
1510         case (dmr1[`OR1200_DU_DMR1_CW6])
1511                 2'b00: wp[6] = match6;
1512                 2'b01: wp[6] = match6 & wp[5];
1513                 2'b10: wp[6] = match6 | wp[5];
1514                 2'b11: wp[6] = 1'b0;
1515         endcase
1516 
1517 //
1518 // Compare To What (Match Condition 7)
1519 //
1520 always @(dcr7 or id_pc or dcpu_adr_i or dcpu_dat_dc
1521         or dcpu_dat_lsu or dcpu_we_i)
1522         case (dcr7[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1523                 3'b001: match_cond7_ct = id_pc;         // insn fetch EA
1524                 3'b010: match_cond7_ct = dcpu_adr_i;    // load EA
1525                 3'b011: match_cond7_ct = dcpu_adr_i;    // store EA
1526                 3'b100: match_cond7_ct = dcpu_dat_dc;   // load data
1527                 3'b101: match_cond7_ct = dcpu_dat_lsu;  // store data
1528                 3'b110: match_cond7_ct = dcpu_adr_i;    // load/store EA
1529                 default:match_cond7_ct = dcpu_we_i ? dcpu_dat_lsu : dcpu_dat_dc;
1530         endcase
1531 
1532 //
1533 // When To Compare (Match Condition 7)
1534 //
1535 always @(dcr7 or dcpu_cycstb_i)
1536         case (dcr7[`OR1200_DU_DCR_CT])          // synopsys parallel_case
1537                 3'b000: match_cond7_stb = 1'b0;         //comparison disabled
1538                 3'b001: match_cond7_stb = 1'b1;         // insn fetch EA
1539                 default:match_cond7_stb = dcpu_cycstb_i; // any load/store
1540         endcase
1541 
1542 //
1543 // Match Condition 7
1544 //
1545 always @(match_cond7_stb or dcr7 or dvr7 or match_cond7_ct)
1546         casex ({match_cond7_stb, dcr7[`OR1200_DU_DCR_CC]})
1547                 4'b0_xxx,
1548                 4'b1_000,
1549                 4'b1_111: match7 = 1'b0;
1550                 4'b1_001: match7 =
1551                         ({(match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]), match_cond7_ct[30:0]} ==
1552                          {(dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]), dvr7[30:0]});
1553                 4'b1_010: match7 = 
1554                         ({(match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]), match_cond7_ct[30:0]} <
1555                          {(dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]), dvr7[30:0]});
1556                 4'b1_011: match7 = 
1557                         ({(match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]), match_cond7_ct[30:0]} <=
1558                          {(dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]), dvr7[30:0]});
1559                 4'b1_100: match7 = 
1560                         ({(match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]), match_cond7_ct[30:0]} >
1561                          {(dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]), dvr7[30:0]});
1562                 4'b1_101: match7 = 
1563                         ({(match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]), match_cond7_ct[30:0]} >=
1564                          {(dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]), dvr7[30:0]});
1565                 4'b1_110: match7 = 
1566                         ({(match_cond7_ct[31] ^ dcr7[`OR1200_DU_DCR_SC]), match_cond7_ct[30:0]} !=
1567                          {(dvr7[31] ^ dcr7[`OR1200_DU_DCR_SC]), dvr7[30:0]});
1568         endcase
1569 
1570 //
1571 // Watchpoint 7
1572 //
1573 always @(dmr1 or match7 or wp)
1574         case (dmr1[`OR1200_DU_DMR1_CW7])
1575                 2'b00: wp[7] = match7;
1576                 2'b01: wp[7] = match7 & wp[6];
1577                 2'b10: wp[7] = match7 | wp[6];
1578                 2'b11: wp[7] = 1'b0;
1579         endcase
1580 
1581 //
1582 // Increment Watchpoint Counter 0
1583 //
1584 always @(wp or dmr2)
1585         if (dmr2[`OR1200_DU_DMR2_WCE0])
1586                 incr_wpcntr0 = |(wp & ~dmr2[`OR1200_DU_DMR2_AWTC]);
1587         else
1588                 incr_wpcntr0 = 1'b0;
1589 
1590 //
1591 // Match Condition Watchpoint Counter 0
1592 //
1593 always @(dwcr0)
1594         if (dwcr0[`OR1200_DU_DWCR_MATCH] == dwcr0[`OR1200_DU_DWCR_COUNT])
1595                 wpcntr0_match = 1'b1;
1596         else
1597                 wpcntr0_match = 1'b0;
1598 
1599 
1600 //
1601 // Watchpoint 8
1602 //
1603 always @(dmr1 or wpcntr0_match or wp)
1604         case (dmr1[`OR1200_DU_DMR1_CW8])
1605                 2'b00: wp[8] = wpcntr0_match;
1606                 2'b01: wp[8] = wpcntr0_match & wp[7];
1607                 2'b10: wp[8] = wpcntr0_match | wp[7];
1608                 2'b11: wp[8] = 1'b0;
1609         endcase
1610 
1611 
1612 //
1613 // Increment Watchpoint Counter 1
1614 //
1615 always @(wp or dmr2)
1616         if (dmr2[`OR1200_DU_DMR2_WCE1])
1617                 incr_wpcntr1 = |(wp & dmr2[`OR1200_DU_DMR2_AWTC]);
1618         else
1619                 incr_wpcntr1 = 1'b0;
1620 
1621 //
1622 // Match Condition Watchpoint Counter 1
1623 //
1624 always @(dwcr1)
1625         if (dwcr1[`OR1200_DU_DWCR_MATCH] == dwcr1[`OR1200_DU_DWCR_COUNT])
1626                 wpcntr1_match = 1'b1;
1627         else
1628                 wpcntr1_match = 1'b0;
1629 
1630 //
1631 // Watchpoint 9
1632 //
1633 always @(dmr1 or wpcntr1_match or wp)
1634         case (dmr1[`OR1200_DU_DMR1_CW9])
1635                 2'b00: wp[9] = wpcntr1_match;
1636                 2'b01: wp[9] = wpcntr1_match & wp[8];
1637                 2'b10: wp[9] = wpcntr1_match | wp[8];
1638                 2'b11: wp[9] = 1'b0;
1639         endcase
1640 
1641 //
1642 // Watchpoint 10
1643 //
1644 always @(dmr1 or dbg_ewt_i or wp)
1645         case (dmr1[`OR1200_DU_DMR1_CW10])
1646                 2'b00: wp[10] = dbg_ewt_i;
1647                 2'b01: wp[10] = dbg_ewt_i & wp[9];
1648                 2'b10: wp[10] = dbg_ewt_i | wp[9];
1649                 2'b11: wp[10] = 1'b0;
1650         endcase
1651 
1652 `endif
1653 
1654 //
1655 // Watchpoints can cause trap exception
1656 //
1657 `ifdef OR1200_DU_HWBKPTS
1658 assign du_hwbkpt = |(wp & dmr2[`OR1200_DU_DMR2_WGB]) | du_hwbkpt_hold | (dbg_bp_r & ~dsr[`OR1200_DU_DSR_TE]);
1659 `else
1660 assign du_hwbkpt = 1'b0;
1661 `endif
1662 
1663 // Hold du_hwbkpt if ex_freeze is active in order to cause trap exception 
1664 always @(posedge clk or `OR1200_RST_EVENT rst)
1665         if (rst == `OR1200_RST_VALUE)
1666                 du_hwbkpt_hold <=  1'b0;
1667         else if (du_hwbkpt & ex_freeze)
1668                 du_hwbkpt_hold <=  1'b1;
1669         else if (!ex_freeze)
1670                 du_hwbkpt_hold <=  1'b0;
1671 
1672 `ifdef OR1200_DU_TB_IMPLEMENTED
1673 //
1674 // Simple trace buffer
1675 // (right now hardcoded for Xilinx Virtex FPGAs)
1676 //
1677 // Stores last 256 instruction addresses, instruction
1678 // machine words and ALU results
1679 //
1680 
1681 //
1682 // Trace buffer write enable
1683 //
1684 assign tb_enw = ~ex_freeze & ~((ex_insn[31:26] == `OR1200_OR32_NOP) & ex_insn[16]);
1685 
1686 //
1687 // Trace buffer write address pointer
1688 //
1689 always @(posedge clk or `OR1200_RST_EVENT rst)
1690         if (rst == `OR1200_RST_VALUE)
1691                 tb_wadr <=  8'h00;
1692         else if (tb_enw)
1693                 tb_wadr <=  tb_wadr + 8'd1;
1694 
1695 //
1696 // Free running counter (time stamp)
1697 //
1698 always @(posedge clk or `OR1200_RST_EVENT rst)
1699         if (rst == `OR1200_RST_VALUE)
1700                 tb_timstmp <=  32'h00000000;
1701         else if (!dbg_bp_r)
1702                 tb_timstmp <=  tb_timstmp + 32'd1;
1703 
1704 //
1705 // Trace buffer RAMs
1706 //
1707 
1708 or1200_dpram_256x32 tbia_ram(
1709         .clk_a(clk),
1710         .rst_a(1'b0),
1711         .addr_a(spr_addr[7:0]),
1712         .ce_a(1'b1),
1713         .oe_a(1'b1),
1714         .do_a(tbia_dat_o),
1715 
1716         .clk_b(clk),
1717         .rst_b(1'b0),
1718         .addr_b(tb_wadr),
1719         .di_b(spr_dat_npc),
1720         .ce_b(1'b1),
1721         .we_b(tb_enw)
1722 
1723 );
1724 
1725 or1200_dpram_256x32 tbim_ram(
1726         .clk_a(clk),
1727         .rst_a(1'b0),
1728         .addr_a(spr_addr[7:0]),
1729         .ce_a(1'b1),
1730         .oe_a(1'b1),
1731         .do_a(tbim_dat_o),
1732         
1733         .clk_b(clk),
1734         .rst_b(1'b0),
1735         .addr_b(tb_wadr),
1736         .di_b(ex_insn),
1737         .ce_b(1'b1),
1738         .we_b(tb_enw)
1739 );
1740 
1741 or1200_dpram_256x32 tbar_ram(
1742         .clk_a(clk),
1743         .rst_a(1'b0),
1744         .addr_a(spr_addr[7:0]),
1745         .ce_a(1'b1),
1746         .oe_a(1'b1),
1747         .do_a(tbar_dat_o),
1748         
1749         .clk_b(clk),
1750         .rst_b(1'b0),
1751         .addr_b(tb_wadr),
1752         .di_b(rf_dataw),
1753         .ce_b(1'b1),
1754         .we_b(tb_enw)
1755 );
1756 
1757 or1200_dpram_256x32 tbts_ram(
1758         .clk_a(clk),
1759         .rst_a(1'b0),
1760         .addr_a(spr_addr[7:0]),
1761         .ce_a(1'b1),
1762         .oe_a(1'b1),
1763         .do_a(tbts_dat_o),
1764 
1765         .clk_b(clk),
1766         .rst_b(1'b0),
1767         .addr_b(tb_wadr),
1768         .di_b(tb_timstmp),
1769         .ce_b(1'b1),
1770         .we_b(tb_enw)
1771 );
1772 
1773 `else
1774 
1775 assign tbia_dat_o = 32'h0000_0000;
1776 assign tbim_dat_o = 32'h0000_0000;
1777 assign tbar_dat_o = 32'h0000_0000;
1778 assign tbts_dat_o = 32'h0000_0000;
1779 
1780 `endif  // OR1200_DU_TB_IMPLEMENTED
1781 
1782 `else   // OR1200_DU_IMPLEMENTED
1783 
1784 //
1785 // When DU is not implemented, drive all outputs as would when DU is disabled
1786 //
1787 assign dbg_bp_o = 1'b0;
1788 assign du_dsr = {`OR1200_DU_DSR_WIDTH{1'b0}};
1789 assign du_dmr1 = {25{1'b0}};
1790 assign du_hwbkpt = 1'b0;
1791 
1792 //
1793 // Read DU registers
1794 //
1795 `ifdef OR1200_DU_READREGS
1796 assign spr_dat_o = 32'h0000_0000;
1797 `ifdef OR1200_DU_UNUSED_ZERO
1798 `endif
1799 `endif
1800 
1801 `endif
1802 
1803 endmodule