OpenCores
URL https://opencores.org/ocsvn/can/can/trunk

Subversion Repositories can

[/] [can/] [tags/] [rel_9/] [bench/] [verilog/] [can_testbench.v] - Diff between revs 15 and 16

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 15 Rev 16
Line 43... Line 43...
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
// CVS Revision History
// CVS Revision History
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
 
// Revision 1.10  2003/01/10 17:51:28  mohor
 
// Temporary version (backup).
 
//
// Revision 1.9  2003/01/09 21:54:39  mohor
// Revision 1.9  2003/01/09 21:54:39  mohor
// rx fifo added. Not 100 % verified, yet.
// rx fifo added. Not 100 % verified, yet.
//
//
// Revision 1.8  2003/01/08 02:09:43  mohor
// Revision 1.8  2003/01/08 02:09:43  mohor
// Acceptance filter added.
// Acceptance filter added.
Line 129... Line 132...
  rw = 'hz;
  rw = 'hz;
  addr = 'hz;
  addr = 'hz;
  rx = 1;
  rx = 1;
  rst = 1;
  rst = 1;
  #200 rst = 0;
  #200 rst = 0;
 
  #200 initialize_fifo;
  #200 start_tb = 1;
  #200 start_tb = 1;
end
end
 
 
 
 
// Main testbench
// Main testbench
Line 165... Line 169...
      write_register(8'h23, 8'h0); // acceptance mask 3
      write_register(8'h23, 8'h0); // acceptance mask 3
    end
    end
  else
  else
    begin
    begin
      // Set Acceptance Code and Acceptance Mask registers
      // Set Acceptance Code and Acceptance Mask registers
      write_register(8'h4, 8'ha6); // acceptance code
//      write_register(8'h4, 8'ha6); // acceptance code
 
      write_register(8'h4, 8'h08); // acceptance code
      write_register(8'h5, 8'h00); // acceptance mask
      write_register(8'h5, 8'h00); // acceptance mask
    end
    end
 
 
  #10;
  #10;
  repeat (1000) @ (posedge clk);
  repeat (1000) @ (posedge clk);
Line 191... Line 196...
//      send_frame(0, 1, 29'h12567635, 2, 15'h75b4); // mode, rtr, id, length, crc
//      send_frame(0, 1, 29'h12567635, 2, 15'h75b4); // mode, rtr, id, length, crc
      send_frame(0, 1, {26'h00000a6, 3'h5}, 4'h2, 15'h2a11); // mode, rtr, id, length, crc
      send_frame(0, 1, {26'h00000a6, 3'h5}, 4'h2, 15'h2a11); // mode, rtr, id, length, crc
    end
    end
  else
  else
    begin
    begin
      send_frame(0, 1, {26'h00000a6, 3'h5}, 4'h2, 15'h2a11); // mode, rtr, id, length, crc
//      test_empty_fifo;    test currently switched off
 
      test_full_fifo;
 
    end
 
 
  read_receive_buffer;
 
  $display("\n\n");
 
 
 
      send_frame(0, 1, {26'h00000a6, 3'h5}, 4'h2, 15'h2a11); // mode, rtr, id, length, crc
 
 
  $display("CAN Testbench finished !");
 
  $stop;
    end
    end
 
 
 
 
 
 
 
 
 
task test_empty_fifo;
 
  begin
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h3, 15'h6231); // mode, rtr, id, length, crc
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h7, 15'h6047); // mode, rtr, id, length, crc
 
 
  read_receive_buffer;
  read_receive_buffer;
 
    fifo_info;
 
 
  release_rx_buffer;
  release_rx_buffer;
  $display("\n\n");
  $display("\n\n");
 
    read_receive_buffer;
 
    fifo_info;
 
 
 
    release_rx_buffer;
 
    $display("\n\n");
  read_receive_buffer;
  read_receive_buffer;
 
    fifo_info;
 
 
  release_rx_buffer;
  release_rx_buffer;
  $display("\n\n");
  $display("\n\n");
 
    read_receive_buffer;
 
    fifo_info;
 
 
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h8, 15'h30e1); // mode, rtr, id, length, crc
 
 
 
    $display("\n\n");
  read_receive_buffer;
  read_receive_buffer;
 
    fifo_info;
 
 
  send_frame(0, 1, {26'h00000a6, 3'h5}, 4'h2, 15'h2a11); // mode, rtr, id, length, crc
    release_rx_buffer;
 
    $display("\n\n");
 
    read_receive_buffer;
 
    fifo_info;
 
 
 
    release_rx_buffer;
  $display("\n\n");
  $display("\n\n");
 
    read_receive_buffer;
 
    fifo_info;
 
  end
 
