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

Subversion Repositories can

[/] [can/] [tags/] [rel_9/] [bench/] [verilog/] [can_testbench.v] - Blame information for rev 38

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

Line No. Rev Author Line
1 2 mohor
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  can_testbench.v                                             ////
4
////                                                              ////
5
////                                                              ////
6 9 mohor
////  This file is part of the CAN Protocol Controller            ////
7 2 mohor
////  http://www.opencores.org/projects/can/                      ////
8
////                                                              ////
9
////                                                              ////
10
////  Author(s):                                                  ////
11
////       Igor Mohor                                             ////
12
////       igorm@opencores.org                                    ////
13
////                                                              ////
14
////                                                              ////
15 9 mohor
////  All additional information is available in the README.txt   ////
16 2 mohor
////  file.                                                       ////
17
////                                                              ////
18
//////////////////////////////////////////////////////////////////////
19
////                                                              ////
20 9 mohor
//// Copyright (C) 2002, 2003 Authors                             ////
21 2 mohor
////                                                              ////
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 28 mohor
//// The CAN protocol is developed by Robert Bosch GmbH and       ////
44
//// protected by patents. Anybody who wants to implement this    ////
45
//// CAN IP core on silicon has to obtain a CAN protocol license  ////
46
//// from Bosch.                                                  ////
47
////                                                              ////
48 2 mohor
//////////////////////////////////////////////////////////////////////
49
//
50
// CVS Revision History
51
//
52
// $Log: not supported by cvs2svn $
53 38 mohor
// Revision 1.24  2003/02/14 20:16:53  mohor
54
// Several registers added. Not finished, yet.
55
//
56 35 mohor
// Revision 1.23  2003/02/12 14:28:30  mohor
57
// Errors monitoring improved. arbitration_lost improved.
58
//
59 34 mohor
// Revision 1.22  2003/02/11 00:57:19  mohor
60
// Wishbone interface added.
61
//
62 31 mohor
// Revision 1.21  2003/02/09 18:40:23  mohor
63
// Overload fixed. Hard synchronization also enabled at the last bit of
64
// interframe.
65
//
66 29 mohor
// Revision 1.20  2003/02/09 02:24:11  mohor
67
// Bosch license warning added. Error counters finished. Overload frames
68
// still need to be fixed.
69
//
70 28 mohor
// Revision 1.19  2003/02/04 17:24:33  mohor
71
// Backup.
72
//
73 26 mohor
// Revision 1.18  2003/02/04 14:34:45  mohor
74
// *** empty log message ***
75
//
76 25 mohor
// Revision 1.17  2003/01/31 01:13:31  mohor
77
// backup.
78
//
79 24 mohor
// Revision 1.16  2003/01/16 13:36:14  mohor
80
// Form error supported. When receiving messages, last bit of the end-of-frame
81
// does not generate form error. Receiver goes to the idle mode one bit sooner.
82
// (CAN specification ver 2.0, part B, page 57).
83
//
84 22 mohor
// Revision 1.15  2003/01/15 21:05:06  mohor
85
// CRC checking fixed (when bitstuff occurs at the end of a CRC sequence).
86
//
87 20 mohor
// Revision 1.14  2003/01/15 14:40:16  mohor
88 31 mohor
// RX state machine fixed to receive "remote request" frames correctly. No
89
// data bytes are written to fifo when such frames are received.
90 20 mohor
//
91 19 mohor
// Revision 1.13  2003/01/15 13:16:42  mohor
92 31 mohor
// When a frame with "remote request" is received, no data is stored to
93
// fifo, just the frame information (identifier, ...). Data length that
94
// is stored is the received data length and not the actual data length
95
// that is stored to fifo.
96 19 mohor
//
97 18 mohor
// Revision 1.12  2003/01/14 17:25:03  mohor
98
// Addresses corrected to decimal values (previously hex).
99
//
100 17 mohor
// Revision 1.11  2003/01/14 12:19:29  mohor
101
// rx_fifo is now working.
102
//
103 16 mohor
// Revision 1.10  2003/01/10 17:51:28  mohor
104
// Temporary version (backup).
105
//
106 15 mohor
// Revision 1.9  2003/01/09 21:54:39  mohor
107
// rx fifo added. Not 100 % verified, yet.
108
//
109 14 mohor
// Revision 1.8  2003/01/08 02:09:43  mohor
110
// Acceptance filter added.
111
//
112 11 mohor
// Revision 1.7  2002/12/28 04:13:53  mohor
113
// Backup version.
114
//
115 10 mohor
// Revision 1.6  2002/12/27 00:12:48  mohor
116
// Header changed, testbench improved to send a frame (crc still missing).
117
//
118 9 mohor
// Revision 1.5  2002/12/26 16:00:29  mohor
119
// Testbench define file added. Clock divider register added.
120
//
121 8 mohor
// Revision 1.4  2002/12/26 01:33:01  mohor
122
// Tripple sampling supported.
123
//
124 7 mohor
// Revision 1.3  2002/12/25 23:44:12  mohor
125
// Commented lines removed.
126
//
127 6 mohor
// Revision 1.2  2002/12/25 14:16:54  mohor
128
// Synchronization working.
129
//
130 5 mohor
// Revision 1.1.1.1  2002/12/20 16:39:21  mohor
131
// Initial
132 2 mohor
//
133
//
134 5 mohor
//
135 2 mohor
 
136
// synopsys translate_off
137
`include "timescale.v"
138
// synopsys translate_on
139
`include "can_defines.v"
140 8 mohor
`include "can_testbench_defines.v"
141 2 mohor
 
142
module can_testbench();
143
 
144
 
145
 
146
parameter Tp = 1;
147 8 mohor
parameter BRP = 2*(`CAN_TIMING0_BRP + 1);
148 2 mohor
 
149
 
150
 
151 31 mohor
reg         wb_clk_i;
152
reg         wb_rst_i;
153
reg   [7:0] wb_dat_i;
154
wire  [7:0] wb_dat_o;
155
reg         wb_cyc_i;
156
reg         wb_stb_i;
157
 
158
reg         wb_we_i;
159
reg   [7:0] wb_adr_i;
160 2 mohor
reg         clk;
161
reg         rx;
162 24 mohor
wire        tx;
163 28 mohor
wire        tx_oen;
164 31 mohor
wire        wb_ack_o;
165 35 mohor
wire        irq;
166 31 mohor
 
167 28 mohor
wire        tx_3st;
168 24 mohor
wire        rx_and_tx;
169
 
170 2 mohor
integer     start_tb;
171 14 mohor
reg   [7:0] tmp_data;
172 24 mohor
reg         delayed_tx;
173 28 mohor
reg         tx_bypassed;
174 34 mohor
reg         wb_free;
175 38 mohor
reg         extended_mode;
176 2 mohor
 
177 24 mohor
 
178 38 mohor
 
179 11 mohor
// Instantiate can_top module
180 2 mohor
can_top i_can_top
181
(
182 31 mohor
  .wb_clk_i(wb_clk_i),
183
  .wb_rst_i(wb_rst_i),
184
  .wb_dat_i(wb_dat_i),
185
  .wb_dat_o(wb_dat_o),
186
  .wb_cyc_i(wb_cyc_i),
187
  .wb_stb_i(wb_stb_i),
188
  .wb_we_i(wb_we_i),
189
  .wb_adr_i(wb_adr_i),
190
  .wb_ack_o(wb_ack_o),
191 2 mohor
  .clk(clk),
192 24 mohor
  .rx(rx_and_tx),
193 28 mohor
  .tx(tx),
194 35 mohor
  .tx_oen(tx_oen),
195
  .irq(irq)
196 2 mohor
);
197
 
198 28 mohor
assign tx_3st = tx_oen? 1'bz : tx;
199 2 mohor
 
200 24 mohor
 
201 35 mohor
// Generate wishbone clock signal 10 MHz  FIX ME
202 31 mohor
initial
203
begin
204
  wb_clk_i=0;
205 35 mohor
  forever #20 wb_clk_i = ~wb_clk_i;
206 31 mohor
end
207
 
208
 
209 35 mohor
// Generate clock signal 24 MHz FIX ME
210 2 mohor
initial
211
begin
212
  clk=0;
213
  forever #20 clk = ~clk;
214
end
215
 
216 31 mohor
 
217 2 mohor
initial
218
begin
219
  start_tb = 0;
220 31 mohor
  wb_dat_i = 'hz;
221
  wb_cyc_i = 0;
222
  wb_stb_i = 0;
223
  wb_we_i = 'hz;
224
  wb_adr_i = 'hz;
225 34 mohor
  wb_free = 1;
226 2 mohor
  rx = 1;
227 31 mohor
  wb_rst_i = 1;
228 38 mohor
  extended_mode = 0;
229 31 mohor
  #200 wb_rst_i = 0;
230 16 mohor
  #200 initialize_fifo;
231 2 mohor
  #200 start_tb = 1;
232 28 mohor
  tx_bypassed = 0;
233 2 mohor
end
234
 
235
 
236 28 mohor
 
237
 
238 24 mohor
// Generating delayed tx signal (CAN transciever delay)
239
always
240
begin
241 28 mohor
  wait (tx_3st);
242 24 mohor
  repeat (4*BRP) @ (posedge clk);   // 4 time quants delay
243 28 mohor
  #1 delayed_tx = tx_3st;
244
  wait (~tx_3st);
245 24 mohor
  repeat (4*BRP) @ (posedge clk);   // 4 time quants delay
246 28 mohor
  #1 delayed_tx = tx_3st;
247 24 mohor
end
248
 
249 28 mohor
//assign rx_and_tx = rx & delayed_tx;   FIX ME !!!
250
assign rx_and_tx = rx & (delayed_tx | tx_bypassed);
251 24 mohor
 
252
 
253 2 mohor
// Main testbench
254
initial
255
begin
256
  wait(start_tb);
257
 
258 11 mohor
  // Set bus timing register 0
259 17 mohor
  write_register(8'd6, {`CAN_TIMING0_SJW, `CAN_TIMING0_BRP});
260 8 mohor
 
261 11 mohor
  // Set bus timing register 1
262 17 mohor
  write_register(8'd7, {`CAN_TIMING1_SAM, `CAN_TIMING1_TSEG2, `CAN_TIMING1_TSEG1});
263 11 mohor
 
264 14 mohor
 
265 11 mohor
  // Set Clock Divider register
266 38 mohor
  extended_mode = 1'b0;
267
  write_register(8'd31, {extended_mode, 7'h0});    // Setting the normal mode (not extended)
268
 
269
 
270 11 mohor
  // Set Acceptance Code and Acceptance Mask registers (their address differs for basic and extended mode
271 38 mohor
/*
272
  // Set Acceptance Code and Acceptance Mask registers
273
  write_register(8'd16, 8'ha6); // acceptance code 0
274
  write_register(8'd17, 8'hb0); // acceptance code 1
275
  write_register(8'd18, 8'h12); // acceptance code 2
276
  write_register(8'd19, 8'h30); // acceptance code 3
277
  write_register(8'd20, 8'h0); // acceptance mask 0
278
  write_register(8'd21, 8'h0); // acceptance mask 1
279
  write_register(8'd22, 8'h00); // acceptance mask 2
280
  write_register(8'd23, 8'h00); // acceptance mask 3
281
*/
282
 
283
  // Set Acceptance Code and Acceptance Mask registers
284
  write_register(8'd4, 8'he8); // acceptance code
285
  write_register(8'd5, 8'h0f); // acceptance mask
286 2 mohor
 
287
  #10;
288
  repeat (1000) @ (posedge clk);
289
 
290 11 mohor
  // Switch-off reset mode
291 17 mohor
  write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)});
292 10 mohor
 
293
  repeat (BRP) @ (posedge clk);   // At least BRP clocks needed before bus goes to dominant level. Otherwise 1 quant difference is possible
294
                                  // This difference is resynchronized later.
295 24 mohor
 
296
  // After exiting the reset mode
297 11 mohor
  repeat (7) send_bit(1);         // Sending EOF
298 24 mohor
  repeat (3) send_bit(1);         // Sending Interframe
299 10 mohor
 
300 9 mohor
//  test_synchronization;
301 10 mohor
 
302
 
303 38 mohor
/*
304 11 mohor
  if(`CAN_CLOCK_DIVIDER_MODE)   // Extended mode
305
    begin
306 20 mohor
//      test_empty_fifo_ext;    // test currently switched off
307
      test_full_fifo_ext;     // test currently switched on
308
//      send_frame_ext;         // test currently switched off
309 11 mohor
    end
310
  else
311
    begin
312 18 mohor
//      test_empty_fifo;    // test currently switched off
313 34 mohor
//      test_full_fifo;     // test currently switched off
314 35 mohor
      send_frame;         // test currently switched off
315
//      bus_off_test;       // test currently switched off
316
//      manual_frame;       // test currently switched off
317
//      forced_bus_off;       // test currently switched on
318 16 mohor
    end
319 38 mohor
*/
320
  self_reception_request;
321 15 mohor
 
322 16 mohor
  $display("CAN Testbench finished !");
323
  $stop;
324
end
325 5 mohor
 
326 14 mohor
 
327 35 mohor
task forced_bus_off;    // Forcing bus-off by writinf to tx_err_cnt register
328 28 mohor
  begin
329 14 mohor
 
330 35 mohor
    // Switch-on reset mode
331
    write_register(8'd0, {7'h0, `CAN_MODE_RESET});
332 28 mohor
 
333 35 mohor
    // Set Clock Divider register
334
    write_register(8'd31, {1'b1, 7'h0});    // Setting the extended mode (not normal)
335 28 mohor
 
336 35 mohor
    // Write 255 to tx_err_cnt register - Forcing bus-off
337
    write_register(8'd15, 255);
338 28 mohor
 
339 35 mohor
    // Switch-off reset mode
340
    write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)});
341 28 mohor
 
342 35 mohor
//    #1000000;
343
    #2500000;
344
 
345
 
346
    // Switch-on reset mode
347
    write_register(8'd0, {7'h0, `CAN_MODE_RESET});
348
 
349
    // Write 245 to tx_err_cnt register
350
    write_register(8'd15, 245);
351
 
352
    // Switch-off reset mode
353
    write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)});
354
 
355
    #1000000;
356
 
357
 
358
  end
359
endtask   // forced_bus_off
360
 
361
 
362
task manual_frame;    // Testbench sends a frame
363
  begin
364
 
365 29 mohor
    write_register(8'd10, 8'he8); // Writing ID[10:3] = 0xe8
366
    write_register(8'd11, 8'hb7); // Writing ID[2:0] = 0x5, rtr = 1, length = 7
367
    write_register(8'd12, 8'h00); // data byte 1
368
    write_register(8'd13, 8'h00); // data byte 2
369
    write_register(8'd14, 8'h00); // data byte 3
370
    write_register(8'd15, 8'h00); // data byte 4
371
    write_register(8'd16, 8'h00); // data byte 5
372
    write_register(8'd17, 8'h00); // data byte 6
373
    write_register(8'd18, 8'h00); // data byte 7
374
    write_register(8'd19, 8'h00); // data byte 8
375
 
376 28 mohor
    fork
377
      begin
378 38 mohor
        tx_request_command;
379 28 mohor
      end
380
 
381
      begin
382 35 mohor
        #2000;
383 31 mohor
 
384 35 mohor
        repeat (16)
385
        begin
386
          send_bit(0);  // SOF
387
          send_bit(1);  // ID
388
          send_bit(1);  // ID
389
          send_bit(1);  // ID
390
          send_bit(0);  // ID
391
          send_bit(1);  // ID
392
          send_bit(0);  // ID
393
          send_bit(0);  // ID
394
          send_bit(0);  // ID
395
          send_bit(1);  // ID
396
          send_bit(0);  // ID
397
          send_bit(1);  // ID
398
          send_bit(1);  // RTR
399
          send_bit(0);  // IDE
400
          send_bit(0);  // r0
401
          send_bit(0);  // DLC
402
          send_bit(1);  // DLC
403
          send_bit(1);  // DLC
404
          send_bit(1);  // DLC
405
          send_bit(1);  // CRC
406
          send_bit(0);  // CRC
407
          send_bit(0);  // CRC
408
          send_bit(1);  // CRC
409
          send_bit(1);  // CRC
410
          send_bit(1);  // CRC
411
          send_bit(0);  // CRC
412
          send_bit(1);  // CRC
413
          send_bit(0);  // CRC
414
          send_bit(0);  // CRC
415
          send_bit(1);  // CRC
416
          send_bit(1);  // CRC
417
          send_bit(1);  // CRC
418
          send_bit(1);  // CRC
419
          send_bit(1);  // CRC
420
          send_bit(1);  // CRC DELIM
421
          send_bit(1);  // ACK            ack error
422
          send_bit(0);  // ERROR
423
          send_bit(0);  // ERROR
424
          send_bit(0);  // ERROR
425
          send_bit(0);  // ERROR
426
          send_bit(0);  // ERROR
427
          send_bit(0);  // ERROR
428
          send_bit(1);  // ERROR DELIM
429
          send_bit(1);  // ERROR DELIM
430
          send_bit(1);  // ERROR DELIM
431
          send_bit(1);  // ERROR DELIM
432
          send_bit(1);  // ERROR DELIM
433
          send_bit(1);  // ERROR DELIM
434
          send_bit(1);  // ERROR DELIM
435
          send_bit(1);  // ERROR DELIM
436
          send_bit(1);  // INTER
437
          send_bit(1);  // INTER
438
          send_bit(1);  // INTER
439
        end // repeat
440 31 mohor
 
441 35 mohor
        // Node is error passive now.
