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 63

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

powered by: WebSVN 2.1.0

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