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 52

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

powered by: WebSVN 2.1.0

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