442
        repeat (20)
443
 
444
        begin
445
          send_bit(0);  // SOF
446
          send_bit(1);  // ID
447
          send_bit(1);  // ID
448
          send_bit(1);  // ID
449
          send_bit(0);  // ID
450
          send_bit(1);  // ID
451
          send_bit(0);  // ID
452
          send_bit(0);  // ID
453
          send_bit(0);  // ID
454
          send_bit(1);  // ID
455
          send_bit(0);  // ID
456
          send_bit(1);  // ID
457
          send_bit(1);  // RTR
458
          send_bit(0);  // IDE
459
          send_bit(0);  // r0
460
          send_bit(0);  // DLC
461
          send_bit(1);  // DLC
462
          send_bit(1);  // DLC
463
          send_bit(1);  // DLC
464
          send_bit(1);  // CRC
465
          send_bit(0);  // CRC
466
          send_bit(0);  // CRC
467
          send_bit(1);  // CRC
468
          send_bit(1);  // CRC
469
          send_bit(1);  // CRC
470
          send_bit(0);  // CRC
471
          send_bit(1);  // CRC
472
          send_bit(0);  // CRC
473
          send_bit(0);  // CRC
474
          send_bit(1);  // CRC
475
          send_bit(1);  // CRC
476
          send_bit(1);  // CRC
477
          send_bit(1);  // CRC
478
          send_bit(1);  // CRC
479
          send_bit(1);  // CRC DELIM
480
          send_bit(1);  // ACK            ack error
481
          send_bit(0);  // ERROR
482
          send_bit(0);  // ERROR
483
          send_bit(0);  // ERROR
484
          send_bit(0);  // ERROR
485
          send_bit(0);  // ERROR
486
          send_bit(0);  // ERROR
487
          send_bit(1);  // ERROR DELIM
488
          send_bit(1);  // ERROR DELIM
489
          send_bit(1);  // ERROR DELIM
490
          send_bit(1);  // ERROR DELIM
491
          send_bit(1);  // ERROR DELIM
492
          send_bit(1);  // ERROR DELIM
493
          send_bit(1);  // ERROR DELIM
494
          send_bit(1);  // ERROR DELIM
495
          send_bit(1);  // INTER
496
          send_bit(1);  // INTER
497
          send_bit(1);  // INTER
498
          send_bit(1);  // SUSPEND
499
          send_bit(1);  // SUSPEND
500
          send_bit(1);  // SUSPEND
501
          send_bit(1);  // SUSPEND
502
          send_bit(1);  // SUSPEND
503
          send_bit(1);  // SUSPEND
504
          send_bit(1);  // SUSPEND
505
          send_bit(1);  // SUSPEND
506
        end // repeat
507 31 mohor
 
508 35 mohor
        // Node is bus-off now
509 28 mohor
 
510 35 mohor
        #100000;
511 31 mohor
 
512 35 mohor
        // Switch-off reset mode
513
        write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)});
514 31 mohor
 
515 35 mohor
        repeat (128 * 11)
516
        begin
517
          send_bit(1);
518
        end // repeat
519 31 mohor
 
520 28 mohor
      end
521
 
522
 
523
    join
524
 
525 35 mohor
 
526
 
527
    fork
528
      begin
529 38 mohor
        tx_request_command;
530 35 mohor
      end
531
 
532
      begin
533
        #1100;
534
 
535
        send_bit(1);    // To spend some time before transmitter is ready.
536
 
537
        repeat (1)
538
        begin
539
          send_bit(0);  // SOF
540
          send_bit(1);  // ID
541
          send_bit(1);  // ID
542
          send_bit(1);  // ID
543
          send_bit(0);  // ID
544
          send_bit(1);  // ID
545
          send_bit(0);  // ID
546
          send_bit(0);  // ID
547
          send_bit(0);  // ID
548
          send_bit(1);  // ID
549
          send_bit(0);  // ID
550
          send_bit(1);  // ID
551
          send_bit(1);  // RTR
552
          send_bit(0);  // IDE
553
          send_bit(0);  // r0
554
          send_bit(0);  // DLC
555
          send_bit(1);  // DLC
556
          send_bit(1);  // DLC
557
          send_bit(1);  // DLC
558
          send_bit(1);  // CRC
559
          send_bit(0);  // CRC
560
          send_bit(0);  // CRC
561
          send_bit(1);  // CRC
562
          send_bit(1);  // CRC
563
          send_bit(1);  // CRC
564
          send_bit(0);  // CRC
565
          send_bit(1);  // CRC
566
          send_bit(0);  // CRC
567
          send_bit(0);  // CRC
568
          send_bit(1);  // CRC
569
          send_bit(1);  // CRC
570
          send_bit(1);  // CRC
571
          send_bit(1);  // CRC
572
          send_bit(1);  // CRC
573
          send_bit(1);  // CRC DELIM
574
          send_bit(0);  // ACK
575
          send_bit(1);  // ACK DELIM
576
          send_bit(1);  // EOF
577
          send_bit(1);  // EOF
578
          send_bit(1);  // EOF
579
          send_bit(1);  // EOF
580
          send_bit(1);  // EOF
581
          send_bit(1);  // EOF
582
          send_bit(1);  // EOF
583
          send_bit(1);  // INTER
584
          send_bit(1);  // INTER
585
          send_bit(1);  // INTER
586
        end // repeat
587
      end
588
 
589
    join
590
 
591
 
592
 
593
 
594
 
595 28 mohor
    read_receive_buffer;
596 38 mohor
    release_rx_buffer_command;
597 28 mohor
 
598 35 mohor
    read_receive_buffer;
599 38 mohor
    release_rx_buffer_command;
600 35 mohor
    read_receive_buffer;
601 28 mohor
 
602 35 mohor
    #4000000;
603 28 mohor
 
604 35 mohor
  end
605
endtask
606
 
607
 
608
 
609
task bus_off_test;    // Testbench sends a frame
610
  begin
611
 
612
    write_register(8'd10, 8'he8); // Writing ID[10:3] = 0xe8
613
    write_register(8'd11, 8'hb7); // Writing ID[2:0] = 0x5, rtr = 1, length = 7
614
    write_register(8'd12, 8'h00); // data byte 1
615
    write_register(8'd13, 8'h00); // data byte 2
616
    write_register(8'd14, 8'h00); // data byte 3
617
    write_register(8'd15, 8'h00); // data byte 4
618
    write_register(8'd16, 8'h00); // data byte 5
619
    write_register(8'd17, 8'h00); // data byte 6
620
    write_register(8'd18, 8'h00); // data byte 7
621
    write_register(8'd19, 8'h00); // data byte 8
622
 
623
    fork
624
      begin
625 38 mohor
        tx_request_command;
626 35 mohor
      end
627
 
628
      begin
629
        #2000;
630
 
631
        repeat (16)
632
        begin
633
          send_bit(0);  // SOF
634
          send_bit(1);  // ID
635
          send_bit(1);  // ID
636
          send_bit(1);  // ID
637
          send_bit(0);  // ID
638
          send_bit(1);  // ID
639
          send_bit(0);  // ID
640
          send_bit(0);  // ID
641
          send_bit(0);  // ID
642
          send_bit(1);  // ID
643
          send_bit(0);  // ID
644
          send_bit(1);  // ID
645
          send_bit(1);  // RTR
646
          send_bit(0);  // IDE
647
          send_bit(0);  // r0
648
          send_bit(0);  // DLC
649
          send_bit(1);  // DLC
650
          send_bit(1);  // DLC
651
          send_bit(1);  // DLC
652
          send_bit(1);  // CRC
653
          send_bit(0);  // CRC
654
          send_bit(0);  // CRC
655
          send_bit(1);  // CRC
656
          send_bit(1);  // CRC
657
          send_bit(1);  // CRC
658
          send_bit(0);  // CRC
659
          send_bit(1);  // CRC
660
          send_bit(0);  // CRC
661
          send_bit(0);  // CRC
662
          send_bit(1);  // CRC
663
          send_bit(1);  // CRC
664
          send_bit(1);  // CRC
665
          send_bit(1);  // CRC
666
          send_bit(1);  // CRC
667
          send_bit(1);  // CRC DELIM
668
          send_bit(1);  // ACK            ack error
669
          send_bit(0);  // ERROR
670
          send_bit(0);  // ERROR
671
          send_bit(0);  // ERROR
672
          send_bit(0);  // ERROR
673
          send_bit(0);  // ERROR
674
          send_bit(0);  // ERROR
675
          send_bit(1);  // ERROR DELIM
676
          send_bit(1);  // ERROR DELIM
677
          send_bit(1);  // ERROR DELIM
678
          send_bit(1);  // ERROR DELIM
679
          send_bit(1);  // ERROR DELIM
680
          send_bit(1);  // ERROR DELIM
681
          send_bit(1);  // ERROR DELIM
682
          send_bit(1);  // ERROR DELIM
