⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can_testbench.v

📁 主要是说明can总线协议使用fpga的ip核实现
💻 V
📖 第 1 页 / 共 5 页
字号:
//  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 Acceptance Code and Acceptance Mask registers (their address differs for basic and extended mode  /* Set Acceptance Code and Acceptance Mask registers  write_register(8'd16, 8'ha6); // acceptance code 0  write_register(8'd17, 8'hb0); // acceptance code 1  write_register(8'd18, 8'h12); // acceptance code 2  write_register(8'd19, 8'h30); // 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'ha6); // acceptance code 0  write_register2(8'd17, 8'hb0); // acceptance code 1  write_register2(8'd18, 8'h12); // acceptance code 2  write_register2(8'd19, 8'h30); // 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*/  // Set Acceptance Code and Acceptance Mask registers  write_register(8'd4, 8'he8); // acceptance code  write_register(8'd5, 8'h0f); // acceptance mask    #10;  repeat (1000) @ (posedge clk);    // Switch-off reset mode  write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)});  write_register2(8'd0, {7'h0, ~(`CAN_MODE_RESET)});  repeat (BRP) @ (posedge clk);   // At least BRP clocks needed before bus goes to dominant level. Otherwise 1 quant difference is possible                                  // This difference is resynchronized later.  // After exiting the reset mode sending bus free  repeat (11) send_bit(1);//  test_synchronization;       // test currently switched off//  test_empty_fifo_ext;        // test currently switched off//  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_reset_mode;              // test currently switched off//  bus_off_test;               // test currently switched off//  forced_bus_off;             // test currently switched off//  send_frame_basic;           // test currently switched on//  send_frame_extended;        // test currently switched off//  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;endtask 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);  endendtask // bus_off_recovery_testtask 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");  endendtasktask 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  endendtasktask forced_bus_off;    // Forcing bus-off by writinf to tx_err_cnt register  begin    // Switch-on reset mode    write_register(8'd0, {7'h0, `CAN_MODE_RESET});    // Set Clock Divider register    write_register(8'd31, {1'b1, 7'h0});    // Setting the extended mode (not normal)    // Write 255 to tx_err_cnt register - Forcing bus-off    write_register(8'd15, 255);    // Switch-off reset mode    write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)});//    #1000000;    #2500000;    // Switch-on reset mode    write_register(8'd0, {7'h0, `CAN_MODE_RESET});    // Write 245 to tx_err_cnt register    write_register(8'd15, 245);    // Switch-off reset mode    write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)});    #1000000;  endendtask   // forced_bus_offtask manual_frame_basic;    // Testbench sends a basic format frame  begin    // Switch-on reset mode    write_register(8'd0, {7'h0, (`CAN_MODE_RESET)});      // Set Acceptance Code and Acceptance Mask registers    write_register(8'd4, 8'h28); // acceptance code    write_register(8'd5, 8'hff); // acceptance mask        repeat (100) @ (posedge clk);        // Switch-off reset mode//    write_register(8'd0, {7'h0, ~(`CAN_MODE_RESET)});    write_register(8'd0, 8'h1e);  // reset_off, all irqs enabled.    // After exiting the reset mode sending bus free    repeat (11) send_bit(1);    write_register(8'd10, 8'h55); // Writing ID[10:3] = 0x55    write_register(8'd11, 8'h77); // Writing ID[2:0] = 0x3, rtr = 1, length = 7    write_register(8'd12, 8'h00); // data byte 1    write_register(8'd13, 8'h00); // data byte 2    write_register(8'd14, 8'h00); // data byte 3    write_register(8'd15, 8'h00); // data byte 4    write_register(8'd16, 8'h00); // data byte 5    write_register(8'd17, 8'h00); // data byte 6    write_register(8'd18, 8'h00); // data byte 7    write_register(8'd19, 8'h00); // data byte 8    tx_bypassed = 0;    // When this signal is on, tx is not looped back to the rx.        fork      begin        tx_request_command;//        self_reception_request_command;      end      begin        #931;        repeat (1)        begin          send_bit(0);  // SOF          send_bit(0);  // ID          send_bit(1);  // ID          send_bit(0);  // ID          send_bit(1);  // ID          send_bit(0);  // ID          send_bit(1);  // ID          send_bit(0);  // ID          send_bit(1);  // ID          send_bit(0);  // ID          send_bit(1);  // ID          send_bit(0);  // ID arbi lost          send_bit(1);  // RTR          send_bit(0);  // IDE          send_bit(0);  // r0          send_bit(0);  // DLC          send_bit(1);  // DLC          send_bit(1);  // DLC          send_bit(1);  // DLC          send_bit(1);  // CRC          send_bit(1);  // CRC          send_bit(0);  // CRC stuff          send_bit(0);  // CRC 6          send_bit(0);  // CRC          send_bit(0);  // CRC          send_bit(0);  // CRC          send_bit(1);  // CRC  stuff          send_bit(0);  // CRC 0          send_bit(0);  // CRC          send_bit(1);  // CRC          send_bit(0);  // CRC          send_bit(1);  // CRC 5          send_bit(1);  // CRC          send_bit(0);  // CRC          send_bit(1);  // CRC          send_bit(1);  // CRC b          send_bit(1);  // CRC DELIM          send_bit(0);  // ACK          send_bit(1);  // ACK DELIM          send_bit(1);  // EOF          send_bit(1);  // EOF          send_bit(1);  // EOF          send_bit(1);  // EOF          send_bit(1);  // EOF          send_bit(1);  // EOF          send_bit(1);  // EOF          send_bit(1);  // INTER          send_bit(1);  // INTER          send_bit(1);  // INTER#400;          send_bit(0);  // SOF          send_bit(0);  // ID          send_bit(1);  // ID          send_bit(0);  // ID          send_bit(1);  // ID          send_bit(0);  // ID          send_bit(1);  // ID          send_bit(0);  // ID          send_bit(1);  // ID          send_bit(0);  // ID          send_bit(1);  // ID          send_bit(1);  // ID          send_bit(1);  // RTR          send_bit(0);  // IDE          send_bit(0);  // r0          send_bit(0);  // DLC          send_bit(1);  // DLC          send_bit(1);  // DLC          send_bit(1);  // DLC

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -