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

Subversion Repositories or1k

[/] [or1k/] [tags/] [rel_21/] [or1200/] [rtl/] [verilog/] [or1200_du.v] - Blame information for rev 1778

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

Line No. Rev Author Line
1 504 lampret
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  OR1200's Debug Unit                                         ////
4
////                                                              ////
5
////  This file is part of the OpenRISC 1200 project              ////
6
////  http://www.opencores.org/cores/or1k/                        ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  Basic OR1200 debug unit.                                    ////
10
////                                                              ////
11
////  To Do:                                                      ////
12
////   - make it smaller and faster                               ////
13
////                                                              ////
14
////  Author(s):                                                  ////
15
////      - Damjan Lampret, lampret@opencores.org                 ////
16
////                                                              ////
17
//////////////////////////////////////////////////////////////////////
18
////                                                              ////
19
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
20
////                                                              ////
21
//// This source file may be used and distributed without         ////
22
//// restriction provided that this copyright statement is not    ////
23
//// removed from the file and that any derivative work contains  ////
24
//// the original copyright notice and the associated disclaimer. ////
25
////                                                              ////
26
//// This source file is free software; you can redistribute it   ////
27
//// and/or modify it under the terms of the GNU Lesser General   ////
28
//// Public License as published by the Free Software Foundation; ////
29
//// either version 2.1 of the License, or (at your option) any   ////
30
//// later version.                                               ////
31
////                                                              ////
32
//// This source is distributed in the hope that it will be       ////
33
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
34
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
35
//// PURPOSE.  See the GNU Lesser General Public License for more ////
36
//// details.                                                     ////
37
////                                                              ////
38
//// You should have received a copy of the GNU Lesser General    ////
39
//// Public License along with this source; if not, download it   ////
40
//// from http://www.opencores.org/lgpl.shtml                     ////
41
////                                                              ////
42
//////////////////////////////////////////////////////////////////////
43
//
44
// CVS Revision History
45
//
46
// $Log: not supported by cvs2svn $
47 1226 markom
// Revision 1.9  2003/01/22 03:23:47  lampret
48
// Updated sensitivity list for trace buffer [only relevant for Xilinx FPGAs]
49
//
50 1112 lampret
// Revision 1.8  2002/09/08 19:31:52  lampret
51
// Fixed a typo, reported by Taylor Su.
52
//
53 1038 lampret
// Revision 1.7  2002/07/14 22:17:17  lampret
54
// Added simple trace buffer [only for Xilinx Virtex target]. Fixed instruction fetch abort when new exception is recognized.
55
//
56 895 lampret
// Revision 1.6  2002/03/14 00:30:24  lampret
57
// Added alternative for critical path in DU.
58
//
59 737 lampret
// Revision 1.5  2002/02/11 04:33:17  lampret
60
// Speed optimizations (removed duplicate _cyc_ and _stb_). Fixed D/IMMU cache-inhibit attr.
61
//
62 660 lampret
// Revision 1.4  2002/01/28 01:16:00  lampret
63
// Changed 'void' nop-ops instead of insn[0] to use insn[16]. Debug unit stalls the tick timer. Prepared new flag generation for add and and insns. Blocked DC/IC while they are turned off. Fixed I/D MMU SPRs layout except WAYs. TODO: smart IC invalidate, l.j 2 and TLB ways.
64
//
65 617 lampret
// Revision 1.3  2002/01/18 07:56:00  lampret
66
// No more low/high priority interrupts (PICPR removed). Added tick timer exception. Added exception prefix (SR[EPH]). Fixed single-step bug whenreading NPC.
67
//
68 589 lampret
// Revision 1.2  2002/01/14 06:18:22  lampret
69
// Fixed mem2reg bug in FAST implementation. Updated debug unit to work with new genpc/if.
70
//
71 562 lampret
// Revision 1.1  2002/01/03 08:16:15  lampret
72
// New prefixes for RTL files, prefixed module names. Updated cache controllers and MMUs.
73
//
74 504 lampret
// Revision 1.12  2001/11/30 18:58:00  simons
75
// Trap insn couses break after exits ex_insn.
76
//
77
// Revision 1.11  2001/11/23 08:38:51  lampret
78
// Changed DSR/DRR behavior and exception detection.
79
//
80
// Revision 1.10  2001/11/20 21:25:44  lampret
81
// Fixed dbg_is_o assignment width.
82
//
83
// Revision 1.9  2001/11/20 18:46:14  simons
84
// Break point bug fixed
85
//
86
// Revision 1.8  2001/11/18 08:36:28  lampret
87
// For GDB changed single stepping and disabled trap exception.
88
//
89
// Revision 1.7  2001/10/21 18:09:53  lampret
90
// Fixed sensitivity list.
91
//
92
// Revision 1.6  2001/10/14 13:12:09  lampret
93
// MP3 version.
94
//
95
//
96
 