endtask
 
 
 
 
 
 
 
task test_full_fifo;
 
  begin
 
    release_rx_buffer;
 
    $display("\n\n");
  read_receive_buffer;
  read_receive_buffer;
 
    fifo_info;
 
 
 
    read_overrun_info(0, 31);
 
 
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h0, 15'h3d18); // mode, rtr, id, length, crc
 
    read_receive_buffer;
 
    fifo_info;
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h1, 15'h00ca); // mode, rtr, id, length, crc
 
    read_receive_buffer;
 
    fifo_info;
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h2, 15'h744a); // mode, rtr, id, length, crc
 
    fifo_info;
 
    read_receive_buffer;
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h3, 15'h6231); // mode, rtr, id, length, crc
 
    fifo_info;
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h4, 15'h3051); // mode, rtr, id, length, crc
 
    fifo_info;
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h5, 15'h52ef); // mode, rtr, id, length, crc
 
    fifo_info;
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h6, 15'h2c03); // mode, rtr, id, length, crc
 
    fifo_info;
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h7, 15'h6047); // mode, rtr, id, length, crc
 
    fifo_info;
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h8, 15'h30e1); // mode, rtr, id, length, crc
 
    fifo_info;
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h8, 15'h30e1); // mode, rtr, id, length, crc
 
    fifo_info;
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h8, 15'h30e1); // mode, rtr, id, length, crc
 
    fifo_info;
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h8, 15'h30e1); // mode, rtr, id, length, crc
 
    fifo_info;
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h8, 15'h30e1); // mode, rtr, id, length, crc
 
    fifo_info;
 
    read_overrun_info(0, 15);
 
 
 
    release_rx_buffer;
 
    release_rx_buffer;
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    fifo_info;
 
    send_frame(0, 1, {26'h0000008, 3'h1}, 4'h8, 15'h30e1); // mode, rtr, id, length, crc
 
    fifo_info;
 
    read_overrun_info(0, 15);
 
    $display("\n\n");
 
 
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    fifo_info;
 
 
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    fifo_info;
 
 
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    fifo_info;
 
 
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    fifo_info;
 
 
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    fifo_info;
 
 
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    fifo_info;
 
 
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    fifo_info;
 
 
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    fifo_info;
 
 
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    fifo_info;
 
 
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    fifo_info;
 
 
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    fifo_info;
 
 
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    fifo_info;
 
 
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    fifo_info;
 
 
 
 
  $display("CAN Testbench finished.");
 
  $stop;
 
end
end
 
endtask
 
 
 
 
 
 
 
task initialize_fifo;
 
  integer i;
 
  begin
 
    for (i=0; i<32; i=i+1)
 
      begin
 
        can_testbench.i_can_top.i_can_bsp.i_can_fifo.length_info[i] = 0;
 
        can_testbench.i_can_top.i_can_bsp.i_can_fifo.overrun_info[i] = 0;
 
      end
 
 
 
    for (i=0; i<64; i=i+1)
 
      begin
 
        can_testbench.i_can_top.i_can_bsp.i_can_fifo.fifo[i] = 0;
 
      end
 
 
 
    $display("(%0t) Fifo initialized", $time);
 
  end
 
endtask
 
 
 
 
 
task read_overrun_info;
 
  input [4:0] start_addr;
 
  input [4:0] end_addr;
 
  integer i;
 
  begin
 
    for (i=start_addr; i<=end_addr; i=i+1)
 
      begin
 
        $display("len[0x%0x]=0x%0x", i, can_testbench.i_can_top.i_can_bsp.i_can_fifo.length_info[i]);
 
        $display("overrun[0x%0x]=0x%0x\n", i, can_testbench.i_can_top.i_can_bsp.i_can_fifo.overrun_info[i]);
 
      end
 
  end
 
endtask
 
 
 
 
 
task fifo_info;   // displaying how many packets and how many bytes are in fifo
 
  begin
 
    $display("(%0t) Currently %0d bytes in fifo (%0d packets)", $time, can_testbench.i_can_top.i_can_bsp.i_can_fifo.fifo_cnt,
 
    (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));
 
end
 
