LOGIN   :::   RECOVER PASS   :::   GET ACCOUNT    
Browse
  • Projects
  • Code (CVS)
  • Forums
  • News
  • Articles
  • Polls
  •  
    OpenCores
  • FAQ
  • CVS HowTo
  • Mission
  • Media
  • Tools
  • Advertise
  • Mirrors
  • Logos
  • Contact us
  • Find Resources
  • Job Opportunity
  •  
    Tools
  • Search
      
  • Download Cores (CVSGet)
  •  
    More
  • Wishbone
  • Perlilog
  • EDA tools
  • OpenTech CD
  •  
    Navigation: All forums > Cvs-checkins > Message List > Message Post

    Message

    Reply | Reply all
    Date Prev | Date Next | Thread Prev | Thread Next Date Index | Thread Index

    From: cvs at opencores.org<cvs@o...>
    Date: Tue Apr 25 15:17:59 CEST 2006
    Subject: [cvs-checkins] MODIFIED: can ...
    Top
    Date: 00/06/04 25:15:17

    Modified: can/bench/verilog can_testbench.v can_testbench_defines.v
    Log:
    New tests for testing the bus-off.






    Revision Changes Path
    1.42 can/bench/verilog/can_testbench.v

    http://www.opencores.org/cvsweb.shtml/can/bench/verilog/can_testbench.v.diff?r1=1.41&r2=1.42

    (In the diff below, changes in quantity of whitespace are not shown.)

    Index: can_testbench.v
    ===================================================================
    RCS file: /home/oc/cvs/can/bench/verilog/can_testbench.v,v
    retrieving revision 1.41
    retrieving revision 1.42
    diff -u -b -r1.41 -r1.42
    --- can_testbench.v 11 Jul 2005 10:25:13 -0000 1.41
    +++ can_testbench.v 25 Apr 2006 13:17:59 -0000 1.42
    @@ -50,6 +50,9 @@
    // CVS Revision History
    //
    // $Log: can_testbench.v,v $
    +// Revision 1.42 2006/04/25 13:17:59 igorm
    +// New tests for testing the bus-off.
    +//
    // Revision 1.41 2005/07/11 10:25:13 igorm
    // Fixing overrun problems.
    //
    @@ -247,6 +250,7 @@
    reg tx_bypassed;
    reg extended_mode;

    +event igor;

    // Instantiate can_top module
    can_top i_can_top
    @@ -330,12 +334,13 @@
    wire tx_tmp1;
    wire tx_tmp2;

    -assign tx_tmp1 = bus_off_on? tx_i : 1'bz;
    -assign tx_tmp2 = bus_off2_on? tx2_i : 1'bz;
    +assign tx_tmp1 = bus_off_on? tx_i : 1'b1;
    +assign tx_tmp2 = bus_off2_on? tx2_i : 1'b1;

    assign tx = tx_tmp1 & tx_tmp2;


    +
    `ifdef CAN_WISHBONE_IF
    // Generate wishbone clock signal 10 MHz
    initial
    @@ -354,10 +359,12 @@


    // Generate clock signal 25 MHz
    +// Generate clock signal 16 MHz
    initial
    begin
    clk=0;
    - forever #20 clk = ~clk;
    + //forever #20 clk = ~clk;
    + forever #31.25 clk = ~clk;
    end


    @@ -479,7 +486,7 @@
    // test_full_fifo_ext; // test currently switched off
    // send_frame_ext; // test currently switched off
    // test_empty_fifo; // test currently switched off
    - test_full_fifo; // test currently switched off
    +// test_full_fifo; // test currently switched off
    // test_reset_mode; // test currently switched off
    // bus_off_test; // test currently switched off
    // forced_bus_off; // test currently switched off
    @@ -488,12 +495,236 @@
    // self_reception_request; // test currently switched off
    // manual_frame_basic; // test currently switched off
    // manual_frame_ext; // test currently switched off
    +// error_test;
    +// register_test;
    + bus_off_recovery_test;
    +
    +
    +/*
    + #5000;
    + $display("\n\nStart rx/tx err cnt\n");
    + -> igor;
    +
    + // Switch-off reset mode
    + $display("Rest mode ON");
    + write_register(8'd0, {7'h0, (`CAN_MODE_RESET)});
    +
    + $display("Set extended mode");
    + extended_mode = 1'b1; + write_register(8'd31, {extended_mode, 3'h0, 1'b0, 3'h0}); // Setting the extended mode + + $display("Rest mode OFF"); + write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)}); + + write_register(8'd14, 8'hde); // rx err cnt + write_register(8'd15, 8'had); // tx err cnt + + read_register(8'd14, tmp_data); // rx err cnt + read_register(8'd15, tmp_data); // tx err cnt + + // Switch-on reset mode + $display("Switch-on reset mode"); + write_register(8'd0, {7'h0, `CAN_MODE_RESET}); + write_register(8'd14, 8'h12); // rx err cnt + write_register(8'd15, 8'h34); // tx err cnt + + read_register(8'd14, tmp_data); // rx err cnt + read_register(8'd15, tmp_data); // tx err cnt + + // Switch-off reset mode + $display("Switch-off reset mode"); + write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)}); + + read_register(8'd14, tmp_data); // rx err cnt + read_register(8'd15, tmp_data); // tx err cnt + + // Switch-on reset mode + $display("Switch-on reset mode"); + write_register(8'd0, {7'h0, `CAN_MODE_RESET}); + + write_register(8'd14, 8'h56); // rx err cnt + write_register(8'd15, 8'h78); // tx err cnt + + // Switch-off reset mode + $display("Switch-off reset mode"); + write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)}); + + read_register(8'd14, tmp_data); // rx err cnt + read_register(8'd15, tmp_data); // tx err cnt +*/ + #1000; $display("CAN Testbench finished !"); $stop; end +task bus_off_recovery_test; + begin + -> igor; + + // Switch-on reset mode + write_register(8'd0, {7'h0, (`CAN_MODE_RESET)}); + write_register2(8'd0, {7'h0, (`CAN_MODE_RESET)}); + + // Set Clock Divider register + extended_mode = 1'b1; + write_register(8'd31, {extended_mode, 3'h0, 1'b0, 3'h0}); // Setting the normal mode (not extended) + write_register2(8'd31, {extended_mode, 3'h0, 1'b0, 3'h0}); // Setting the normal mode (not extended) + + write_register(8'd16, 8'h00); // acceptance code 0 + write_register(8'd17, 8'h00); // acceptance code 1 + write_register(8'd18, 8'h00); // acceptance code 2 + write_register(8'd19, 8'h00); // acceptance code 3 + write_register(8'd20, 8'hff); // acceptance mask 0 + write_register(8'd21, 8'hff); // acceptance mask 1 + write_register(8'd22, 8'hff); // acceptance mask 2 + write_register(8'd23, 8'hff); // acceptance mask 3 + + write_register2(8'd16, 8'h00); // acceptance code 0 + write_register2(8'd17, 8'h00); // acceptance code 1 + write_register2(8'd18, 8'h00); // acceptance code 2 + write_register2(8'd19, 8'h00); // acceptance code 3 + write_register2(8'd20, 8'hff); // acceptance mask 0 + write_register2(8'd21, 8'hff); // acceptance mask 1 + write_register2(8'd22, 8'hff); // acceptance mask 2 + write_register2(8'd23, 8'hff); // acceptance mask 3 + + // Switch-off reset mode + write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)}); + write_register2(8'd0, {7'h0, ~(`CAN_MODE_RESET)}); + + // Enable all interrupts + write_register(8'd4, 8'hff); // irq enable register + + repeat (30) send_bit(1); + -> igor; + $display("(%0t) CAN should be idle now", $time); + + // Node 2 sends a message + write_register2(8'd16, 8'h83); // tx registers + write_register2(8'd17, 8'h12); // tx registers + write_register2(8'd18, 8'h34); // tx registers + write_register2(8'd19, 8'h45); // tx registers + write_register2(8'd20, 8'h56); // tx registers + write_register2(8'd21, 8'hde); // tx registers + write_register2(8'd22, 8'had); // tx registers + write_register2(8'd23, 8'hbe); // tx registers + + write_register2(8'd1, 8'h1); // tx request + + // Wait until node 1 receives rx irq + read_register(8'd3, tmp_data); + while (!(tmp_data & 8'h01)) begin + read_register(8'd3, tmp_data); + end + + $display("Frame received by node 1."); + + // Node 1 will send a message and will receive many errors + write_register(8'd16, 8'haa); // tx registers + write_register(8'd17, 8'haa); // tx registers + write_register(8'd18, 8'haa); // tx registers + write_register(8'd19, 8'haa); // tx registers + write_register(8'd20, 8'haa); // tx registers + write_register(8'd21, 8'haa); // tx registers + write_register(8'd22, 8'haa); // tx registers + write_register(8'd23, 8'haa); // tx registers + + fork + begin + write_register(8'd1, 8'h1); // tx request + end + + begin + // Waiting until node 1 starts transmitting + wait (!tx_i); + repeat (33) send_bit(1); + repeat (330) send_bit(0); + repeat (1) send_bit(1); + end + + join + + // Switch-off reset mode + write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)}); + write_register2(8'd0, {7'h0, ~(`CAN_MODE_RESET)}); + + repeat (1999) send_bit(1); + + // Switch-on reset mode + write_register(8'd0, {7'h0, (`CAN_MODE_RESET)}); + write_register2(8'd0, {7'h0, (`CAN_MODE_RESET)}); + + write_register(8'd14, 8'h0); // rx err cnt + + // Switch-off reset mode + write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)}); + write_register2(8'd0, {7'h0, ~(`CAN_MODE_RESET)}); + + + // Wait some time before simulation ends + repeat (10000) @ (posedge clk); + end +endtask // bus_off_recovery_test + + +task error_test; + begin + // Switch-off reset mode + write_register(8'd0, {7'h0, (`CAN_MODE_RESET)}); + write_register2(8'd0, {7'h0, (`CAN_MODE_RESET)}); + + // Set Clock Divider register + extended_mode = 1'b1; + write_register(8'd31, {extended_mode, 3'h0, 1'b0, 3'h0}); // Setting the normal mode (not extended) + write_register2(8'd31, {extended_mode, 3'h0, 1'b0, 3'h0}); // Setting the normal mode (not extended) + + // Set error warning limit register + write_register(8'd13, 8'h56); // error warning limit + + // Switch-off reset mode + write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)}); + write_register2(8'd0, {7'h0, ~(`CAN_MODE_RESET)}); + + // Enable all interrupts + write_register(8'd4, 8'hff); // irq enable register + + repeat (300) send_bit(0); + + $display("Kr neki"); + + end +endtask + + +task register_test; + integer i, j, tmp; + begin + $display("Change mode to extended mode and test registers"); + // Switch-off reset mode + write_register(8'd0, {7'h0, (`CAN_MODE_RESET)}); + write_register2(8'd0, {7'h0, (`CAN_MODE_RESET)}); + + // Set Clock Divider register + extended_mode = 1'b1; + write_register(8'd31, {extended_mode, 3'h0, 1'b0, 3'h0}); // Setting the normal mode (not extended) + write_register2(8'd31, {extended_mode, 3'h0, 1'b0, 3'h0}); // Setting the normal mode (not extended) + + // Switch-off reset mode + write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)}); + write_register2(8'd0, {7'h0, ~(`CAN_MODE_RESET)}); + + for (i=1; i<128; i=i+1) begin + for (j=0; j<8; j=j+1) begin + read_register(i, tmp_data); + write_register(i, tmp_data | (1 << j)); + end + end + + end +endtask + task forced_bus_off; // Forcing bus-off by writinf to tx_err_cnt register begin @@ -687,7 +918,7 @@ read_receive_buffer; release_rx_buffer_command; - #1000 read_register(8'd3); + #1000 read_register(8'd3, tmp_data); read_receive_buffer; release_rx_buffer_command; read_receive_buffer; @@ -867,7 +1098,7 @@ read_receive_buffer; release_rx_buffer_command; - #1000 read_register(8'd3); + #1000 read_register(8'd3, tmp_data); read_receive_buffer; release_rx_buffer_command; read_receive_buffer; @@ -900,6 +1131,12 @@ write_register(8'd22, 8'h00); // acceptance mask 2 write_register(8'd23, 8'h00); // acceptance mask 3 +//write_register(8'd14, 8'h7a); // rx err cnt +//write_register(8'd15, 8'h7a); // tx err cnt + +//read_register(8'd14, tmp_data); // rx err cnt +//read_register(8'd15, tmp_data); // tx err cnt + repeat (100) @ (posedge clk); // Switch-off reset mode @@ -1167,13 +1404,16 @@ read_receive_buffer; // Read irq register - #1 read_register(8'd3); + #1 read_register(8'd3, tmp_data); // Read error code capture register - read_register(8'd12); + read_register(8'd12, tmp_data); // Read error capture code register -// read_register(8'd12); +// read_register(8'd12, tmp_data); + +read_register(8'd14, tmp_data); // rx err cnt +read_register(8'd15, tmp_data); // tx err cnt #4000000; @@ -1264,9 +1504,11 @@ // Node is error passive now. // Read irq register (error interrupt should be cleared now. - read_register(8'd3); + read_register(8'd3, tmp_data); - repeat (20) +->igor; + + repeat (34) begin send_bit(0); // SOF @@ -1332,11 +1574,13 @@ send_bit(1); // SUSPEND end // repeat +->igor; + // Node is bus-off now // Read irq register (error interrupt should be cleared now. - read_register(8'd3); + read_register(8'd3, tmp_data); @@ -1351,7 +1595,7 @@ end // repeat // Read irq register (error interrupt should be cleared now. - read_register(8'd3); + read_register(8'd3, tmp_data); repeat (64 * 11) begin @@ -1361,7 +1605,7 @@ // Read irq register (error interrupt should be cleared now. - read_register(8'd3); + read_register(8'd3, tmp_data); end @@ -1524,7 +1768,7 @@ read_receive_buffer; // Read irq register - read_register(8'd3); + read_register(8'd3, tmp_data); #1000; end @@ -1658,10 +1902,10 @@ end // Read irq register - #1 read_register(8'd3); + #1 read_register(8'd3, tmp_data); // Read arbitration lost capture register - read_register(8'd11); + read_register(8'd11, tmp_data); end @@ -1673,7 +1917,7 @@ end // Read irq register - #1 read_register(8'd3); + #1 read_register(8'd3, tmp_data); end repeat(1) @@ -1684,7 +1928,7 @@ end // Read arbitration lost capture register - read_register(8'd11); + read_register(8'd11, tmp_data); end end @@ -1720,7 +1964,7 @@ read_receive_buffer; // Read irq register - read_register(8'd3); + read_register(8'd3, tmp_data); #1000; end @@ -1796,7 +2040,7 @@ read_receive_buffer; // Read irq register - read_register(8'd3); + read_register(8'd3, tmp_data); #1000; end @@ -2023,10 +2267,10 @@ fifo_info; // Read irq register - read_register(8'd3); + read_register(8'd3, tmp_data); // Read irq register - read_register(8'd3); + read_register(8'd3, tmp_data); #1000; end @@ -2271,6 +2515,7 @@ task read_register; input [7:0] reg_addr; + output [7:0] data; `ifdef CAN_WISHBONE_IF begin @@ -2285,6 +2530,7 @@ wb_we_i = 0; wait (wb_ack_o); $display("(%0t) Reading register [%0d] = 0x%0x", $time, wb_adr_i, wb_dat_o); + data = wb_dat_o; @ (posedge wb_clk_i); #1; wb_adr_i = 'hz; @@ -2314,6 +2560,7 @@ rd_i = 1; #158; $display("(%0t) Reading register [%0d] = 0x%0x", $time, can_testbench.i_can_top.addr_latched, port_0_i); + data = port_0_i; #1; rd_i = 0; cs_can = 0; @@ -2352,6 +2599,7 @@ end `else begin + $display("(%0t) Writing register [%0d] with 0x%0x", $time, reg_addr, reg_data); wait (port_free); port_free = 0; @ (posedge clk); @@ -2380,6 +2628,7 @@ task read_register2; input [7:0] reg_addr; + output [7:0] data; `ifdef CAN_WISHBONE_IF begin @@ -2394,6 +2643,7 @@ wb_we_i = 0; wait (wb_ack_o); $display("(%0t) Reading register [%0d] = 0x%0x", $time, wb_adr_i, wb_dat_o); + data = wb_dat_o; @ (posedge wb_clk_i); #1; wb_adr_i = 'hz; @@ -2423,6 +2673,7 @@ rd2_i = 1; #158; $display("(%0t) Reading register [%0d] = 0x%0x", $time, can_testbench.i_can_top.addr_latched, port_0_i); + data = port_0_i; #1; rd2_i = 0; cs_can2 = 0; @@ -2494,14 +2745,14 @@ if(extended_mode) // Extended mode begin for (i=8'd16; i<=8'd28; i=i+1) - read_register(i); + read_register(i, tmp_data); //if (can_testbench.i_can_top.i_can_bsp.i_can_fifo.overrun) // $display("\nWARNING: Above packet was received with overrun."); end else begin for (i=8'd20; i<=8'd29; i=i+1) - read_register(i); + read_register(i, tmp_data); //if (can_testbench.i_can_top.i_can_bsp.i_can_fifo.overrun) // $display("\nWARNING: Above packet was received with overrun."); end 1.10 can/bench/verilog/can_testbench_defines.v http://www.opencores.org/cvsweb.shtml/can/bench/verilog/can_testbench_defines.v.diff?r1=1.9&r2=1.10 (In the diff below, changes in quantity of whitespace are not shown.) Index: can_testbench_defines.v =================================================================== RCS file: /home/oc/cvs/can/bench/verilog/can_testbench_defines.v,v retrieving revision 1.9 retrieving revision 1.10 diff -u -b -r1.9 -r1.10 --- can_testbench_defines.v 30 Sep 2003 20:53:58 -0000 1.9 +++ can_testbench_defines.v 25 Apr 2006 13:17:59 -0000 1.10 @@ -50,6 +50,9 @@ // CVS Revision History // // $Log: can_testbench_defines.v,v $ +// Revision 1.10 2006/04/25 13:17:59 igorm +// New tests for testing the bus-off. +// // Revision 1.9 2003/09/30 20:53:58 mohor // Fixing the core to be Bosch VHDL Reference compatible. // @@ -86,12 +89,19 @@ `define CAN_MODE_RESET 1'h1 /* Reset mode */ /* Bit Timing 0 register value */ -`define CAN_TIMING0_BRP 6'h0 /* Baud rate prescaler (2*(value+1)) */ -`define CAN_TIMING0_SJW 2'h2 /* SJW (value+1) */ +//`define CAN_TIMING0_BRP 6'h0 /* Baud rate prescaler (2*(value+1)) */ +//`define CAN_TIMING0_SJW 2'h2 /* SJW (value+1) */ + +`define CAN_TIMING0_BRP 6'h3 /* Baud rate prescaler (2*(value+1)) */ +`define CAN_TIMING0_SJW 2'h1 /* SJW (value+1) */ /* Bit Timing 1 register value */ -`define CAN_TIMING1_TSEG1 4'h4 /* TSEG1 segment (value+1) */ -`define CAN_TIMING1_TSEG2 3'h3 /* TSEG2 segment (value+1) */ +//`define CAN_TIMING1_TSEG1 4'h4 /* TSEG1 segment (value+1) */ +//`define CAN_TIMING1_TSEG2 3'h3 /* TSEG2 segment (value+1) */ +//`define CAN_TIMING1_SAM 1'h0 /* Triple sampling */ + +`define CAN_TIMING1_TSEG1 4'hf /* TSEG1 segment (value+1) */ +`define CAN_TIMING1_TSEG2 3'h2 /* TSEG2 segment (value+1) */ `define CAN_TIMING1_SAM 1'h0 /* Triple sampling */

     
    Copyright (c) 1999 OPENCORES.ORG. All rights reserved.