97
// synopsys translate_off
98
`include "timescale.v"
99
// synopsys translate_on
100
`include "or1200_defines.v"
101
 
102
//
103
// Debug unit
104
//
105
 
106
module or1200_du(
107
        // RISC Internal Interface
108
        clk, rst,
109 895 lampret
        dcpu_cycstb_i, dcpu_we_i, icpu_cycstb_i,
110
        ex_freeze, branch_op, ex_insn,
111
        spr_dat_npc, rf_dataw,
112
        du_dsr, du_stall, du_addr, du_dat_i, du_dat_o,
113
        du_read, du_write, du_except,
114 504 lampret
        spr_cs, spr_write, spr_addr, spr_dat_i, spr_dat_o,
115
 
116
        // External Debug Interface
117 1226 markom
        dbg_stall_i, dbg_ewt_i, dbg_lss_o, dbg_is_o, dbg_wp_o, dbg_bp_o,
118
        dbg_stb_i, dbg_we_i, dbg_adr_i, dbg_dat_i, dbg_dat_o, dbg_ack_o,
119 504 lampret
);
120
 
121
parameter dw = `OR1200_OPERAND_WIDTH;
122
parameter aw = `OR1200_OPERAND_WIDTH;
123
 
124
//
125
// I/O
126
//
127
 