683
          send_bit(1);  // INTER
684
          send_bit(1);  // INTER
685
          send_bit(1);  // INTER
686
        end // repeat
687
 
688
        // Node is error passive now.
689 38 mohor
 
690
        // Read irq register (error interrupt should be cleared now.
691
        read_register(8'd3);
692
 
693 35 mohor
        repeat (20)
694
 
695
        begin
696
          send_bit(0);  // SOF
697
          send_bit(1);  // ID
698
          send_bit(1);  // ID
699
          send_bit(1);  // ID
700
          send_bit(0);  // ID
701
          send_bit(1);  // ID
702
          send_bit(0);  // ID
703
          send_bit(0);  // ID
704
          send_bit(0);  // ID
705
          send_bit(1);  // ID
706
          send_bit(0);  // ID
707
          send_bit(1);  // ID
708
          send_bit(1);  // RTR
709
          send_bit(0);  // IDE
710
          send_bit(0);  // r0
711
          send_bit(0);  // DLC
712
          send_bit(1);  // DLC
713
          send_bit(1);  // DLC
714
          send_bit(1);  // DLC
715
          send_bit(1);  // CRC
716
          send_bit(0);  // CRC
717
          send_bit(0);  // CRC
718
          send_bit(1);  // CRC
719
          send_bit(1);  // CRC
720
          send_bit(1);  // CRC
721
          send_bit(0);  // CRC
722
          send_bit(1);  // CRC
723
          send_bit(0);  // CRC
724
          send_bit(0);  // CRC
725
          send_bit(1);  // CRC
726
          send_bit(1);  // CRC
727
          send_bit(1);  // CRC
728
          send_bit(1);  // CRC
729
          send_bit(1);  // CRC
730
          send_bit(1);  // CRC DELIM
731
          send_bit(1);  // ACK            ack error
732
          send_bit(0);  // ERROR
733
          send_bit(0);  // ERROR
734
          send_bit(0);  // ERROR
735
          send_bit(0);  // ERROR
736
          send_bit(0);  // ERROR
737
          send_bit(0);  // ERROR
738
          send_bit(1);  // ERROR DELIM
739
          send_bit(1);  // ERROR DELIM
740
          send_bit(1);  // ERROR DELIM
741
          send_bit(1);  // ERROR DELIM
742
          send_bit(1);  // ERROR DELIM
743
          send_bit(1);  // ERROR DELIM
744
          send_bit(1);  // ERROR DELIM
745
          send_bit(1);  // ERROR DELIM
746
          send_bit(1);  // INTER
747
          send_bit(1);  // INTER
748
          send_bit(1);  // INTER
749
          send_bit(1);  // SUSPEND
750
          send_bit(1);  // SUSPEND
751
          send_bit(1);  // SUSPEND
752
          send_bit(1);  // SUSPEND
753
          send_bit(1);  // SUSPEND
754
          send_bit(1);  // SUSPEND
755
          send_bit(1);  // SUSPEND
756
          send_bit(1);  // SUSPEND
757
        end // repeat
758
 
759
        // Node is bus-off now
760
 
761 38 mohor
 
762
        // Read irq register (error interrupt should be cleared now.
763
        read_register(8'd3);
764
 
765
 
766
 
767 35 mohor
        #100000;
768
 
769
        // Switch-off reset mode
770
        write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)});
771
 
772 38 mohor
        repeat (64 * 11)
773 35 mohor
        begin
774
          send_bit(1);
775
        end // repeat
776
 
777 38 mohor
        // Read irq register (error interrupt should be cleared now.
