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

Subversion Repositories can

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

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

Rev 24 Rev 25
Line 43... Line 43...
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
// CVS Revision History
// CVS Revision History
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
 
// Revision 1.17  2003/01/31 01:13:31  mohor
 
// backup.
 
//
// Revision 1.16  2003/01/16 13:36:14  mohor
// Revision 1.16  2003/01/16 13:36:14  mohor
// Form error supported. When receiving messages, last bit of the end-of-frame
// Form error supported. When receiving messages, last bit of the end-of-frame
// does not generate form error. Receiver goes to the idle mode one bit sooner.
// does not generate form error. Receiver goes to the idle mode one bit sooner.
// (CAN specification ver 2.0, part B, page 57).
// (CAN specification ver 2.0, part B, page 57).
//
//
Line 212... Line 215...
    end
    end
  else
  else
    begin
    begin
      // Set Acceptance Code and Acceptance Mask registers
      // Set Acceptance Code and Acceptance Mask registers
//      write_register(8'd4, 8'ha6); // acceptance code
//      write_register(8'd4, 8'ha6); // acceptance code
      write_register(8'd4, 8'h08); // acceptance code
      write_register(8'd4, 8'he8); // acceptance code
      write_register(8'd5, 8'h00); // acceptance mask
      write_register(8'd5, 8'h0f); // acceptance mask
    end
    end
 
 
  #10;
  #10;
  repeat (1000) @ (posedge clk);
  repeat (1000) @ (posedge clk);
 
 
Line 247... Line 250...
//      test_full_fifo;     // test currently switched off
//      test_full_fifo;     // test currently switched off
      send_frame;         // test currently switched on
      send_frame;         // test currently switched on
    end
    end
 
 
 
 
 
 
  $display("CAN Testbench finished !");
  $display("CAN Testbench finished !");
  $stop;
  $stop;
end
end
 
 
 
 
Line 277... Line 279...
        write_register(8'd27, 8'ha9);
        write_register(8'd27, 8'ha9);
        write_register(8'd28, 8'h87);
        write_register(8'd28, 8'h87);
      end
      end
    else
    else
      begin
      begin
        write_register(8'd10, 8'h12); // Writing ID[10:3] = 0x12
        write_register(8'd10, 8'hea); // Writing ID[10:3] = 0xea
        write_register(8'd11, 8'h04); // Writing ID[3:0] = 0x0, rtr = 0, length = 4
        write_register(8'd11, 8'h18); // Writing ID[3:0] = 0x0, rtr = 1, length = 8
        write_register(8'd12, 8'h56); // data byte 1
        write_register(8'd12, 8'h56); // data byte 1
        write_register(8'd13, 8'h78); // data byte 2
        write_register(8'd13, 8'h78); // data byte 2
        write_register(8'd14, 8'h9a); // data byte 3
        write_register(8'd14, 8'h9a); // data byte 3
        write_register(8'd15, 8'hbc); // data byte 4
        write_register(8'd15, 8'hbc); // data byte 4
        write_register(8'd16, 8'hde); // data byte 5
        write_register(8'd16, 8'hde); // data byte 5
        write_register(8'd17, 8'hf0); // data byte 6
        write_register(8'd17, 8'hf0); // data byte 6
        write_register(8'd18, 8'h0f); // data byte 7
        write_register(8'd18, 8'h0f); // data byte 7
        write_register(8'd19, 8'hed); // data byte 8
        write_register(8'd19, 8'hed); // data byte 8
      end
      end
 
 
 
 
 
    fork
 
      begin
 
        $display("\n\nStart receiving data from CAN bus");
 
        receive_frame(0, 0, {26'h00000e8, 3'h1}, 4'h0, 15'h2372); // mode, rtr, id, length, crc
 
        receive_frame(0, 0, {26'h00000e8, 3'h1}, 4'h1, 15'h30bb); // mode, rtr, id, length, crc
 
        receive_frame(0, 0, {26'h00000e8, 3'h1}, 4'h2, 15'h2da1); // mode, rtr, id, length, crc
 
        receive_frame(0, 0, {26'h00000ee, 3'h1}, 4'h0, 15'h6cea); // mode, rtr, id, length, crc
 
        receive_frame(0, 0, {26'h00000ee, 3'h1}, 4'h1, 15'h00c5); // mode, rtr, id, length, crc
 
        receive_frame(0, 0, {26'h00000ee, 3'h1}, 4'h2, 15'h7b4a); // mode, rtr, id, length, crc
 
      end
 
 
 
      begin
 
        tx_request;
 
      end
 
 
 
      begin
 
        // Transmitting acknowledge
 
        wait (can_testbench.i_can_top.i_can_bsp.tx_state & can_testbench.i_can_top.i_can_bsp.rx_ack);
 
        rx = 0;
 
        wait (can_testbench.i_can_top.i_can_bsp.rx_ack_lim);
 
        rx = 1;
 
      end
 
 
 
    join
 
 
 
    read_receive_buffer;
 
    release_rx_buffer;
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    release_rx_buffer;
 
    read_receive_buffer;
 
    release_rx_buffer;
 
    read_receive_buffer;
 
 
 
    #200000;
 
 
 
    read_receive_buffer;
 
 
  end
  end