128
//
129
// RISC Internal Interface
130
//
131
input                           clk;            // Clock
132
input                           rst;            // Reset
133 660 lampret
input                           dcpu_cycstb_i;  // LSU status
134 504 lampret
input                           dcpu_we_i;      // LSU status
135 660 lampret
input   [`OR1200_FETCHOP_WIDTH-1:0]      icpu_cycstb_i;  // IFETCH unit status
136 504 lampret
input                           ex_freeze;      // EX stage freeze
137
input   [`OR1200_BRANCHOP_WIDTH-1:0]     branch_op;      // Branch op
138
input   [dw-1:0]         ex_insn;        // EX insn
139 895 lampret
input   [31:0]                   spr_dat_npc;    // Next PC (for trace)
140
input   [31:0]                   rf_dataw;       // ALU result (for trace)
141 504 lampret
output  [`OR1200_DU_DSR_WIDTH-1:0]     du_dsr;           // DSR
142
output                          du_stall;       // Debug Unit Stall
143
output  [aw-1:0]         du_addr;        // Debug Unit Address
144
input   [dw-1:0]         du_dat_i;       // Debug Unit Data In
145
output  [dw-1:0]         du_dat_o;       // Debug Unit Data Out
146
output                          du_read;        // Debug Unit Read Enable
147
output                          du_write;       // Debug Unit Write Enable
148
input   [12:0]                   du_except;      // Exception masked by DSR
149
input                           spr_cs;         // SPR Chip Select
150
input                           spr_write;      // SPR Read/Write
151
input   [aw-1:0]         spr_addr;       // SPR Address
152
input   [dw-1:0]         spr_dat_i;      // SPR Data Input
153
output  [dw-1:0]         spr_dat_o;      // SPR Data Output
154
 
155
//
156
// External Debug Interface
157
//
158 1226 markom
input                   dbg_stall_i;    // External Stall Input
159
input                   dbg_ewt_i;      // External Watchpoint Trigger Input
160
output  [3:0]            dbg_lss_o;      // External Load/Store Unit Status
161
output  [1:0]            dbg_is_o;       // External Insn Fetch Status
162
output  [10:0]           dbg_wp_o;       // Watchpoints Outputs
163
output                  dbg_bp_o;       // Breakpoint Output
164
input                   dbg_stb_i;      // External Address/Data Strobe
165
input                   dbg_we_i;       // External Write Enable
166
input   [aw-1:0] dbg_adr_i;      // External Address Input
167
input   [dw-1:0] dbg_dat_i;      // External Data Input
168
output  [dw-1:0] dbg_dat_o;      // External Data Output
169
output                  dbg_ack_i;      // External Data Acknowledge (not WB compatible)
170 504 lampret
 
171
 
172
//
173
// Some connections go directly from the CPU through DU to Debug I/F
174
//
175 737 lampret
`ifdef OR1200_DU_STATUS_UNIMPLEMENTED
176
assign dbg_lss_o = 4'b0000;
177 895 lampret
 
178
reg     [1:0]                    dbg_is_o;
179
//
180
// Show insn activity (temp, must be removed)
181
//
182
always @(posedge clk or posedge rst)
183
        if (rst)
184
                dbg_is_o <= #1 2'b00;
185
        else if (!ex_freeze &
186
                ~((ex_insn[31:26] == `OR1200_OR32_NOP) & ex_insn[16]))
187
                dbg_is_o <= #1 ~dbg_is_o;
188
`ifdef UNUSED
189 737 lampret
assign dbg_is_o = 2'b00;
190 895 lampret
`endif
191 737 lampret
`else
192 660 lampret
assign dbg_lss_o = dcpu_cycstb_i ? {dcpu_we_i, 3'b000} : 4'b0000;
193
assign dbg_is_o = {1'b0, icpu_cycstb_i};
194 737 lampret
`endif
195 504 lampret
assign dbg_wp_o = 11'b000_0000_0000;
196
assign dbg_dat_o = du_dat_i;
197
 
198
//
199
// Some connections go directly from Debug I/F through DU to the CPU
200
//
201
assign du_stall = dbg_stall_i;
202
assign du_addr = dbg_adr_i;
203
assign du_dat_o = dbg_dat_i;
204 1226 markom
assign du_read = dbg_stb_i && !dbg_we_i;
205
assign du_write = dbg_stb_i && dbg_we_i;
206 504 lampret
 
207 1226 markom
//
208
// Generate acknowledge -- just delay stb signal
209
//
210
reg dbg_ack_o;
211
always @(posedge clk or posedge rst)
212
        if (rst)
213
                dbg_ack_o <= #1 1'b0;
214
        else
215
                dbg_ack_o <= #1 dbg_stb_i;
216
 
217 504 lampret
`ifdef OR1200_DU_IMPLEMENTED
218
 
219
//
220
// Debug Mode Register 1 (only ST and BT implemented)
221
//
222
`ifdef OR1200_DU_DMR1
223
reg     [23:22]                 dmr1;           // DMR1 implemented (ST & BT)
224
`else
225
wire    [23:22]                 dmr1;           // DMR1 not implemented
226
`endif
227
 
228
//
229
// Debug Mode Register 2 (not implemented)
230
//
231
`ifdef OR1200_DU_DMR2
232
wire    [31:0]                   dmr2;           // DMR not implemented
233
`endif
234
 
235
//
236
// Debug Stop Register
237
//
238
`ifdef OR1200_DU_DSR
239
reg     [`OR1200_DU_DSR_WIDTH-1:0]       dsr;            // DSR implemented
240
`else
241
wire    [`OR1200_DU_DSR_WIDTH-1:0]       dsr;            // DSR not implemented
242
`endif
243
 
244
//
245
// Debug Reason Register
246
//
247
`ifdef OR1200_DU_DRR
248
reg     [13:0]                   drr;            // DRR implemented
249
`else
250
wire    [13:0]                   drr;            // DRR not implemented
251
`endif
252
 
253
//
254
// Internal wires
255
//
256
wire                            dmr1_sel;       // DMR1 select
257
wire                            dsr_sel;        // DSR select
258
wire                            drr_sel;        // DRR select
259
reg                             dbg_bp_r;
260
`ifdef OR1200_DU_READREGS
261
reg     [31:0]                   spr_dat_o;
262
`endif
263
reg     [13:0]                   except_stop;    // Exceptions that stop because of DSR
264 895 lampret
`ifdef OR1200_DU_TB_IMPLEMENTED
265
wire                            tb_enw;
266
reg     [7:0]                    tb_wadr;
267
reg [31:0]                       tb_timstmp;
268
`endif
269
wire    [31:0]                   tbia_dat_o;
270
wire    [31:0]                   tbim_dat_o;
271
wire    [31:0]                   tbar_dat_o;
272
wire    [31:0]                   tbts_dat_o;
273 504 lampret
 
274
//
275
// DU registers address decoder
276
//
277
`ifdef OR1200_DU_DMR1
278 895 lampret
assign dmr1_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_OFS_DMR1));
279 504 lampret
`endif
280
`ifdef OR1200_DU_DSR
281 895 lampret
assign dsr_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_OFS_DSR));
282 504 lampret
`endif
283
`ifdef OR1200_DU_DRR
284 895 lampret
assign drr_sel = (spr_cs && (spr_addr[`OR1200_DUOFS_BITS] == `OR1200_DU_OFS_DRR));
285 504 lampret
`endif
286
 
287
//
288
// Decode started exception
289
//
290
always @(du_except) begin
291
        except_stop = 14'b0000_0000_0000;
292
        casex (du_except)
293 617 lampret
                13'b1_xxxx_xxxx_xxxx:
294
                        except_stop[`OR1200_DU_DRR_TTE] = 1'b1;
295
                13'b0_1xxx_xxxx_xxxx: begin
296 589 lampret
                        except_stop[`OR1200_DU_DRR_IE] = 1'b1;
297 504 lampret
                end
298 617 lampret
                13'b0_01xx_xxxx_xxxx: begin
299 504 lampret
                        except_stop[`OR1200_DU_DRR_IME] = 1'b1;
300
                end
301 617 lampret
                13'b0_001x_xxxx_xxxx:
302 504 lampret
                        except_stop[`OR1200_DU_DRR_IPFE] = 1'b1;
303 617 lampret
                13'b0_0001_xxxx_xxxx: begin
304 504 lampret
                        except_stop[`OR1200_DU_DRR_BUSEE] = 1'b1;
305
                end
306 617 lampret
                13'b0_0000_1xxx_xxxx:
307 504 lampret
                        except_stop[`OR1200_DU_DRR_IIE] = 1'b1;
308 617 lampret
                13'b0_0000_01xx_xxxx: begin
309 504 lampret
                        except_stop[`OR1200_DU_DRR_AE] = 1'b1;
310
                end
311 617 lampret
                13'b0_0000_001x_xxxx: begin
312 504 lampret
                        except_stop[`OR1200_DU_DRR_DME] = 1'b1;
313
                end
314 617 lampret
                13'b0_0000_0001_xxxx:
315 504 lampret
                        except_stop[`OR1200_DU_DRR_DPFE] = 1'b1;
316 617 lampret
                13'b0_0000_0000_1xxx:
317 504 lampret
                        except_stop[`OR1200_DU_DRR_BUSEE] = 1'b1;
318
                13'b0_0000_0000_01xx: begin
319
                        except_stop[`OR1200_DU_DRR_RE] = 1'b1;
320
                end
321
                13'b0_0000_0000_001x: begin
322
                        except_stop[`OR1200_DU_DRR_TE] = 1'b1;
323
                end
324
                13'b0_0000_0000_0001:
325
                        except_stop[`OR1200_DU_DRR_SCE] = 1'b1;
326
                default:
327
                        except_stop = 14'b0000_0000_0000;
328
        endcase
329
end
330
 
331
//
332
// dbg_bp_o is registered
333
//
334
assign dbg_bp_o = dbg_bp_r;
335
 
336
//
337
// Breakpoint activation register
338
//
339
always @(posedge clk or posedge rst)
340
        if (rst)
341
                dbg_bp_r <= #1 1'b0;
342
        else if (!ex_freeze)
343
                dbg_bp_r <= #1 |except_stop
344
`ifdef OR1200_DU_DMR1_ST
345 617 lampret
                        | ~((ex_insn[31:26] == `OR1200_OR32_NOP) & ex_insn[16]) & dmr1[`OR1200_DU_DMR1_ST]
346 504 lampret
`endif
347
`ifdef OR1200_DU_DMR1_BT
348
                        | (branch_op != `OR1200_BRANCHOP_NOP) & dmr1[`OR1200_DU_DMR1_BT]
349
`endif
350
                        ;
351
        else
352 562 lampret
                dbg_bp_r <= #1 |except_stop;
353 504 lampret
 
354
//
355
// Write to DMR1
356
//
357
`ifdef OR1200_DU_DMR1
358
always @(posedge clk or posedge rst)
359
        if (rst)
360
                dmr1 <= 2'b00;
361
        else if (dmr1_sel && spr_write)
362
                dmr1 <= #1 spr_dat_i[23:22];
363
`else
364
assign dmr1 = 2'b00;
365
`endif
366
 
367
//
368
// DMR2 bits tied to zero
369
//
370
`ifdef OR1200_DU_DMR2
371
assign dmr2 = 32'h0000_0000;
372
`endif
373
 
374
//
375
// Write to DSR
376
//
377
`ifdef OR1200_DU_DSR
378
always @(posedge clk or posedge rst)
379
        if (rst)
380
                dsr <= {`OR1200_DU_DSR_WIDTH{1'b0}};
381
        else if (dsr_sel && spr_write)
382
                dsr <= #1 spr_dat_i[`OR1200_DU_DSR_WIDTH-1:0];
383
`else
384
assign dsr = {`OR1200_DU_DSR_WIDTH{1'b0}};
385
`endif
386
 
387
//
388
// Write to DRR
389
//
390
`ifdef OR1200_DU_DRR
391
always @(posedge clk or posedge rst)
392
        if (rst)
393
                drr <= 14'b0;
394
        else if (drr_sel && spr_write)
395
                drr <= #1 spr_dat_i[13:0];
396
        else
397
                drr <= #1 drr | except_stop;
398
`else
399
assign drr = 14'b0;
400
`endif
401
 
402
//
403
// Read DU registers
404
//
405
`ifdef OR1200_DU_READREGS
406 1112 lampret
always @(spr_addr or dsr or drr or dmr1 or dmr2
407 1038 lampret
`ifdef OR1200_DU_TB_IMPLEMENTED
408 1112 lampret
        or tb_wadr or tbia_dat_o or tbim_dat_o
409
        or tbar_dat_o or tbts_dat_o
410 1038 lampret
`endif
411
        )
412 895 lampret
        casex (spr_addr[`OR1200_DUOFS_BITS]) // synopsys parallel_case
413 504 lampret
`ifdef OR1200_DU_DMR1
414
                `OR1200_DU_OFS_DMR1:
415
                        spr_dat_o = {8'b0, dmr1, 22'b0};
416
`endif
417
`ifdef OR1200_DU_DMR2
418
                `OR1200_DU_OFS_DMR2:
419
                        spr_dat_o = dmr2;
420
`endif
421
`ifdef OR1200_DU_DSR
422
                `OR1200_DU_OFS_DSR:
423
                        spr_dat_o = {18'b0, dsr};
424
`endif
425
`ifdef OR1200_DU_DRR
426
                `OR1200_DU_OFS_DRR:
427
                        spr_dat_o = {18'b0, drr};
428
`endif
429 895 lampret
`ifdef OR1200_DU_TB_IMPLEMENTED
430
                `OR1200_DU_OFS_TBADR:
431
                        spr_dat_o = {24'h000000, tb_wadr};
432
                `OR1200_DU_OFS_TBIA:
433
                        spr_dat_o = tbia_dat_o;
434
                `OR1200_DU_OFS_TBIM:
435
                        spr_dat_o = tbim_dat_o;
436
                `OR1200_DU_OFS_TBAR:
437
                        spr_dat_o = tbar_dat_o;
438
                `OR1200_DU_OFS_TBTS:
439
                        spr_dat_o = tbts_dat_o;
440
`endif
441 504 lampret
                default:
442
                        spr_dat_o = 32'h0000_0000;
443
        endcase
444
`endif
445
 
446
//
447
// DSR alias
448
//
449
assign du_dsr = dsr;
450
 
451 895 lampret
`ifdef OR1200_DU_TB_IMPLEMENTED
452
//
453
// Simple trace buffer
454
// (right now hardcoded for Xilinx Virtex FPGAs)
455
//
456
// Stores last 256 instruction addresses, instruction
457
// machine words and ALU results
458
//
459
 
460
//
461
// Trace buffer write enable
462
//
463
assign tb_enw = ~ex_freeze & ~((ex_insn[31:26] == `OR1200_OR32_NOP) & ex_insn[16]);
464
 
465
//
466
// Trace buffer write address pointer
467
//
468
always @(posedge clk or posedge rst)
469
        if (rst)
470
                tb_wadr <= #1 8'h00;
471
        else if (tb_enw)
472
                tb_wadr <= #1 tb_wadr + 8'd1;
473
 
474
//
475
// Free running counter (time stamp)
476
//
477
always @(posedge clk or posedge rst)
478
        if (rst)
479
                tb_timstmp <= #1 32'h00000000;
480
        else if (!dbg_bp_r)
481
                tb_timstmp <= #1 tb_timstmp + 32'd1;
482
 
483
//
484
// Trace buffer RAMs
485
//
486
RAMB4_S16_S16 tbia_ramb4_s16_0(
487
        .CLKA(clk),
488
        .RSTA(rst),
489
        .ADDRA(tb_wadr),
490
        .DIA(spr_dat_npc[15:0]),
491
        .ENA(1'b1),
492
        .WEA(tb_enw),
493
        .DOA(),
494
 
495
        .CLKB(clk),
496
        .RSTB(rst),
497
        .ADDRB(spr_addr[7:0]),
498
        .DIB(16'h0000),
499
        .ENB(1'b1),
500
        .WEB(1'b0),
501
        .DOB(tbia_dat_o[15:0])
502
);
503
 
504
RAMB4_S16_S16 tbia_ramb4_s16_1(
505
        .CLKA(clk),
506
        .RSTA(rst),
507
        .ADDRA(tb_wadr),
508
        .DIA(spr_dat_npc[31:16]),
509
        .ENA(1'b1),
510
        .WEA(tb_enw),
511
        .DOA(),
512
 
513
        .CLKB(clk),
514
        .RSTB(rst),
515
        .ADDRB(spr_addr[7:0]),
516
        .DIB(16'h0000),
517
        .ENB(1'b1),
518
        .WEB(1'b0),
519
        .DOB(tbia_dat_o[31:16])
520
);
521
 
522
RAMB4_S16_S16 tbim_ramb4_s16_0(
523
        .CLKA(clk),
524
        .RSTA(rst),
525
        .ADDRA(tb_wadr),
526
        .DIA(ex_insn[15:0]),
527
        .ENA(1'b1),
528
        .WEA(tb_enw),
529
        .DOA(),
530
 
531
        .CLKB(clk),
532
        .RSTB(rst),
533
        .ADDRB(spr_addr[7:0]),
534
        .DIB(16'h0000),
535
        .ENB(1'b1),
536
        .WEB(1'b0),
537
        .DOB(tbim_dat_o[15:0])
538
);
539
 
540
RAMB4_S16_S16 tbim_ramb4_s16_1(
541
        .CLKA(clk),
542
        .RSTA(rst),
543
        .ADDRA(tb_wadr),
544
        .DIA(ex_insn[31:16]),
545
        .ENA(1'b1),
546
        .WEA(tb_enw),
547
        .DOA(),
548
 
549
        .CLKB(clk),
550
        .RSTB(rst),
551
        .ADDRB(spr_addr[7:0]),
552
        .DIB(16'h0000),
553
        .ENB(1'b1),
554
        .WEB(1'b0),
555
        .DOB(tbim_dat_o[31:16])
556
);
557
 
558
RAMB4_S16_S16 tbar_ramb4_s16_0(
559
        .CLKA(clk),
560
        .RSTA(rst),
561
        .ADDRA(tb_wadr),
562
        .DIA(rf_dataw[15:0]),
563
        .ENA(1'b1),
564
        .WEA(tb_enw),
565
        .DOA(),
566
 
567
        .CLKB(clk),
568
        .RSTB(rst),
569
        .ADDRB(spr_addr[7:0]),
570
        .DIB(16'h0000),
571
        .ENB(1'b1),
572
        .WEB(1'b0),
573
        .DOB(tbar_dat_o[15:0])
574
);
575
 
576
RAMB4_S16_S16 tbar_ramb4_s16_1(
577
        .CLKA(clk),
578
        .RSTA(rst),
579
        .ADDRA(tb_wadr),
580
        .DIA(rf_dataw[31:16]),
581
        .ENA(1'b1),
582
        .WEA(tb_enw),
583
        .DOA(),
584
 
585
        .CLKB(clk),
586
        .RSTB(rst),
587
        .ADDRB(spr_addr[7:0]),
588
        .DIB(16'h0000),
589
        .ENB(1'b1),
590
        .WEB(1'b0),
591
        .DOB(tbar_dat_o[31:16])
592
);
593
 
594
RAMB4_S16_S16 tbts_ramb4_s16_0(
595
        .CLKA(clk),
596
        .RSTA(rst),
597
        .ADDRA(tb_wadr),
598
        .DIA(tb_timstmp[15:0]),
599
        .ENA(1'b1),
600
        .WEA(tb_enw),
601
        .DOA(),
602
 
603
        .CLKB(clk),
604
        .RSTB(rst),
605
        .ADDRB(spr_addr[7:0]),
606
        .DIB(16'h0000),
607
        .ENB(1'b1),
608
        .WEB(1'b0),
609
        .DOB(tbts_dat_o[15:0])
610
);
611
 
612
RAMB4_S16_S16 tbts_ramb4_s16_1(
613
        .CLKA(clk),
614
        .RSTA(rst),
615
        .ADDRA(tb_wadr),
616
        .DIA(tb_timstmp[31:16]),
617
        .ENA(1'b1),
618
        .WEA(tb_enw),
619
        .DOA(),
620
 
621
        .CLKB(clk),
622
        .RSTB(rst),
623
        .ADDRB(spr_addr[7:0]),
624
        .DIB(16'h0000),
625
        .ENB(1'b1),
626
        .WEB(1'b0),
627
        .DOB(tbts_dat_o[31:16])
628
);
629
 
630 504 lampret
`else
631 895 lampret
assign tbia_dat_o = 32'h0000_0000;
632
assign tbim_dat_o = 32'h0000_0000;
633
assign tbar_dat_o = 32'h0000_0000;
634
assign tbts_dat_o = 32'h0000_0000;
635 504 lampret
 
636 895 lampret
`endif  // OR1200_DU_TB_IMPLEMENTED
637
 
638
`else   // OR1200_DU_IMPLEMENTED
639
 
640 504 lampret
//
641
// When DU is not implemented, drive all outputs as would when DU is disabled
642
//
643
assign dbg_bp_o = 1'b0;
644
assign du_dsr = {`OR1200_DU_DSR_WIDTH{1'b0}};
645
 
646
//
647
// Read DU registers
648
//
649
`ifdef OR1200_DU_READREGS
650
assign spr_dat_o = 32'h0000_0000;
651
`ifdef OR1200_DU_UNUSED_ZERO
652
`endif
653
`endif
654
 
655
`endif
656
 
657
endmodule

powered by: WebSVN 2.1.0

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