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

Subversion Repositories or1k_old

[/] [or1k_old/] [trunk/] [orp/] [orp_soc/] [bench/] [verilog/] [dbg_if_model.v] - Blame information for rev 1782

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 779 lampret
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  dbg_if_model.v                                              ////
4
////                                                              ////
5
////                                                              ////
6
////  This file is part of the OpenRISC test bench.               ////
7
////  http://www.opencores.org/                                   ////
8
////                                                              ////
9
////                                                              ////
10
////  Author(s):                                                  ////
11
////       Damjan Lampret                                         ////
12
////       lampret@opencores.org                                  ////
13
////                                                              ////
14
////                                                              ////
15
////  All additional information is avaliable in the README.txt   ////
16
////  file.                                                       ////
17
////                                                              ////
18
//////////////////////////////////////////////////////////////////////
19
////                                                              ////
20
//// Copyright (C) 2000,2001 Authors                              ////
21
////                                                              ////
22
//// This source file may be used and distributed without         ////
23
//// restriction provided that this copyright statement is not    ////
24
//// removed from the file and that any derivative work contains  ////
25
//// the original copyright notice and the associated disclaimer. ////
26
////                                                              ////
27
//// This source file is free software; you can redistribute it   ////
28
//// and/or modify it under the terms of the GNU Lesser General   ////
29
//// Public License as published by the Free Software Foundation; ////
30
//// either version 2.1 of the License, or (at your option) any   ////
31
//// later version.                                               ////
32
////                                                              ////
33
//// This source is distributed in the hope that it will be       ////
34
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
35
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
36
//// PURPOSE.  See the GNU Lesser General Public License for more ////
37
//// details.                                                     ////
38
////                                                              ////
39
//// You should have received a copy of the GNU Lesser General    ////
40
//// Public License along with this source; if not, download it   ////
41
//// from http://www.opencores.org/lgpl.shtml                     ////
42
////                                                              ////
43
//////////////////////////////////////////////////////////////////////
44
//
45
// CVS Revision History
46
//
47
// $Log: not supported by cvs2svn $
48 1268 lampret
// Revision 1.2  2003/04/07 01:30:57  lampret
49
// Changed location of debug test code to 0.
50
//
51 1134 lampret
// Revision 1.1  2002/03/28 19:59:54  lampret
52
// Added bench directory
53
//
54 779 lampret
// Revision 1.2  2002/01/18 07:57:21  lampret
55
// Added test case for testing NPC read bug when doing single-step.
56
//
57
// Revision 1.1  2002/01/14 06:19:35  lampret
58
// Added debug model for testing du. Updated or1200_monitor.
59
//
60
//
61
//
62
 
63
`include "dbg_defines.v"
64
 
65
// Top module
66
module dbg_if_model(
67
                // JTAG pins
68
                tms_pad_i, tck_pad_i, trst_pad_i, tdi_pad_i, tdo_pad_o,
69
 
70
                // Boundary Scan signals
71
                capture_dr_o, shift_dr_o, update_dr_o, extest_selected_o, bs_chain_i,
72
 
73
                // RISC signals
74
                risc_clk_i, risc_addr_o, risc_data_i, risc_data_o, wp_i,
75
                bp_i, opselect_o, lsstatus_i, istatus_i, risc_stall_o, reset_o,
76
 
77
                // WISHBONE common signals
78
                wb_rst_i, wb_clk_i,
79
 
80
                // WISHBONE master interface
81
                wb_adr_o, wb_dat_o, wb_dat_i, wb_cyc_o, wb_stb_o, wb_sel_o,
82
                wb_we_o, wb_ack_i, wb_cab_o, wb_err_i
83
 
84
 
85
              );
86
 
87
parameter Tp = 1;
88
 
89
// JTAG pins
90
input         tms_pad_i;                  // JTAG test mode select pad
91
input         tck_pad_i;                  // JTAG test clock pad
92
input         trst_pad_i;                 // JTAG test reset pad
93
input         tdi_pad_i;                  // JTAG test data input pad
94
output        tdo_pad_o;                  // JTAG test data output pad
95
 
96
 
97
// Boundary Scan signals
98
output capture_dr_o;
99
output shift_dr_o;
100
output update_dr_o;
101
output extest_selected_o;
102
input  bs_chain_i;
103
 
104
 
105
// RISC signals
106
input         risc_clk_i;                 // Master clock (RISC clock)
107
input  [31:0] risc_data_i;                // RISC data inputs (data that is written to the RISC registers)
108
input  [10:0] wp_i;                       // Watchpoint inputs
109
input         bp_i;                       // Breakpoint input
110
input  [3:0]  lsstatus_i;                 // Load/store status inputs
111
input  [1:0]  istatus_i;                  // Instruction status inputs
112
output [31:0] risc_addr_o;                // RISC address output (for adressing registers within RISC)
113
output [31:0] risc_data_o;                // RISC data output (data read from risc registers)
114
output [`OPSELECTWIDTH-1:0] opselect_o;   // Operation selection (selecting what kind of data is set to the risc_data_i)
115
output                      risc_stall_o; // Stalls the RISC
116
output                      reset_o;      // Resets the RISC
117
 
