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 60

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

powered by: WebSVN 2.1.0

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