778
        read_register(8'd3);
779
 
780
        repeat (64 * 11)
781
        begin
782
          send_bit(1);
783
        end // repeat
784
 
785
 
786
 
787
        // Read irq register (error interrupt should be cleared now.
788
        read_register(8'd3);
789
 
790 35 mohor
      end
791 38 mohor
 
792
 
793
 
794 35 mohor
    join
795
 
796
 
797
 
798
    fork
799
      begin
800 38 mohor
        tx_request_command;
801 35 mohor
      end
802
 
803
      begin
804
        #1100;
805
 
806
        send_bit(1);    // To spend some time before transmitter is ready.
807
 
808
        repeat (1)
809
        begin
810
          send_bit(0);  // SOF
811
          send_bit(1);  // ID
812
          send_bit(1);  // ID
813
          send_bit(1);  // ID
814
          send_bit(0);  // ID
815
          send_bit(1);  // ID
816
          send_bit(0);  // ID
817
          send_bit(0);  // ID
818
          send_bit(0);  // ID
819
          send_bit(1);  // ID
820
          send_bit(0);  // ID
821
          send_bit(1);  // ID
822
          send_bit(1);  // RTR
823
          send_bit(0);  // IDE
824
          send_bit(0);  // r0
825
          send_bit(0);  // DLC
826
          send_bit(1);  // DLC
827
          send_bit(1);  // DLC
828
          send_bit(1);  // DLC
829
          send_bit(1);  // CRC
830
          send_bit(0);  // CRC
831
          send_bit(0);  // CRC
832
          send_bit(1);  // CRC
833
          send_bit(1);  // CRC
834
          send_bit(1);  // CRC
835
          send_bit(0);  // CRC
836
          send_bit(1);  // CRC
837
          send_bit(0);  // CRC
838
          send_bit(0);  // CRC
839
          send_bit(1);  // CRC
840
          send_bit(1);  // CRC
841
          send_bit(1);  // CRC
842
          send_bit(1);  // CRC
843
          send_bit(1);  // CRC
844
          send_bit(1);  // CRC DELIM
845
          send_bit(0);  // ACK
846
          send_bit(1);  // ACK DELIM
847
          send_bit(1);  // EOF
848
          send_bit(1);  // EOF
849
          send_bit(1);  // EOF
850
          send_bit(1);  // EOF
851
          send_bit(1);  // EOF
852
          send_bit(1);  // EOF
853
          send_bit(1);  // EOF
854
          send_bit(1);  // INTER
855
          send_bit(1);  // INTER
856
          send_bit(1);  // INTER
857
        end // repeat
858
      end
859
 
860
    join
861
 
862 28 mohor
    read_receive_buffer;
863 38 mohor
    release_rx_buffer_command;
864 28 mohor
    read_receive_buffer;
865 38 mohor
    release_rx_buffer_command;
866 35 mohor
    read_receive_buffer;
867 28 mohor
 
868 31 mohor
    #4000000;
869 28 mohor
 
870 35 mohor
    receive_frame(0, 0, {26'h00000e8, 3'h1}, 4'h1, 15'h30bb); // mode, rtr, id, length, crc
871
 
872
    #1000000;
873
 
874 28 mohor
  end
875 35 mohor
endtask   // bus_off_test
876 28 mohor
 
877
 
878
 
879 18 mohor
task send_frame;    // CAN IP core sends frames
880
  begin
881 14 mohor
 
882 38 mohor
    if(extended_mode)   // Extended mode
883 18 mohor
      begin
884
 
885
        // Writing TX frame information + identifier + data
886
        write_register(8'd16, 8'h12);
887
        write_register(8'd17, 8'h34);
888
        write_register(8'd18, 8'h56);
889
        write_register(8'd19, 8'h78);
890
        write_register(8'd20, 8'h9a);
891
        write_register(8'd21, 8'hbc);
892
        write_register(8'd22, 8'hde);
893
        write_register(8'd23, 8'hf0);
894
        write_register(8'd24, 8'h0f);
895
        write_register(8'd25, 8'hed);
896
        write_register(8'd26, 8'hcb);
897
        write_register(8'd27, 8'ha9);
898
        write_register(8'd28, 8'h87);
899
      end
900
    else
901
      begin
902 25 mohor
        write_register(8'd10, 8'hea); // Writing ID[10:3] = 0xea
903 28 mohor
        write_register(8'd11, 8'h28); // Writing ID[2:0] = 0x1, rtr = 0, length = 8
904 18 mohor
        write_register(8'd12, 8'h56); // data byte 1
905
        write_register(8'd13, 8'h78); // data byte 2
906
        write_register(8'd14, 8'h9a); // data byte 3
907
        write_register(8'd15, 8'hbc); // data byte 4
908
        write_register(8'd16, 8'hde); // data byte 5
909
        write_register(8'd17, 8'hf0); // data byte 6
910
        write_register(8'd18, 8'h0f); // data byte 7
911
        write_register(8'd19, 8'hed); // data byte 8
912
      end
913
 
914 35 mohor
 
915
    // Enable irqs (basic mode)
916
    write_register(8'd0, 8'h1e);
917
 
918
 
919 25 mohor
 
920
    fork
921
      begin
922
        $display("\n\nStart receiving data from CAN bus");
923
        receive_frame(0, 0, {26'h00000e8, 3'h1}, 4'h1, 15'h30bb); // mode, rtr, id, length, crc
924
        receive_frame(0, 0, {26'h00000e8, 3'h1}, 4'h2, 15'h2da1); // mode, rtr, id, length, crc
925
        receive_frame(0, 0, {26'h00000ee, 3'h1}, 4'h0, 15'h6cea); // mode, rtr, id, length, crc
926
        receive_frame(0, 0, {26'h00000ee, 3'h1}, 4'h1, 15'h00c5); // mode, rtr, id, length, crc
927
        receive_frame(0, 0, {26'h00000ee, 3'h1}, 4'h2, 15'h7b4a); // mode, rtr, id, length, crc
928 28 mohor
 
929 25 mohor
      end
930
 
931
      begin
932 38 mohor
        tx_request_command;
933 25 mohor
      end
934
 
935
      begin
936
        // Transmitting acknowledge
937
        wait (can_testbench.i_can_top.i_can_bsp.tx_state & can_testbench.i_can_top.i_can_bsp.rx_ack);
938 28 mohor
        #1 rx = 0;
939 25 mohor
        wait (can_testbench.i_can_top.i_can_bsp.rx_ack_lim);
940 28 mohor
        #1 rx = 1;
941 25 mohor
      end
942
 
943 34 mohor
 
944 25 mohor
    join
945
 
946
    read_receive_buffer;
947 38 mohor
    release_rx_buffer_command;
948
    release_rx_buffer_command;
949 25 mohor
    read_receive_buffer;
950 38 mohor
    release_rx_buffer_command;
951 25 mohor
    read_receive_buffer;
952 38 mohor
    release_rx_buffer_command;
953 25 mohor
    read_receive_buffer;
954 38 mohor
    release_rx_buffer_command;
955 25 mohor
    read_receive_buffer;
956
 
957
    #200000;
958
 
959
    read_receive_buffer;
960
 
961 35 mohor
    // Read irq register
962
    read_register(8'd3);
963
    #1000;
964
 
965 18 mohor
  end
966 35 mohor
endtask   // send_frame
967 18 mohor
 
968
 
969
 
970 38 mohor
task self_reception_request;    // CAN IP core sends sets self reception mode and transmits a msg. This test runs in EXTENDED mode
971
  begin
972
 
973
    // Switch-on reset mode
974
    write_register(8'd0, {7'h0, (`CAN_MODE_RESET)});
975
 
976
    // Set Clock Divider register
977
    extended_mode = 1'b1;
978
    write_register(8'd31, {extended_mode, 7'h0});    // Setting the extended mode
979
 
980
    // Set Acceptance Code and Acceptance Mask registers
981
    write_register(8'd16, 8'ha6); // acceptance code 0
982
    write_register(8'd17, 8'hb0); // acceptance code 1
983
    write_register(8'd18, 8'h12); // acceptance code 2
984
    write_register(8'd19, 8'h30); // acceptance code 3
985
    write_register(8'd20, 8'h00); // acceptance mask 0
986
    write_register(8'd21, 8'h00); // acceptance mask 1
987
    write_register(8'd22, 8'h00); // acceptance mask 2
988
    write_register(8'd23, 8'h00); // acceptance mask 3
989
 
990
    // Setting the "self test mode"
991
    write_register(8'd0, 8'h4);
992
 
993
    // Switch-off reset mode
994
    write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)});
995
 
996
    // After exiting the reset mode sending bus free
997
    repeat (11) send_bit(1);
998
 
999
 
1000
    // Writing TX frame information + identifier + data
1001
    write_register(8'd16, 8'h45);   // Frame format = 0, Remote transmision request = 1, DLC = 5
1002
    write_register(8'd17, 8'ha6);   // ID[28:21] = a6
1003
    write_register(8'd18, 8'ha0);   // ID[20:18] = 5
1004
    // write_register(8'd19, 8'h78); RTR does not send any data
1005
    // write_register(8'd20, 8'h9a);
1006
    // write_register(8'd21, 8'hbc);
1007
    // write_register(8'd22, 8'hde);
1008
    // write_register(8'd23, 8'hf0);
1009
    // write_register(8'd24, 8'h0f);
1010
    // write_register(8'd25, 8'hed);
1011
    // write_register(8'd26, 8'hcb);
1012
    // write_register(8'd27, 8'ha9);
1013
    // write_register(8'd28, 8'h87);
1014
 
1015
 
1016
    // Enabling IRQ's (extended mode)
1017
    write_register(8'd4, 8'hff);
1018
 
1019
//    tx_request_command;
1020
    self_reception_request_command;
1021
 
1022
    #400000;
1023
 
1024
    read_receive_buffer;
1025
    release_rx_buffer_command;
1026
    release_rx_buffer_command;
1027
    read_receive_buffer;
1028
    release_rx_buffer_command;
1029
    read_receive_buffer;
1030
    release_rx_buffer_command;
1031
    read_receive_buffer;
1032
    release_rx_buffer_command;
1033
    read_receive_buffer;
1034
 
1035
 
1036
    read_receive_buffer;
1037
 
1038
    // Read irq register
1039
    read_register(8'd3);
1040
    #1000;
1041
 
1042
  end
1043
endtask   // self_reception_request
1044
 
1045
 
1046
 
1047 16 mohor
task test_empty_fifo;
1048
  begin
1049 15 mohor
 
1050 38 mohor
    // Enable irqs (basic mode)
1051
    write_register(8'd0, 8'h1e);
1052
 
1053
    receive_frame(0, 0, {26'h00000e8, 3'h1}, 4'h3, 15'h56a9); // mode, rtr, id, length, crc
1054
    receive_frame(0, 0, {26'h00000e8, 3'h1}, 4'h7, 15'h391d); // mode, rtr, id, length, crc
1055
 
1056 16 mohor
    read_receive_buffer;
1057
    fifo_info;
1058 15 mohor
 
1059 38 mohor
    release_rx_buffer_command;
1060 16 mohor
    $display("\n\n");
1061
    read_receive_buffer;
1062
    fifo_info;
1063 15 mohor
 
1064 38 mohor
    release_rx_buffer_command;
1065 16 mohor
    $display("\n\n");
1066
    read_receive_buffer;
1067
    fifo_info;
1068 15 mohor
 
1069 38 mohor
    release_rx_buffer_command;
1070 16 mohor
    $display("\n\n");
1071
    read_receive_buffer;
1072
    fifo_info;
1073 15 mohor
 
1074 38 mohor
    receive_frame(0, 0, {26'h00000e8, 3'h1}, 4'h8, 15'h70e0); // mode, rtr, id, length, crc
1075 15 mohor
 
1076 16 mohor
    $display("\n\n");
1077
    read_receive_buffer;
1078
    fifo_info;
1079 2 mohor
 
1080 38 mohor
    release_rx_buffer_command;
1081 16 mohor
    $display("\n\n");
1082
    read_receive_buffer;
1083
    fifo_info;
1084 2 mohor
 
1085 38 mohor
    release_rx_buffer_command;
1086 16 mohor
    $display("\n\n");
1087
    read_receive_buffer;
1088
    fifo_info;
1089
  end
1090
endtask
1091 2 mohor
 
1092
 
1093 16 mohor
 
1094 20 mohor
task test_empty_fifo_ext;
1095
  begin
1096
    receive_frame(1, 0, 29'h14d60246, 4'h3, 15'h5262); // mode, rtr, id, length, crc
1097
    receive_frame(1, 0, 29'h14d60246, 4'h7, 15'h1730); // mode, rtr, id, length, crc
1098
 
1099
    read_receive_buffer;
1100
    fifo_info;
1101
 
1102 38 mohor
    release_rx_buffer_command;
1103 20 mohor
    $display("\n\n");
1104
    read_receive_buffer;
1105
    fifo_info;
1106
 
1107 38 mohor
    release_rx_buffer_command;
1108 20 mohor
    $display("\n\n");
1109
    read_receive_buffer;
1110
    fifo_info;
1111
 
1112 38 mohor
    release_rx_buffer_command;
1113 20 mohor
    $display("\n\n");
1114
    read_receive_buffer;
1115
    fifo_info;
1116
 
1117
    receive_frame(1, 0, 29'h14d60246, 4'h8, 15'h2f7a); // mode, rtr, id, length, crc
1118
 
1119
    $display("\n\n");
1120
    read_receive_buffer;
1121
    fifo_info;
1122
 
1123 38 mohor
    release_rx_buffer_command;
1124 20 mohor
    $display("\n\n");
1125
    read_receive_buffer;
1126
    fifo_info;
1127
 
1128 38 mohor
    release_rx_buffer_command;
1129 20 mohor
    $display("\n\n");
1130
    read_receive_buffer;
1131
    fifo_info;
1132
  end
1133
endtask
1134
 
1135
 
1136
 
1137 16 mohor
task test_full_fifo;
1138
  begin
1139 35 mohor
 
1140
    // Enable irqs (basic mode)
1141
    write_register(8'd0, 8'h1e);
1142
 
1143 38 mohor
    release_rx_buffer_command;
1144 16 mohor
    $display("\n\n");
1145
    read_receive_buffer;
1146
    fifo_info;
1147
 
1148 18 mohor
    receive_frame(0, 0, {26'h0000008, 3'h1}, 4'h0, 15'h4edd); // mode, rtr, id, length, crc
1149 16 mohor
    fifo_info;
1150 18 mohor
    receive_frame(0, 0, {26'h0000008, 3'h1}, 4'h1, 15'h1ccf); // mode, rtr, id, length, crc
1151 16 mohor
    fifo_info;
1152 18 mohor
    receive_frame(0, 0, {26'h0000008, 3'h1}, 4'h2, 15'h73f4); // mode, rtr, id, length, crc
1153 16 mohor
    fifo_info;
1154 18 mohor
    receive_frame(0, 0, {26'h0000008, 3'h1}, 4'h3, 15'h7bcb); // mode, rtr, id, length, crc
1155 16 mohor
    fifo_info;
1156 18 mohor
    receive_frame(0, 0, {26'h0000008, 3'h1}, 4'h4, 15'h37da); // mode, rtr, id, length, crc
1157 16 mohor
    fifo_info;
1158 18 mohor
    receive_frame(0, 0, {26'h0000008, 3'h1}, 4'h5, 15'h7e15); // mode, rtr, id, length, crc
1159 16 mohor
    fifo_info;
1160 18 mohor
    receive_frame(0, 0, {26'h0000008, 3'h1}, 4'h6, 15'h39cf); // mode, rtr, id, length, crc
1161 16 mohor
    fifo_info;
1162 18 mohor
    receive_frame(0, 0, {26'h0000008, 3'h1}, 4'h7, 15'h085c); // mode, rtr, id, length, crc
1163 16 mohor
    fifo_info;
1164 18 mohor
    receive_frame(0, 0, {26'h0000008, 3'h1}, 4'h8, 15'h57a0); // mode, rtr, id, length, crc
1165 16 mohor
    fifo_info;
1166 18 mohor
    receive_frame(0, 0, {26'h0000008, 3'h1}, 4'h8, 15'h57a0); // mode, rtr, id, length, crc
1167 16 mohor
    fifo_info;
1168 35 mohor
$display("FIFO should be full now");
1169
 
1170
    // Following one is accepted with overrun
1171 18 mohor
    receive_frame(0, 0, {26'h0000008, 3'h1}, 4'h8, 15'h57a0); // mode, rtr, id, length, crc
1172 16 mohor
    fifo_info;
1173 35 mohor
 
1174 38 mohor
    release_rx_buffer_command;
1175 16 mohor
    fifo_info;
1176 35 mohor
 
1177
    // Space just enough for the following frame.
1178
    receive_frame(0, 0, {26'h0000008, 3'h1}, 4'h0, 15'h4edd); // mode, rtr, id, length, crc
1179
    fifo_info;
1180
 
1181
    // Following accepted with overrun
1182 18 mohor
    receive_frame(0, 0, {26'h0000008, 3'h1}, 4'h8, 15'h57a0); // mode, rtr, id, length, crc
1183 16 mohor
    fifo_info;
1184
    read_overrun_info(0, 15);
1185
 
1186 38 mohor
    release_rx_buffer_command;
1187
    release_rx_buffer_command;
1188 35 mohor
 
1189 38 mohor
    release_rx_buffer_command;
1190 16 mohor
    read_receive_buffer;
1191
    fifo_info;
1192 18 mohor
    receive_frame(0, 0, {26'h0000008, 3'h1}, 4'h8, 15'h57a0); // mode, rtr, id, length, crc
1193 16 mohor
    fifo_info;
1194
    read_overrun_info(0, 15);
1195
    $display("\n\n");
1196
 
1197 38 mohor
    release_rx_buffer_command;
1198 16 mohor
    read_receive_buffer;
1199
    fifo_info;
1200
 
1201 38 mohor
    release_rx_buffer_command;
1202 16 mohor
    read_receive_buffer;
1203
    fifo_info;
1204
 
1205 38 mohor
    release_rx_buffer_command;
1206 16 mohor
    read_receive_buffer;
1207
    fifo_info;
1208
 
1209 38 mohor
    release_rx_buffer_command;
1210 16 mohor
    read_receive_buffer;
1211
    fifo_info;
1212
 
1213 38 mohor
    release_rx_buffer_command;
1214 16 mohor
    read_receive_buffer;
1215
    fifo_info;
1216
 
1217 38 mohor
    release_rx_buffer_command;
1218 16 mohor
    read_receive_buffer;
1219
    fifo_info;
1220
 
1221 38 mohor
    clear_data_overrun_command;
1222 35 mohor
 
1223 38 mohor
    release_rx_buffer_command;
1224 16 mohor
    read_receive_buffer;
1225
    fifo_info;
1226
 
1227 38 mohor
    release_rx_buffer_command;
1228 16 mohor
    read_receive_buffer;
1229
    fifo_info;
1230
 
1231 38 mohor
    clear_data_overrun_command;
1232 35 mohor
 
1233 38 mohor
    release_rx_buffer_command;
1234 16 mohor
    read_receive_buffer;
1235
    fifo_info;
1236
 
1237 38 mohor
    release_rx_buffer_command;
1238 16 mohor
    read_receive_buffer;
1239
    fifo_info;
1240
 
1241 38 mohor
    release_rx_buffer_command;
1242 16 mohor
    read_receive_buffer;
1243
    fifo_info;
1244
 
1245 38 mohor
    release_rx_buffer_command;
1246 16 mohor
    read_receive_buffer;
1247
    fifo_info;
1248
 
1249 38 mohor
    release_rx_buffer_command;
1250 16 mohor
    read_receive_buffer;
1251
    fifo_info;
1252
 
1253 35 mohor
    // Read irq register
1254
    read_register(8'd3);
1255
 
1256
    // Read irq register
1257
    read_register(8'd3);
1258
    #1000;
1259
 
1260 16 mohor
  end
1261
endtask
1262
 
1263
 
1264
 
1265 20 mohor
task test_full_fifo_ext;
1266
  begin
1267 38 mohor
    release_rx_buffer_command;
1268 20 mohor
    $display("\n\n");
1269
    read_receive_buffer;
1270
    fifo_info;
1271
 
1272
    receive_frame(1, 0, 29'h14d60246, 4'h0, 15'h6f54); // mode, rtr, id, length, crc
1273
    read_receive_buffer;
1274
    fifo_info;
1275
    receive_frame(1, 0, 29'h14d60246, 4'h1, 15'h6d38); // mode, rtr, id, length, crc
1276
    read_receive_buffer;
1277
    fifo_info;
1278
    receive_frame(1, 0, 29'h14d60246, 4'h2, 15'h053e); // mode, rtr, id, length, crc
1279
    fifo_info;
1280
    read_receive_buffer;
1281
    receive_frame(1, 0, 29'h14d60246, 4'h3, 15'h5262); // mode, rtr, id, length, crc
1282
    fifo_info;
1283
    receive_frame(1, 0, 29'h14d60246, 4'h4, 15'h4bba); // mode, rtr, id, length, crc
1284
    fifo_info;
1285
    receive_frame(1, 0, 29'h14d60246, 4'h5, 15'h4d7d); // mode, rtr, id, length, crc
1286
    fifo_info;
1287
    receive_frame(1, 0, 29'h14d60246, 4'h6, 15'h6f40); // mode, rtr, id, length, crc
1288
    fifo_info;
1289
    receive_frame(1, 0, 29'h14d60246, 4'h7, 15'h1730); // mode, rtr, id, length, crc
1290
    fifo_info;
1291
    read_overrun_info(0, 10);
1292
 
1293 38 mohor
    release_rx_buffer_command;
1294
    release_rx_buffer_command;
1295 20 mohor
    fifo_info;
1296
    receive_frame(1, 0, 29'h14d60246, 4'h8, 15'h2f7a); // mode, rtr, id, length, crc
1297
    fifo_info;
1298
    read_overrun_info(0, 15);
1299
    $display("\n\n");
1300
 
1301 38 mohor
    release_rx_buffer_command;
1302 20 mohor
    read_receive_buffer;
1303
    fifo_info;
1304
 
1305 38 mohor
    release_rx_buffer_command;
1306 20 mohor
    read_receive_buffer;
1307
    fifo_info;
1308
 
1309 38 mohor
    release_rx_buffer_command;
1310 20 mohor
    read_receive_buffer;
1311
    fifo_info;
1312
 
1313 38 mohor
    release_rx_buffer_command;
1314 20 mohor
    read_receive_buffer;
1315
    fifo_info;
1316
 
1317 38 mohor
    release_rx_buffer_command;
1318 20 mohor
    read_receive_buffer;
1319
    fifo_info;
1320
 
1321 38 mohor
    release_rx_buffer_command;
1322 20 mohor
    read_receive_buffer;
1323
    fifo_info;
1324
 
1325 38 mohor
    release_rx_buffer_command;
1326 20 mohor
    read_receive_buffer;
1327
    fifo_info;
1328
 
1329
  end
1330
endtask
1331
 
1332
 
1333
 
1334 16 mohor
task initialize_fifo;
1335
  integer i;
1336
  begin
1337
    for (i=0; i<32; i=i+1)
1338
      begin
1339
        can_testbench.i_can_top.i_can_bsp.i_can_fifo.length_info[i] = 0;
1340
        can_testbench.i_can_top.i_can_bsp.i_can_fifo.overrun_info[i] = 0;
1341
      end
1342
 
1343
    for (i=0; i<64; i=i+1)
1344
      begin
1345
        can_testbench.i_can_top.i_can_bsp.i_can_fifo.fifo[i] = 0;
1346
      end
1347
 
1348
    $display("(%0t) Fifo initialized", $time);
1349
  end
1350
endtask
1351
 
1352
 
1353
task read_overrun_info;
1354
  input [4:0] start_addr;
1355
  input [4:0] end_addr;
1356
  integer i;
1357
  begin
1358
    for (i=start_addr; i<=end_addr; i=i+1)
1359
      begin
1360
        $display("len[0x%0x]=0x%0x", i, can_testbench.i_can_top.i_can_bsp.i_can_fifo.length_info[i]);
1361
        $display("overrun[0x%0x]=0x%0x\n", i, can_testbench.i_can_top.i_can_bsp.i_can_fifo.overrun_info[i]);
1362
      end
1363
  end
1364
endtask
1365
 
1366
 
1367 24 mohor
task fifo_info;   // Displaying how many packets and how many bytes are in fifo. Not working when wr_info_pointer is smaller than rd_info_pointer.
1368 16 mohor
  begin
1369 24 mohor
      $display("(%0t) Currently %0d bytes in fifo (%0d packets)", $time, can_testbench.i_can_top.i_can_bsp.i_can_fifo.fifo_cnt,
1370
      (can_testbench.i_can_top.i_can_bsp.i_can_fifo.wr_info_pointer - can_testbench.i_can_top.i_can_bsp.i_can_fifo.rd_info_pointer));
1371 16 mohor
end
1372
endtask
1373
 
1374
 
1375 14 mohor
task read_register;
1376
  input [7:0] reg_addr;
1377
 
1378
  begin
1379 34 mohor
    wait (wb_free);
1380
    wb_free = 0;
1381 31 mohor
    @ (posedge wb_clk_i);
1382 14 mohor
    #1;
1383 31 mohor
    wb_adr_i = reg_addr;
1384
    wb_cyc_i = 1;
1385
    wb_stb_i = 1;
1386
    wb_we_i = 0;
1387
    wait (wb_ack_o);
1388
    $display("(%0t) Reading register [%0d] = 0x%0x", $time, wb_adr_i, wb_dat_o);
1389
    @ (posedge wb_clk_i);
1390 14 mohor
    #1;
1391 31 mohor
    wb_adr_i = 'hz;
1392
    wb_cyc_i = 0;
1393
    wb_stb_i = 0;
1394
    wb_we_i = 'hz;
1395 34 mohor
    wb_free = 1;
1396 14 mohor
  end
1397
endtask
1398
 
1399
 
1400 2 mohor
task write_register;
1401
  input [7:0] reg_addr;
1402
  input [7:0] reg_data;
1403
 
1404
  begin
1405 34 mohor
    wait (wb_free);
1406
    wb_free = 0;
1407 31 mohor
    @ (posedge wb_clk_i);
1408 2 mohor
    #1;
1409 31 mohor
    wb_adr_i = reg_addr;
1410
    wb_dat_i = reg_data;
1411
    wb_cyc_i = 1;
1412
    wb_stb_i = 1;
1413
    wb_we_i = 1;
1414
    wait (wb_ack_o);
1415
    @ (posedge wb_clk_i);
1416 2 mohor
    #1;
1417 31 mohor
    wb_adr_i = 'hz;
1418
    wb_dat_i = 'hz;
1419
    wb_cyc_i = 0;
1420
    wb_stb_i = 0;
1421
    wb_we_i = 'hz;
1422 34 mohor
    wb_free = 1;
1423 2 mohor
  end
1424
endtask
1425 7 mohor
 
1426
 
1427 15 mohor
task read_receive_buffer;
1428
  integer i;
1429
  begin
1430 38 mohor
    if(extended_mode)   // Extended mode
1431 15 mohor
      begin
1432 17 mohor
        for (i=8'd16; i<=8'd28; i=i+1)
1433 15 mohor
          read_register(i);
1434 16 mohor
        if (can_testbench.i_can_top.i_can_bsp.i_can_fifo.overrun_info[can_testbench.i_can_top.i_can_bsp.i_can_fifo.rd_info_pointer])
1435
          $display("\nWARNING: This packet was received with overrun.");
1436 15 mohor
      end
1437
    else
1438
      begin
1439 17 mohor
        for (i=8'd20; i<=8'd29; i=i+1)
1440 15 mohor
          read_register(i);
1441 16 mohor
        if (can_testbench.i_can_top.i_can_bsp.i_can_fifo.overrun_info[can_testbench.i_can_top.i_can_bsp.i_can_fifo.rd_info_pointer])
1442
          $display("\nWARNING: This packet was received with overrun.");
1443 15 mohor
      end
1444
  end
1445
endtask
1446
 
1447
 
1448 38 mohor
task release_rx_buffer_command;
1449 15 mohor
  begin
1450 17 mohor
    write_register(8'd1, 8'h4);
1451 16 mohor
    $display("(%0t) Rx buffer released.", $time);
1452 15 mohor
  end
1453
endtask
1454
 
1455
 
1456 38 mohor
task tx_request_command;
1457 25 mohor
  begin
1458
    write_register(8'd1, 8'h1);
1459
    $display("(%0t) Tx requested.", $time);
1460
  end
1461
endtask
1462
 
1463
 
1464 38 mohor
task tx_abort_command;
1465 34 mohor
  begin
1466
    write_register(8'd1, 8'h2);
1467
    $display("(%0t) Tx abort requested.", $time);
1468
  end
1469
endtask
1470
 
1471
 
1472 38 mohor
task clear_data_overrun_command;
1473 35 mohor
  begin
1474
    write_register(8'd1, 8'h8);
1475
    $display("(%0t) Data overrun cleared.", $time);
1476
  end
1477
endtask
1478
 
1479
 
1480 38 mohor
task self_reception_request_command;
1481
  begin
1482
    write_register(8'd1, 8'h10);
1483
    $display("(%0t) Self reception requested.", $time);
1484
  end
1485
endtask
1486
 
1487
 
1488 8 mohor
task test_synchronization;
1489
  begin
1490
    // Hard synchronization
1491
    #1 rx=0;
1492
    repeat (2*BRP) @ (posedge clk);
1493
    repeat (8*BRP) @ (posedge clk);
1494
    #1 rx=1;
1495
    repeat (10*BRP) @ (posedge clk);
1496
 
1497
    // Resynchronization on time
1498
    #1 rx=0;
1499
    repeat (10*BRP) @ (posedge clk);
1500
    #1 rx=1;
1501
    repeat (10*BRP) @ (posedge clk);
1502
 
1503
    // Resynchronization late
1504
    repeat (BRP) @ (posedge clk);
1505
    repeat (BRP) @ (posedge clk);
1506
    #1 rx=0;
1507
    repeat (10*BRP) @ (posedge clk);
1508
    #1 rx=1;
1509
 
1510
    // Resynchronization early
1511
    repeat (8*BRP) @ (posedge clk);   // two frames too early
1512
    #1 rx=0;
1513
    repeat (10*BRP) @ (posedge clk);
1514
    #1 rx=1;
1515
    repeat (10*BRP) @ (posedge clk);
1516
  end
1517
endtask
1518 7 mohor
 
1519 8 mohor
 
1520 9 mohor
task send_bit;
1521
  input bit;
1522
  integer cnt;
1523
  begin
1524
    #1 rx=bit;
1525
    repeat ((`CAN_TIMING1_TSEG1 + `CAN_TIMING1_TSEG2 + 3)*BRP) @ (posedge clk);
1526
  end
1527
endtask
1528
 
1529
 
1530 18 mohor
task receive_frame;           // CAN IP core receives frames
1531 8 mohor
  input mode;
1532 11 mohor
  input remote_trans_req;
1533 9 mohor
  input [28:0] id;
1534
  input  [3:0] length;
1535 11 mohor
  input [14:0] crc;
1536 25 mohor
 
1537 15 mohor
  reg [117:0] data;
1538 16 mohor
  reg         previous_bit;
1539 25 mohor
  reg         stuff;
1540
  reg         tmp;
1541
  reg         arbitration_lost;
1542
  integer     pointer;
1543
  integer     cnt;
1544
  integer     total_bits;
1545
  integer     stuff_cnt;
1546 24 mohor
 
1547 15 mohor
  begin
1548 9 mohor
 
1549 16 mohor
    stuff_cnt = 1;
1550
    stuff = 0;
1551 15 mohor
 
1552
    if(mode)          // Extended format
1553 20 mohor
      data = {id[28:18], 1'b1, 1'b1, id[17:0], remote_trans_req, 2'h0, length};
1554 15 mohor
    else              // Standard format
1555
      data = {id[10:0], remote_trans_req, 1'b0, 1'b0, length};
1556
 
1557 19 mohor
    if (~remote_trans_req)
1558 15 mohor
      begin
1559 19 mohor
        if(length)    // Send data if length is > 0
1560
          begin
1561
            for (cnt=1; cnt<=(2*length); cnt=cnt+1)  // data   (we are sending nibbles)
1562
              data = {data[113:0], cnt[3:0]};
1563
          end
1564 15 mohor
      end
1565
 
1566
    // Adding CRC
1567
    data = {data[104:0], crc[14:0]};
1568
 
1569
 
1570
    // Calculating pointer that points to the bit that will be send
1571 19 mohor
    if (remote_trans_req)
1572
      begin
1573
        if(mode)          // Extended format
1574 20 mohor
          pointer = 52;
1575 19 mohor
        else              // Standard format
1576
          pointer = 32;
1577
      end
1578
    else
1579
      begin
1580
        if(mode)          // Extended format
1581 20 mohor
          pointer = 52 + 8 * length;
1582 19 mohor
        else              // Standard format
1583
          pointer = 32 + 8 * length;
1584
      end
1585 15 mohor
 
1586
    // This is how many bits we need to shift
1587
    total_bits = pointer;
1588
 
1589 24 mohor
    // Waiting until previous msg is finished before sending another one
1590 34 mohor
    if (arbitration_lost)           //  Arbitration lost. Another node is transmitting. We have to wait until it is finished.
1591
      wait ( (~can_testbench.i_can_top.i_can_bsp.error_frame) &
1592
             (~can_testbench.i_can_top.i_can_bsp.rx_inter   ) &
1593
             (~can_testbench.i_can_top.i_can_bsp.tx_state   )
1594
           );
1595
    else                            // We were transmitter of the previous frame. No need to wait for another node to finish transmission.
1596
      wait ( (~can_testbench.i_can_top.i_can_bsp.error_frame) &
1597
             (~can_testbench.i_can_top.i_can_bsp.rx_inter   )
1598
           );
1599 25 mohor
    arbitration_lost = 0;
1600 15 mohor
 
1601 9 mohor
    send_bit(0);                        // SOF
1602 16 mohor
    previous_bit = 0;
1603 9 mohor
 
1604 25 mohor
    fork
1605 9 mohor
 
1606 25 mohor
    begin
1607 34 mohor
      for (cnt=0; cnt<=total_bits; cnt=cnt+1)
1608 25 mohor
        begin
1609 34 mohor
          if (stuff_cnt == 5)
1610 25 mohor
            begin
1611 34 mohor
              stuff_cnt = 1;
1612
              total_bits = total_bits + 1;
1613
              stuff = 1;
1614
              tmp = ~data[pointer+1];
1615
              send_bit(~data[pointer+1]);
1616
              previous_bit = ~data[pointer+1];
1617
            end
1618
          else
1619
            begin
1620
              if (data[pointer] == previous_bit)
1621
                stuff_cnt <= stuff_cnt + 1;
1622 25 mohor
              else
1623 34 mohor
                stuff_cnt <= 1;
1624
 
1625
              stuff = 0;
1626
              tmp = data[pointer];
1627
              send_bit(data[pointer]);
1628
              previous_bit = data[pointer];
1629
              pointer = pointer - 1;
1630 25 mohor
            end
1631 34 mohor
          if (arbitration_lost)
1632
            cnt=total_bits+1;         // Exit the for loop
1633
        end
1634 25 mohor
 
1635 34 mohor
        // Nothing send after the data (just recessive bit)
1636
        repeat (13) send_bit(1);         // CRC delimiter + ack + ack delimiter + EOF + intermission= 1 + 1 + 1 + 7 + 3
1637 25 mohor
    end
1638
 
1639
    begin
1640 34 mohor
      while (mode ? (cnt<32) : (cnt<12))
1641 25 mohor
        begin
1642
          #1 wait (can_testbench.i_can_top.sample_point);
1643
          if (mode)
1644
            begin
1645
              if (cnt<32 & tmp & (~rx_and_tx))
1646
                begin
1647
                  arbitration_lost = 1;
1648
                  rx = 1;       // Only recessive is send from now on.
1649
                end
1650
            end
1651
          else
1652
            begin
1653
              if (cnt<12 & tmp & (~rx_and_tx))
1654
                begin
1655
                  arbitration_lost = 1;
1656
                  rx = 1;       // Only recessive is send from now on.
1657
                end
1658
            end
1659
        end
1660
    end
1661
 
1662
    join
1663
 
1664 8 mohor
  end
1665
endtask
1666
 
1667
 
1668 16 mohor
 
1669 11 mohor
// State machine monitor (btl)
1670 7 mohor
always @ (posedge clk)
1671
begin
1672
  if(can_testbench.i_can_top.i_can_btl.go_sync & can_testbench.i_can_top.i_can_btl.go_seg1 | can_testbench.i_can_top.i_can_btl.go_sync & can_testbench.i_can_top.i_can_btl.go_seg2 |
1673
     can_testbench.i_can_top.i_can_btl.go_seg1 & can_testbench.i_can_top.i_can_btl.go_seg2)
1674 10 mohor
    begin
1675
      $display("(%0t) ERROR multiple go_sync, go_seg1 or go_seg2 occurance\n\n", $time);
1676
      #1000;
1677
      $stop;
1678
    end
1679 7 mohor
 
1680
  if(can_testbench.i_can_top.i_can_btl.sync & can_testbench.i_can_top.i_can_btl.seg1 | can_testbench.i_can_top.i_can_btl.sync & can_testbench.i_can_top.i_can_btl.seg2 |
1681
     can_testbench.i_can_top.i_can_btl.seg1 & can_testbench.i_can_top.i_can_btl.seg2)
1682 10 mohor
    begin
1683
      $display("(%0t) ERROR multiple sync, seg1 or seg2 occurance\n\n", $time);
1684
      #1000;
1685
      $stop;
1686
    end
1687 7 mohor
end
1688
 
1689 10 mohor
/* stuff_error monitor (bsp)
1690
always @ (posedge clk)
1691
begin
1692
  if(can_testbench.i_can_top.i_can_bsp.stuff_error)
1693
    begin
1694
      $display("\n\n(%0t) Stuff error occured in can_bsp.v file\n\n", $time);
1695
      $stop;                                      After everything is finished add another condition (something like & (~idle)) and enable stop
1696
    end
1697
end
1698
*/
1699
 
1700 18 mohor
//
1701 16 mohor
// CRC monitor (used until proper CRC generation is used in testbench
1702
always @ (posedge clk)
1703
begin
1704 34 mohor
  if (can_testbench.i_can_top.i_can_bsp.rx_ack       &
1705
      can_testbench.i_can_top.i_can_bsp.sample_point &
1706
      can_testbench.i_can_top.i_can_bsp.crc_err
1707
     )
1708 35 mohor
    $display("*E (%0t) ERROR: CRC error (Calculated crc = 0x%0x, crc_in = 0x%0x)", $time, can_testbench.i_can_top.i_can_bsp.calculated_crc, can_testbench.i_can_top.i_can_bsp.crc_in);
1709 16 mohor
end
1710 10 mohor
 
1711 16 mohor
 
1712
 
1713
 
1714 34 mohor
 
1715 16 mohor
/*
1716
// overrun monitor
1717
always @ (posedge clk)
1718
begin
1719
  if (can_testbench.i_can_top.i_can_bsp.i_can_fifo.wr & can_testbench.i_can_top.i_can_bsp.i_can_fifo.fifo_full)
1720
    $display("(%0t)overrun", $time);
1721
end
1722
*/
1723
 
1724
 
1725 22 mohor
// form error monitor
1726
always @ (posedge clk)
1727
begin
1728 28 mohor
  if (can_testbench.i_can_top.i_can_bsp.form_err)
1729 35 mohor
    $display("*E (%0t) ERROR: form_error", $time);
1730 22 mohor
end
1731
 
1732
 
1733 34 mohor
 
1734
// acknowledge error monitor
1735
always @ (posedge clk)
1736
begin
1737
  if (can_testbench.i_can_top.i_can_bsp.ack_err)
1738 35 mohor
    $display("*E (%0t) ERROR: acknowledge_error", $time);
1739 34 mohor
end
1740
 
1741
 
1742 2 mohor
endmodule
1743 16 mohor
 

powered by: WebSVN 2.1.0

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