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 48

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

powered by: WebSVN 2.1.0

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