endtask
endtask
 
 
 
 
 
 
Line 665... Line 708...
    repeat (2) @ (posedge clk);   // Time to decrement all the counters
    repeat (2) @ (posedge clk);   // Time to decrement all the counters
  end
  end
endtask
endtask
 
 
 
 
 
task tx_request;
 
  begin
 
    write_register(8'd1, 8'h1);
 
    $display("(%0t) Tx requested.", $time);
 
    repeat (2) @ (posedge clk);   // Time to decrement all the counters, etc.
 
  end
 
endtask
 
 
 
 
task test_synchronization;
task test_synchronization;
  begin
  begin
    // Hard synchronization
    // Hard synchronization
    #1 rx=0;
    #1 rx=0;
    repeat (2*BRP) @ (posedge clk);
    repeat (2*BRP) @ (posedge clk);
Line 713... Line 765...
  input mode;
  input mode;
  input remote_trans_req;
  input remote_trans_req;
  input [28:0] id;
  input [28:0] id;
  input  [3:0] length;
  input  [3:0] length;
  input [14:0] crc;
  input [14:0] crc;
 
 
 
  reg [117:0] data;
 
  reg         previous_bit;
 
  reg         stuff;
 
  reg         tmp;
 
  reg         arbitration_lost;
  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         previous_bit;
 
  reg stuff;
 
 
 
  begin
  begin
 
 
    stuff_cnt = 1;
    stuff_cnt = 1;
    stuff = 0;
    stuff = 0;
Line 764... Line 819...
 
 
    // This is how many bits we need to shift
    // This is how many bits we need to shift
    total_bits = pointer;
    total_bits = pointer;
 
 
    // Waiting until previous msg is finished before sending another one
    // Waiting until previous msg is finished before sending another one
    wait (~can_testbench.i_can_top.i_can_bsp.error_frame & ~can_testbench.i_can_top.i_can_bsp.rx_inter);
    wait (~can_testbench.i_can_top.i_can_bsp.error_frame & ~can_testbench.i_can_top.i_can_bsp.rx_inter & ~can_testbench.i_can_top.i_can_bsp.tx_state);
 
    arbitration_lost = 0;
 
 
    send_bit(0);                        // SOF
    send_bit(0);                        // SOF
    previous_bit = 0;
    previous_bit = 0;
 
 
 
    fork
 
 
 
    begin
 
      while (~arbitration_lost)
 
        begin
    for (cnt=0; cnt<=total_bits; cnt=cnt+1)
    for (cnt=0; cnt<=total_bits; cnt=cnt+1)
      begin
      begin
        if (stuff_cnt == 5)
        if (stuff_cnt == 5)
          begin
          begin
            stuff_cnt = 1;
            stuff_cnt = 1;
            total_bits = total_bits + 1;
            total_bits = total_bits + 1;
            stuff = 1;
            stuff = 1;
 
                  tmp = ~data[pointer+1];
            send_bit(~data[pointer+1]);
            send_bit(~data[pointer+1]);
            previous_bit = ~data[pointer+1];
            previous_bit = ~data[pointer+1];
          end
          end
        else
        else
          begin
          begin
Line 787... Line 849...
              stuff_cnt <= stuff_cnt + 1;
              stuff_cnt <= stuff_cnt + 1;
            else
            else
              stuff_cnt <= 1;
              stuff_cnt <= 1;
 
 
            stuff = 0;
            stuff = 0;
 
                  tmp = data[pointer];
            send_bit(data[pointer]);
            send_bit(data[pointer]);
            previous_bit = data[pointer];
            previous_bit = data[pointer];
            pointer = pointer - 1;
            pointer = pointer - 1;
          end
          end
 
              if (arbitration_lost)
 
                cnt=total_bits+1;         // Exit the for loop
      end
      end
 
            arbitration_lost = 1; // At the end we exit the while loop
 
 
    // Nothing send after the data (just recessive bit)
    // Nothing send after the data (just recessive bit)
    repeat (13) send_bit(1);         // CRC delimiter + ack + ack delimiter + EOF + intermission= 1 + 1 + 1 + 7 + 3
    repeat (13) send_bit(1);         // CRC delimiter + ack + ack delimiter + EOF + intermission= 1 + 1 + 1 + 7 + 3
  end
  end
 
    end
 
 
 
    begin
 
      while (~arbitration_lost)
 
        begin
 
          #1 wait (can_testbench.i_can_top.sample_point);
 
//          $display("(%0t)", $time);
 
          if (mode)
 
            begin
 
              if (cnt<32 & tmp & (~rx_and_tx))
 
                begin
 
                  arbitration_lost = 1;
 
                  rx = 1;       // Only recessive is send from now on.
 
                end
 
            end
 
          else
 
            begin
 
              if (cnt<12 & tmp & (~rx_and_tx))
 
                begin
 
                  arbitration_lost = 1;
 
                  rx = 1;       // Only recessive is send from now on.
 
                end
 
            end
 
        end
 
    end
 
 
 
    join
 
 
 
//    // Nothing send after the data (just recessive bit)
 
//    repeat (13) send_bit(1);         // CRC delimiter + ack + ack delimiter + EOF + intermission= 1 + 1 + 1 + 7 + 3
 
  end
endtask
endtask
 
 
 
 
 
 
// State machine monitor (btl)
// State machine monitor (btl)

powered by: WebSVN 2.1.0

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