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 61

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

powered by: WebSVN 2.1.0

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