endtask
 
 
 
 
task read_register;
task read_register;
  input [7:0] reg_addr;
  input [7:0] reg_addr;
 
 
  begin
  begin
Line 274... Line 448...
  begin
  begin
    if(`CAN_CLOCK_DIVIDER_MODE)   // Extended mode
    if(`CAN_CLOCK_DIVIDER_MODE)   // Extended mode
      begin
      begin
        for (i=8'h16; i<=8'h28; i=i+1)
        for (i=8'h16; i<=8'h28; i=i+1)
          read_register(i);
          read_register(i);
 
        if (can_testbench.i_can_top.i_can_bsp.i_can_fifo.overrun_info[can_testbench.i_can_top.i_can_bsp.i_can_fifo.rd_info_pointer])
 
          $display("\nWARNING: This packet was received with overrun.");
      end
      end
    else
    else
      begin
      begin
        for (i=8'h20; i<=8'h29; i=i+1)
        for (i=8'h20; i<=8'h29; i=i+1)
          read_register(i);
          read_register(i);
 
        if (can_testbench.i_can_top.i_can_bsp.i_can_fifo.overrun_info[can_testbench.i_can_top.i_can_bsp.i_can_fifo.rd_info_pointer])
 
          $display("\nWARNING: This packet was received with overrun.");
      end
      end
  end
  end
endtask
endtask
 
 
 
 
task release_rx_buffer;
task release_rx_buffer;
  begin
  begin
      write_register(8'h1, 8'h4);
      write_register(8'h1, 8'h4);
 
    $display("(%0t) Rx buffer released.", $time);
 
    repeat (2) @ (posedge clk);   // Time to decrement all the counters
  end
  end
endtask
endtask
 
 
 
 
task test_synchronization;
task test_synchronization;
Line 344... Line 524...
  integer pointer;
  integer pointer;
  integer cnt;
  integer cnt;
  integer total_bits;
  integer total_bits;
  integer stuff_cnt;
  integer stuff_cnt;
  reg [117:0] data;
  reg [117:0] data;
 
  reg         previous_bit;
 
  reg xxx;
 
  reg stuff;
  begin
  begin
 
 
    stuff_cnt = 0;
    stuff_cnt = 1;
 
    stuff = 0;
 
 
    if(mode)          // Extended format
    if(mode)          // Extended format
      data = {id[28:18], 1'b1, 1'b1, 1'b0, id[17:0], remote_trans_req, 2'h0, length};
      data = {id[28:18], 1'b1, 1'b1, 1'b0, id[17:0], remote_trans_req, 2'h0, length};
    else              // Standard format
    else              // Standard format
      data = {id[10:0], remote_trans_req, 1'b0, 1'b0, length};
      data = {id[10:0], remote_trans_req, 1'b0, 1'b0, length};
Line 374... Line 558...
    // This is how many bits we need to shift
    // This is how many bits we need to shift
    total_bits = pointer;
    total_bits = pointer;
 
 
 
 
    send_bit(0);                        // SOF
    send_bit(0);                        // SOF
 
    previous_bit = 0;
 
 
    for (cnt=0; cnt<=total_bits; cnt =cnt+1)
    for (cnt=0; cnt<=total_bits; cnt =cnt+1)
      begin
      begin
        send_bit(data[pointer]);        // Bit stuffing comes here !!!
 
        pointer = pointer - 1;
 
      end
 
 
 
 
 
    // Nothing send after the data (just recessive bit)
 
    repeat (13) send_bit(1);         // CRC delimiter + ack + ack delimiter + EOF   !!! Check what is the minimum value for which core works ok
 
 
 
 
        xxx = data[pointer];
 
 
 
        if (stuff_cnt == 5)
  end
 
endtask
 
 
 
 
 
task send_frame_old;
 
  input mode;
 
  input remote_trans_req;
 
  input [28:0] id;
 
  input  [3:0] length;
 
  input [14:0] crc;
 
  integer cnt;
 
 
 
  reg [28:0] data;
 
  reg  [3:0] len;
 
  begin
 
 
 
    data = id;
 
    len  = length;
 
 
 
    send_bit(0);                        // SOF
 
 
 
    if(mode)      // Extended format
 
      begin
 
        for (cnt=0; cnt<11; cnt=cnt+1)  // 11 bit ID
 
          begin
 
            send_bit(data[28]);
 
            data=data<<1;
 
          end
 
        send_bit(1);                    // SRR
 
        send_bit(1);                    // IDE
 
 
 
        for (cnt=11; cnt<29; cnt=cnt+1)  // 18 bit ID
 
          begin
          begin
            send_bit(data[28]);
            stuff_cnt = 1;
            data=data<<1;
            total_bits = total_bits + 1;      //    ??????   Check this
 
            stuff = 1;
 
            send_bit(~data[pointer+1]);
 
            previous_bit = ~data[pointer+1];
          end
          end
 