118
 
119
// WISHBONE common signals
120
input         wb_rst_i;                   // WISHBONE reset
121
input         wb_clk_i;                   // WISHBONE clock
122
 
123
// WISHBONE master interface
124
output [31:0] wb_adr_o;
125
output [31:0] wb_dat_o;
126
input  [31:0] wb_dat_i;
127
output        wb_cyc_o;
128
output        wb_stb_o;
129
output  [3:0] wb_sel_o;
130
output        wb_we_o;
131
input         wb_ack_i;
132
output        wb_cab_o;
133
input         wb_err_i;
134
 
135
reg     [31:0]   risc_addr_o;
136
reg     [31:0]   risc_data_o;
137
reg     [`OPSELECTWIDTH-1:0] opselect_o;
138
reg             risc_stall_a;
139
reg             risc_stall_r;
140 1268 lampret
reg             dbg_if_test_go;
141
integer         i, npc, ppc, r1, insn, result, npc_saved;
142 779 lampret
 
143
assign tdo_pad_o = 1'b0;
144
assign capture_dr_o = 1'b0;
145
assign shift_dr_o = 1'b0;
146
assign update_dr_o = 1'b0;
147
assign extest_selected_o = 1'b0;
148
assign reset_o = 1'b0;
149
assign risc_stall_o = risc_stall_r | risc_stall_a;
150
assign wb_cab_o = 1'b0;
151
 
152
always @(posedge wb_rst_i or posedge bp_i)
153
        if (wb_rst_i)
154
                risc_stall_r <= #1 1'b0;
155
        else if (bp_i)
156
                risc_stall_r <= #1 1'b1;
157
initial begin
158
        risc_addr_o = 0;
159
        risc_data_o = 0;
160
        opselect_o = 0;
161
        risc_stall_a = 1'b0;
162 1268 lampret
end
163
 
164
always @(posedge dbg_if_test_go)
165
begin
166
        $display("%t: dbg_if_test\n", $time);
167
 
168 779 lampret
        stall;
169 1268 lampret
 
170 1134 lampret
        wb_master.wr(32'h0000_0004, 32'h9c200000, 4'b1111);     /* l.addi  r1,r0,0x0       */
171
        wb_master.wr(32'h0000_0008, 32'h18400008, 4'b1111);     /* l.movhi r2,0x0008       */
172
        wb_master.wr(32'h0000_000c, 32'h9c210001, 4'b1111);     /* l.addi  r1,r1,1         */
173
        wb_master.wr(32'h0000_0010, 32'h9c210001, 4'b1111);     /* l.addi  r1,r1,1         */
174
        wb_master.wr(32'h0000_0014, 32'hd4020800, 4'b1111);     /* l.sw    0(r2),r1        */
175
        wb_master.wr(32'h0000_0018, 32'h9c210001, 4'b1111);     /* l.addi  r1,r1,1         */
176
        wb_master.wr(32'h0000_001c, 32'h84620000, 4'b1111);     /* l.lwz   r3,0(r2)        */
177
        wb_master.wr(32'h0000_0020, 32'h03fffffb, 4'b1111);     /* l.j     loop2           */
178
        wb_master.wr(32'h0000_0024, 32'he0211800, 4'b1111);     /* l.add   r1,r1,r3        */
179
        wb_master.wr(32'h0000_0028, 32'he0211800, 4'b1111);     /* l.add   r1,r1,r3        */
180 779 lampret
 
181 1268 lampret
        // Save NPC for restoring program
182
        // flow after finish of debug if test case
183
        rd_reg((0 << 11) + 16, npc_saved);
184
 
185 779 lampret
        // Enable exceptions in SR
186
        wr_reg(17, 3);
187
 
188
        // Set trap bit in DSR
189
        wr_reg((6 << 11) + 20, 32'h2000);
190
 
191
        // Set NPC
192 1134 lampret
        wr_npc(32'h0000_0004);
193 779 lampret
 
194
        // Set step-bit (DMR1[ST])
195
        wr_reg((6 << 11) + 16, 1 << 22);
196
 
197 1268 lampret
        // Read NPC
198
        rd_reg((0 << 11) + 16, npc);
199
 
200
        // Read PPC
201
        rd_reg((0 << 11) + 18, ppc);
202
 
203
        // Read R1
204
        rd_reg(32'h401, r1);
205
 
206
        $display("%t:", $time);
207
        $display("Read      npc = %h ppc = %h r1 = %h", npc, ppc, r1);
208
        $display("Expected  npc = %h ppc = %h r1 = %h\n", 32'h00000000, 32'h040001c4, 32'h0000313c);
209
 
210
 
211 779 lampret
        // Single-step
212
        for (i = 1; i < 10; i = i + 1)
213
                unstall;
214
 
215
        // Read NPC
216
        rd_reg((0 << 11) + 16, npc);
217
 
218
        // Read PPC
219
        rd_reg((0 << 11) + 18, ppc);
220
 
221
        // Read R1
222
        rd_reg(32'h401, r1);
223
 
224 1268 lampret
        $display("%t:", $time);
225 779 lampret
        $display("Read      npc = %h ppc = %h r1 = %h", npc, ppc, r1);
226 1134 lampret
        $display("Expected  npc = %h ppc = %h r1 = %h\n", 32'h0000000c, 32'h00000024, 5);
227 779 lampret
        result = npc + ppc + r1;
228
 
229
 
230
        /* Reset step bit */
231
        wr_reg ((6 << 11) + 16, 0);
232
 
233
        /* Set trap insn in delay slot */
234 1134 lampret
        wb_master.rd (32'h0000_0024, insn);
235
        wb_master.wr (32'h0000_0024, 32'h21000001, 4'b1111);
236 779 lampret
 
237
        /* Unstall */
238
        unstall;
239
 
240
        /* Read NPC */
241
        rd_reg((0 << 11) + 16, npc);
242
 
243
        /* Read PPC */
244
        rd_reg((0 << 11) + 18, ppc);
245
 
246
        /* Read R1 */
247
        rd_reg(32'h401, r1);
248
 
249
        /* Set back original insn */
250 1134 lampret
        wb_master.wr (32'h0000_0024, insn, 4'b1111);
251 779 lampret
 
252 1268 lampret
        $display("%t:", $time);
253 779 lampret
        $display("Read      npc = %h ppc = %h r1 = %h", npc, ppc, r1);
254 1134 lampret
        $display("Expected  npc = %h ppc = %h r1 = %h\n", 32'h0000000c, 32'h00000024, 8);
255 779 lampret
        result = npc + ppc + r1 + result;
256
 
257
 
258
        /* Set trap insn in place of branch insn */
259 1134 lampret
        wb_master.rd (32'h0000_0020, insn);
260
        wb_master.wr (32'h0000_0020, 32'h21000001, 4'b1111);
261 779 lampret
 
262
        /* Set PC */
263 1134 lampret
        wr_npc(32'h0000_000c);
264 779 lampret
 
265
        /* Unstall */
266
        unstall;
267
 
268
        /* Read NPC */
269
        rd_reg((0 << 11) + 16, npc);
270
 
271
        /* Read PPC */
272
        rd_reg((0 << 11) + 18, ppc);
273
 
274
        /* Read R1 */
275
        rd_reg(32'h401, r1);
276
 
277
        /* Set back original insn */
278 1134 lampret
        wb_master.wr (32'h0000_0020, insn, 4'b1111);
279 779 lampret
 
280 1268 lampret
        $display("%t:", $time);
281 779 lampret
        $display("Read      npc = %h ppc = %h r1 = %h", npc, ppc, r1);
282 1134 lampret
        $display("Expected  npc = %h ppc = %h r1 = %h\n", 32'h00000024, 32'h00000020, 11);
283 779 lampret
        result = npc + ppc + r1 + result;
284
 
285
        /* Set trap insn before branch insn */
286 1134 lampret
        wb_master.rd (32'h0000_001c, insn);
287
        wb_master.wr (32'h0000_001c, 32'h21000001, 4'b1111);
288 779 lampret
 
289
        /* Set PC */
290 1134 lampret
        wr_npc(32'h0000_0020);
291 779 lampret
 
292
        /* Unstall */
293
        unstall;
294
 
295
        /* Read NPC */
296
        rd_reg((0 << 11) + 16, npc);
297
 
298
        /* Read PPC */
299
        rd_reg((0 << 11) + 18, ppc);
300
 
301
        /* Read R1 */
302
        rd_reg(32'h401, r1);
303
 
304
        /* Set back original insn */
305 1134 lampret
        wb_master.wr (32'h0000_001c, insn, 4'b1111);
306 779 lampret
 
307
        $display("Read      npc = %h ppc = %h r1 = %h", npc, ppc, r1);
308 1134 lampret
        $display("Expected  npc = %h ppc = %h r1 = %h\n", 32'h00000020, 32'h0000001c, 24);
309 779 lampret
        result = npc + ppc + r1 + result;
310
 
311
 
312
        /* Set trap insn behind lsu insn */
313 1134 lampret
        wb_master.rd (32'h0000_0018, insn);
314
        wb_master.wr (32'h0000_0018, 32'h21000001, 4'b1111);
315 779 lampret
 
316
        /* Set PC */
317 1134 lampret
        wr_npc(32'h0000_001c);
318 779 lampret
 
319
        /* Unstall */
320
        unstall;
321
 
322
        /* Read NPC */
323
        rd_reg((0 << 11) + 16, npc);
324
 
325
        /* Read PPC */
326
        rd_reg((0 << 11) + 18, ppc);
327
 
328
        /* Read R1 */
329
        rd_reg(32'h401, r1);
330
 
331
        /* Set back original insn */
332 1134 lampret
        wb_master.wr (32'h0000_0018, insn, 4'b1111);
333 779 lampret
 
334 1268 lampret
        $display("%t:", $time);
335 779 lampret
        $display("Read      npc = %h ppc = %h r1 = %h", npc, ppc, r1);
336 1134 lampret
        $display("Expected  npc = %h ppc = %h r1 = %h\n", 32'h0000001c, 32'h00000018, 49);
337 779 lampret
        result = npc + ppc + r1 + result;
338
 
339
        /* Set trap insn very near previous one */
340 1134 lampret
        wb_master.rd (32'h0000_001c, insn);
341
        wb_master.wr (32'h0000_001c, 32'h21000001, 4'b1111);
342 779 lampret
 
343
        /* Set PC */
344 1134 lampret
        wr_npc(32'h0000_0018);
345 779 lampret
 
346
        /* Unstall */
347
        unstall;
348
 
349
        /* Read NPC */
350
        rd_reg((0 << 11) + 16, npc);
351
 
352
        /* Read PPC */
353
        rd_reg((0 << 11) + 18, ppc);
354
 
355
        /* Read R1 */
356
        rd_reg(32'h401, r1);
357
 
358
        /* Set back original insn */
359 1134 lampret
        wb_master.wr (32'h0000_001c, insn, 4'b1111);
360 779 lampret
 
361 1268 lampret
        $display("%t:", $time);
362 779 lampret
        $display("Read      npc = %h ppc = %h r1 = %h", npc, ppc, r1);
363 1134 lampret
        $display("Expected  npc = %h ppc = %h r1 = %h\n", 32'h00000020, 32'h0000001c, 50);
364 779 lampret
        result = npc + ppc + r1 + result;
365
 
366
        /* Set trap insn to the start */
367 1134 lampret
        wb_master.rd (32'h0000_000c, insn);
368
        wb_master.wr (32'h0000_000c, 32'h21000001, 4'b1111);
369 779 lampret
 
370
        /* Set PC */
371 1134 lampret
        wr_npc(32'h0000_001c);
372 779 lampret
 
373
        /* Unstall */
374
        unstall;
375
 
376
        /* Read NPC */
377
        rd_reg((0 << 11) + 16, npc);
378
 
379
        /* Read PPC */
380
        rd_reg((0 << 11) + 18, ppc);
381
 
382
        /* Read R1 */
383
        rd_reg(32'h401, r1);
384
 
385
        /* Set back original insn */
386 1134 lampret
        wb_master.wr (32'h0000_000c, insn, 4'b1111);
387 779 lampret
 
388 1268 lampret
        $display("%t:", $time);
389 779 lampret
        $display("Read      npc = %h ppc = %h r1 = %h", npc, ppc, r1);
390 1134 lampret
        $display("Expected  npc = %h ppc = %h r1 = %h\n", 32'h00000010, 32'h0000000c, 99);
391 779 lampret
        result = npc + ppc + r1 + result;
392
 
393
        // Set step-bit (DMR1[ST])
394
        wr_reg((6 << 11) + 16, 1 << 22);
395
 
396
        // Single-step
397
        for (i = 0; i < 5; i = i + 1)
398
                unstall;
399
 
400
        /* Read NPC */
401
        rd_reg((0 << 11) + 16, npc);
402
 
403
        /* Read PPC */
404
        rd_reg((0 << 11) + 18, ppc);
405
 
406
        /* Read R1 */
407
        rd_reg(32'h401, r1);
408
 
409 1268 lampret
        $display("%t:", $time);
410 779 lampret
        $display("Read      npc = %h ppc = %h r1 = %h", npc, ppc, r1);
411 1134 lampret
        $display("Expected  npc = %h ppc = %h r1 = %h\n", 32'h00000024, 32'h00000020, 101);
412 779 lampret
        result = npc + ppc + r1 + result;
413
 
414
        /* Set PC */
415 1134 lampret
        wr_npc(32'h0000_0020);
416 779 lampret
 
417
        // Single-step
418
        for (i = 0; i < 2; i = i + 1)
419
                unstall;
420
 
421
        /* Read NPC */
422
        rd_reg((0 << 11) + 16, npc);
423
 
424
        /* Read PPC */
425
        rd_reg((0 << 11) + 18, ppc);
426
 
427
        /* Read R1 */
428
        rd_reg(32'h401, r1);
429
 
430 1268 lampret
        $display("%t:", $time);
431 779 lampret
        $display("Read      npc = %h ppc = %h r1 = %h", npc, ppc, r1);
432 1134 lampret
        $display("Expected  npc = %h ppc = %h r1 = %h\n", 32'h0000000c, 32'h00000024, 201);
433 779 lampret
        result = npc + ppc + r1 + result;
434
 
435 1268 lampret
        // Restore NPC from beginning of test case
436
        wr_npc(npc_saved);
437 779 lampret
 
438 1268 lampret
        /* Write R3 with result */
439
        wr_reg(32'h403, result + + 32'hdeaddaa9);
440
 
441
        // Don't trap anymore - clear DSR
442
        wr_reg((6 << 11) + 20, 32'h0000_0000);
443
 
444
        // Clear step-bit DMR1[ST] - clear DMR1)
445
        wr_reg((6 << 11) + 16, 0);
446
 
447
        unstall;
448 779 lampret
end
449
 
450
task stall;
451
begin
452
        risc_stall_r = 1'b1;
453
        @(posedge risc_clk_i);
454
        @(posedge risc_clk_i);
455
end
456
endtask
457
 
458
task unstall;
459
begin
460
        risc_stall_r = 1'b0;
461
        @(posedge risc_clk_i);
462
        while (!bp_i) @(posedge risc_clk_i);
463
end
464
endtask
465
 
466
task wr_npc;
467
input   [31:0]   npc;
468
begin
469
        npc = npc - 0;
470
        wr_reg((0 << 11) + 16, npc);
471
end
472
endtask
473
 
474
task wr_reg;
475
input   [31:0]   addr;
476
input   [31:0]   data;
477
begin
478
        risc_stall_a = 1'b1;
479
        @(posedge risc_clk_i);
480
        risc_addr_o = addr;
481
        risc_data_o = data;
482
        opselect_o = 5;
483
        @(posedge risc_clk_i);
484
        risc_addr_o = 0;
485
        risc_data_o = 0;
486
        opselect_o = 0;
487
        @(posedge risc_clk_i);
488
        @(posedge risc_clk_i);
489
        @(posedge risc_clk_i);
490
        risc_stall_a = 1'b0;
491
end
492
endtask
493
 
494
task rd_reg;
495
input   [31:0]   addr;
496
output  [31:0]   data;
497
begin
498
        risc_stall_a = 1'b1;
499
        @(posedge risc_clk_i);
500
        risc_addr_o = addr;
501
        opselect_o = 4;
502
        @(posedge risc_clk_i);
503
        @(posedge risc_clk_i);
504
        data = risc_data_i;
505
        @(posedge risc_clk_i);
506
        risc_addr_o = 0;
507
        risc_data_o = 0;
508
        opselect_o = 0;
509
        @(posedge risc_clk_i);
510
        @(posedge risc_clk_i);
511
        @(posedge risc_clk_i);
512
        risc_stall_a = 1'b0;
513
end
514
endtask
515
 
516
//
517
// Instantiation of Master WISHBONE BFM
518
//
519
wb_master wb_master(
520
        // WISHBONE Interface
521
        .CLK_I(wb_clk_i),
522
        .RST_I(wb_rst_i),
523
        .CYC_O(wb_cyc_o),
524
        .ADR_O(wb_adr_o),
525
        .DAT_O(wb_dat_o),
526
        .SEL_O(wb_sel_o),
527
        .WE_O(wb_we_o),
528
        .STB_O(wb_stb_o),
529
        .DAT_I(wb_dat_i),
530
        .ACK_I(wb_ack_i),
531
        .ERR_I(wb_err_i),
532
        .RTY_I(1'b0),
533
        .TAG_I(4'b0),
534
        .TAG_O()
535
);
536
 
537
endmodule

powered by: WebSVN 2.1.0

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