//        else if (data[pointer] == previous_bit)
        send_bit(remote_trans_req);
//          stuff_cnt <= stuff_cnt + 1;
        send_bit(0);                    // r1 (reserved 1)
        else
        send_bit(0);                    // r0 (reserved 0)
 
 
 
        for (cnt=0; cnt<4; cnt=cnt+1)   // DLC (length)
 
          begin
 
            send_bit(len[3]);
 
            len=len<<1;
 
          end
 
      end
 
    else                  // Standard format
 
      begin
 
        for (cnt=0; cnt<11; cnt=cnt+1)  // 11 bit ID
 
          begin
 
            send_bit(data[10]);
 
            data=data<<1;
 
          end
 
        send_bit(remote_trans_req);
 
 
 
        send_bit(0);                    // IDE
 
        send_bit(0);                    // r0 (reserved 0)
 
 
 
        for (cnt=0; cnt<4; cnt=cnt+1)   // DLC (length)
 
          begin
          begin
            send_bit(len[3]);
            if (data[pointer] == previous_bit)
            len=len<<1;
              stuff_cnt <= stuff_cnt + 1;
          end
            else
      end                 // End header
              stuff_cnt <= 1;
 
 
 
 
    if(length)    // Send data if length is > 0
            stuff = 0;
      begin
            send_bit(data[pointer]);        // Bit stuffing comes here !!!
        for (cnt=1; cnt<=(2*length); cnt=cnt+1)  // data   (we are sending nibbles)
            previous_bit = data[pointer];
          begin
            pointer = pointer - 1;
            send_bit(cnt[3]);
 
            send_bit(cnt[2]);
 
            send_bit(cnt[1]);
 
            send_bit(cnt[0]);
 
          end
 
      end
      end
 
 
    // Send CRC
 
    data[14:0] = crc[14:0];
 
    for (cnt=0; cnt<15; cnt=cnt+1)  // 15 bit CRC
 
      begin
 
        send_bit(data[14]);
 
        data=data<<1;
 
      end
      end
 
 
    // Send CRC delimiter
 
    send_bit(1);
 
 
 
    // Send ACK slot
 
    send_bit(1);
 
 
 
    // Send Ack delimiter
 
    send_bit(1);
 
 
 
 
 
    // Nothing send after the data (just recessive bit)
    // Nothing send after the data (just recessive bit)
    send_bit(1);
    repeat (13) send_bit(1);         // CRC delimiter + ack + ack delimiter + EOF   !!! Check what is the minimum value for which core works ok
 
 
 
 
 
 
  end
  end
endtask
endtask
 
 
 
 
 
 
 
 
// State machine monitor (btl)
// State machine monitor (btl)
always @ (posedge clk)
always @ (posedge clk)
begin
begin
  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 |
  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 |
     can_testbench.i_can_top.i_can_btl.go_seg1 & can_testbench.i_can_top.i_can_btl.go_seg2)
     can_testbench.i_can_top.i_can_btl.go_seg1 & can_testbench.i_can_top.i_can_btl.go_seg2)
Line 523... Line 632...
      $stop;                                      After everything is finished add another condition (something like & (~idle)) and enable stop
      $stop;                                      After everything is finished add another condition (something like & (~idle)) and enable stop
    end
    end
end
end
*/
*/
 
 
 
/*
 
// CRC monitor (used until proper CRC generation is used in testbench
 
always @ (posedge clk)
 
begin
 
  if (can_testbench.i_can_top.i_can_bsp.crc_error)
 
    $display("Calculated crc = 0x%0x, crc_in = 0x%0x", can_testbench.i_can_top.i_can_bsp.calculated_crc, can_testbench.i_can_top.i_can_bsp.crc_in);
 
end
 
*/
 
 
 
 
 
 
 
 
 
/*
 
// overrun monitor
 
always @ (posedge clk)
 
begin
 
  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)
 
    $display("(%0t)overrun", $time);
 
end
 
*/
 
 
 
 
endmodule
endmodule
 
 
 No newline at end of file
 No newline at end of file
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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