///////////////////////////////////////////////////////////////////////////// // _____ // / _______ Copyright (C) 2013-2020 Efinix Inc. All rights reserved. // / / \ // / / .. / // / / .' / // __/ /.' / // __ \ / // /_/ /\ \_____/ / // ____/ \_______/ // // ******************************* // Revisions: // 1.0 Initial rev // // ******************************* `timescale 1 ns/100ps `define SIM_MODE `define RXFIFO_EN 1 `define RXFIFO_DTH 2048 `define TXFIFO_EN 1 `define TXFIFO_DTH 2048 module tb_top( ); `include "gTSE_define.svh" // Parameter Define parameter TSET_CASE = 1;//Values range from "1" to "9" parameter MAC_SPEED = 2;//4:1000M; 2:100M; 1:10M; parameter PAT_TYPE = 1;//0:UDP Pattern; 1:MAC Pattern; parameter DST_MAC_H = 16'habcd; parameter DST_MAC_L = 32'hef22_1100; parameter SRC_MAC_H = 16'heae8; parameter SRC_MAC_L = 32'h5e00_60c8; parameter MAC_DLEN = 16'd64; parameter SRC_IP = 32'hc0a80164; parameter DST_IP = 32'hc0a80165; parameter SRC_PORT = 16'h0521; parameter DST_PORT = 16'h2715; parameter UDP_DLEN = 16'h64; // Register Define reg Reset; reg clk_50m=0; reg clk_125m=0; reg clk_25m=0; reg clk_2m5=0; reg err_ins=0; //--mac_reg command_config reg tx_ena=0; reg rx_ena=0; reg xon_gen=0; reg promis_en=0; reg pad_en=0; reg crc_fwd=0; reg pause_ignore=0; reg tx_addr_ins=0; reg sw_reset=0; reg loop_ena=0; reg [2:0] eth_speed=0; reg xoff_gen=0; reg cnt_reset=0; //--APB3 Interface reg [9:0] m_apb3_paddr=0; reg m_apb3_psel=0; reg m_apb3_penable=0; reg m_apb3_pwrite=0; reg [31:0] m_apb3_pwdata=0; // Wire Define wire [31:0] mac_command_config; //--Transmit AXI4-Stream Interface wire tx_axis_clk; wire [7:0] tx_axis_mac_tdata; wire tx_axis_mac_tvalid; wire tx_axis_mac_tlast; wire tx_axis_mac_tuser; wire tx_axis_mac_tready; //--APB3 Interface wire m_apb3_pready; wire [31:0] m_apb3_prdata; wire m_apb3_pslverror; //--AXI4-Lite Interface wire [9:0] axi_awaddr; wire axi_awvalid; wire axi_awready; wire [31:0] axi_wdata; wire axi_wvalid; wire axi_wready; wire [1:0] axi_bresp; wire axi_bvalid; wire axi_bready; wire [9:0] axi_araddr; wire axi_arvalid; wire axi_arready; wire [1:0] axi_rresp; wire [31:0] axi_rdata; wire axi_rvalid; wire axi_rready; //--RGMII Interface wire [3:0] rgmii_txd_HI; wire [3:0] rgmii_txd_LO; wire rgmii_tx_ctl; wire rgmii_txc_HI; wire rgmii_txc_LO; wire rgmii_txc; wire [3:0] rgmii_rxd_HI; wire [3:0] rgmii_rxd_LO; wire rgmii_rx_ctl; wire rgmii_rxc; wire rx_data_rlast; wire udp_rx_data_rlast; wire rx_data_ruser; integer i; //-----------------------------------------------------------------------------------// // THE Sim Behavior //-----------------------------------------------------------------------------------// initial begin //$shm_open("test.shm"); //$shm_probe(tb_top,"ACMTF"); Reset <=1; #20 Reset <=0; init_task(); if(TSET_CASE == 1) test_case_1_task(); else if(TSET_CASE == 2) test_case_2_task(); else if(TSET_CASE == 3) test_case_3_task(); else if(TSET_CASE == 4) test_case_4_task(); else if(TSET_CASE == 5) test_case_5_task(); else if(TSET_CASE == 6) test_case_6_task(); else if(TSET_CASE == 7) test_case_7_task(); else if(TSET_CASE == 8) test_case_8_task(); else if(TSET_CASE == 9) test_case_9_task(); #5000 $display("TEST PASSED"); $finish(1); end //-----------------------------------------------------------------------------------// // THE Clock Generate //-----------------------------------------------------------------------------------// always clk_50m = #(10) ~clk_50m; always clk_2m5 = #(200) ~clk_2m5; always clk_25m = #(20) ~clk_25m; always clk_125m = #(4) ~clk_125m; //-----------------------------------------------------------------------------------// // THE Sim Condition //-----------------------------------------------------------------------------------// assign u_temac_ex.apb3_paddr = m_apb3_paddr; assign u_temac_ex.apb3_psel = m_apb3_psel; assign u_temac_ex.apb3_penable = m_apb3_penable; assign m_apb3_pready = u_temac_ex.apb3_pready; assign u_temac_ex.apb3_pwrite = m_apb3_pwrite; assign u_temac_ex.apb3_pwdata = m_apb3_pwdata; assign m_apb3_prdata = u_temac_ex.apb3_prdata; assign m_apb3_pslverror = u_temac_ex.apb3_pslverror; assign rx_data_rlast = u_temac_ex.u_mac_pat_gen.rlast; assign rx_data_ruser = u_temac_ex.rx_axis_mac_tlast; assign udp_rx_data_rlast = u_temac_ex.u_udp_pat_gen.rlast; assign mac_command_config = {cnt_reset,7'h0, 1'h0,xoff_gen,3'h0,eth_speed[2:0], loop_ena,1'h0,sw_reset,3'h0,tx_addr_ins,pause_ignore, 1'h0,crc_fwd,pad_en,promis_en,1'h0,xon_gen,rx_ena,tx_ena}; assign rgmii_rxd_HI = (err_ins) ? 4'h0 : rgmii_txd_LO; assign rgmii_rxd_LO = (err_ins) ? 4'h0 : rgmii_txd_HI; assign rgmii_rx_ctl = rgmii_tx_ctl; assign rgmii_rxc = rgmii_txc; reg [7:0] rx_data_cnt; reg rdata_mismatch; always @(posedge clk_125m or negedge Reset) begin if(Reset == 1'b0) rx_data_cnt <= 8'h0; else if(u_temac_ex.rx_axis_mac_tlast) rx_data_cnt <= 8'h0; else if(u_temac_ex.rx_axis_mac_tvalid) rx_data_cnt <= rx_data_cnt + 1'b1; end always @(posedge clk_125m or negedge Reset) begin if(Reset == 1'b0) rdata_mismatch <= 1'b0; else if (u_temac_ex.rx_axis_mac_tlast) rdata_mismatch <= 1'b0; else if(u_temac_ex.rx_axis_mac_tvalid && rx_data_cnt >= 8'd42) begin if ((rx_data_cnt - u_temac_ex.rx_axis_mac_tdata) != 8'd42) rdata_mismatch <= 1'b1; end end //-----------------------------------------------------------------------------------// // THE DUT RX //-----------------------------------------------------------------------------------// temac_ex u_temac_ex ( //Globle Signals //----pll_0 //output wire pll_0_reset, .clk (clk_50m ), .clk_125m (clk_125m ), .pll_0_locked (!Reset ), .sw6 (), //TEMAC PHY RGMII Interface .rgmii_txd_HI (rgmii_txd_HI ), .rgmii_txd_LO (rgmii_txd_LO ), .rgmii_tx_ctl (rgmii_tx_ctl ), .rgmii_txc_HI (rgmii_txc_HI ), .rgmii_txc_LO (rgmii_txc_LO ), .rgmii_rxd_HI (rgmii_rxd_HI ), .rgmii_rxd_LO (rgmii_rxd_LO ), .rgmii_rx_ctl (rgmii_rx_ctl ), .rgmii_rxc (rgmii_rxc ), //TEMAC PHY MDIO Interface .phy_mdi (1'b0 ), .phy_mdo ( ), .phy_mdo_en ( ), .phy_mdc ( ) ); /*----------------------- ODDR Region ----------------------------*/ //rgmii_txc ODDR #( .DDR_CLK_EDGE ("SAME_EDGE" )// "OPPOSITE_EDGE" or "SAME_EDGE" ) rgmii_txc_ddr ( .Q (rgmii_txc ),// 1-bit DDR output .C (clk_125m ),// 1-bit clock input .CE (1'b1 ),// 1-bit clock enable input .D1 (rgmii_txc_HI ),// 1-bit data input (positive edge) .D2 (rgmii_txc_LO ),// 1-bit data input (negative edge) .R (1'b0 ),// 1-bit reset .S (1'b0 )// 1-bit set ); //-----------------------------------------------------------------------------------// // THE Base Task //-----------------------------------------------------------------------------------// //apb3 bus wr task task apb3_wr; input [9:0] awaddr; input [31:0] wdata; begin @(posedge clk_50m); m_apb3_paddr <= awaddr; m_apb3_pwrite <= 1'b1; m_apb3_psel <= 1'b1; m_apb3_pwdata <= wdata; @(posedge clk_50m); m_apb3_penable <= 1; wait(m_apb3_pready); @(posedge clk_50m); m_apb3_paddr <= 0; m_apb3_pwrite <= 0; m_apb3_psel <= 0; m_apb3_pwdata <= 1'b0; m_apb3_penable <= 0; @(posedge clk_50m); end endtask //apb3 bus rd task task apb3_rd; input [9:0] araddr; begin @(posedge clk_50m); m_apb3_paddr <= araddr; m_apb3_pwrite <= 1'b0; m_apb3_psel <= 1'b1; @(posedge clk_50m); m_apb3_penable <= 1; wait(m_apb3_pready); @(posedge clk_50m); m_apb3_paddr <= 0; m_apb3_pwrite <= 0; m_apb3_psel <= 0; m_apb3_penable <= 0; @(posedge clk_50m); end endtask //initial task task init_task; begin //initial mac_reg tx_ena <= 1'h1; rx_ena <= 1'h1; xon_gen <= 1'h0; promis_en <= 1'h0; pad_en <= 1'h0; crc_fwd <= 1'h0; pause_ignore <= 1'h0; tx_addr_ins <= 1'h0; sw_reset <= 1'h0; loop_ena <= 1'h0; eth_speed[2:0] <= MAC_SPEED; xoff_gen <= 1'h0; cnt_reset <= 1'h0; @(posedge clk_50m); $display("---- Configure TSE MAC IP register setting ----"); apb3_wr('h2*4,mac_command_config);//mac_reg command_config //initial ex_reg apb3_wr('h84*4,DST_MAC_L);//ex_reg pat_dst_mac[31:0] apb3_wr('h85*4,DST_MAC_H);//ex_reg pat_dst_mac[47:32] apb3_wr('h86*4,SRC_MAC_L);//ex_reg pat_src_mac[31:0] apb3_wr('h87*4,SRC_MAC_H);//ex_reg pat_src_mac[47:32] apb3_wr('h89*4,SRC_IP);//ex_reg pat_src_ip apb3_wr('h8a*4,DST_IP);//ex_reg pat_dst_ip apb3_wr('h8b*4,{DST_PORT,SRC_PORT});//ex_reg pat_dst_port & pat_src_port if(PAT_TYPE == 1'b0) begin apb3_wr('h81*4,32'h0);//ex_reg pat_mux_select & axi4_st_mux_select end else begin apb3_wr('h81*4,32'h2);//ex_reg pat_mux_select & axi4_st_mux_select end end endtask //pause frame generator task task pause_gen_task; input [15:0] pause_quant; begin apb3_wr('h6*4,pause_quant);//mac_reg pause_quant xoff_gen <= 1'h1; @(posedge clk_50m); apb3_wr('h2*4,mac_command_config);//mac_reg command_config wait(u_temac_ex.u_tsemac.u_efx_mac1gbe.inst_tsemac.u_tsemac.u_tx_engine.u_tx_ctr.cur_state == 4'd4); xoff_gen <= 1'h0; @(posedge clk_50m); apb3_wr('h2*4,mac_command_config);//mac_reg command_config end endtask task check_rdata_task; input integer i; input [1:0] check_error_bit; begin while (rx_data_rlast == 0) @(posedge clk_125m); if (check_error_bit == 2'b01) begin apb3_rd('h22*4); // read ifInErrors if (|m_apb3_prdata == 0) begin $display("%t - Error: Expecting MAC packet ifInErrors to go high, ifInErrors = %h", $time, m_apb3_prdata); $fatal("FAIL: simulation fail"); end else begin $display("%t - Correct MAC packet %d, received", $time, i); end end else if (check_error_bit == 2'b10) begin if (rx_data_ruser == 0) begin $display("%t - Error: Expecting MAC packet rx_data_ruser to go high, rx_data_ruser = %h", $time, rx_data_ruser); $fatal("FAIL: simulation fail"); end else begin $display("%t - MAC packet %d is filtered", $time, i); end end else begin apb3_rd('h22*4); // read ifInErrors if (rdata_mismatch != 0) begin $display("%t - Error: Received data mismatch", $time); $fatal("FAIL: simulation fail"); end if (|m_apb3_prdata != 0) begin $display("%t - Error: There is an Error in the MAC received packet, ifInErrors = %h", $time, m_apb3_prdata); $fatal("FAIL: simulation fail"); end else begin $display("%t - Correct MAC packet %d, received", $time, i); end end end endtask task check_udp_rdata_task; input integer i; input [1:0] check_error_bit; begin while (rx_data_rlast == 0) @(posedge clk_125m); if (check_error_bit == 2'b01) begin apb3_rd('h22*4); // read ifInErrors if (|m_apb3_prdata == 0) begin $display("%t - Error: Expecting UDP packet ifInErrors to go high, ifInErrors = %h", $time, m_apb3_prdata); $fatal("FAIL: simulation fail"); end else begin $display("%t - Correct UDP packet %d, received", $time, i); end end else if (check_error_bit == 2'b10) begin if (rx_data_ruser == 0) begin $display("%t - Error: Expecting UDP packet rx_data_ruser to go high, rx_data_ruser = %h", $time, rx_data_ruser); $fatal("FAIL: simulation fail"); end else begin $display("%t - UDP packet %d is filtered", $time, i); end end else begin apb3_rd('h22*4); // read ifInErrors if (rdata_mismatch != 0) begin $display("%t - Error: Received data mismatch", $time); $fatal("FAIL: simulation fail"); end if (|m_apb3_prdata != 0) begin $display("%t - Error: There is an Error in the UDP received packet, ifInErrors = %h", $time, m_apb3_prdata); $fatal("FAIL: simulation fail"); end else begin $display("%t - Correct UDP packet %d, received", $time, i); end end end endtask //-----------------------------------------------------------------------------------// // THE Test Case Task //-----------------------------------------------------------------------------------// task test_case_1_task; begin apb3_wr('h81*4,32'h2);//ex_reg pat_mux_select & axi4_st_mux_select apb3_wr('h88*4,MAC_DLEN);//ex_reg pat_mac_dlen apb3_wr('h83*4,{16'h10,16'h3E8});//ex_reg pat_gen_ipg & pat_gen_num apb3_wr('h82*4,32'h2);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en for (i=0; i<16'h3E8; i = i + 1) begin check_rdata_task(i, 2'b00); end end endtask task test_case_2_task; begin apb3_wr('h81*4,32'h0);//ex_reg pat_mux_select & axi4_st_mux_select apb3_wr('h8c*4,UDP_DLEN);//ex_reg pat_udp_dlen apb3_wr('h83*4,{16'hff,16'h3E8});//ex_reg pat_gen_ipg & pat_gen_num apb3_wr('h82*4,32'h1);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en for (i=0; i<16'h3E8; i = i + 1) begin check_udp_rdata_task(i, 2'b00); end end endtask task test_case_3_task; begin begin // to transmit tx packet after rx pause frame finished processed apb3_wr('h88*4,16'd100);//ex_reg pat_mac_dlen apb3_wr('h8c*4,16'd100);//ex_reg pat_udp_dlen apb3_wr('h83*4,{16'hf,16'h2});//ex_reg pat_gen_ipg & pat_gen_num //Send 2 mac frames if(PAT_TYPE == 1'b0) begin apb3_wr('h82*4,32'h1);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_udp_rdata_task(0, 2'b00); check_udp_rdata_task(1, 2'b00); end else begin apb3_wr('h82*4,32'h2);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_rdata_task(0, 2'b00); check_rdata_task(1, 2'b00); end //send 1 pause frames pause_gen_task(16'd8); while (rx_data_rlast == 0) @(posedge clk_125m); #1000 // to have some buffer to make sure the core process rx pause frame entirely //Send 2 mac frames if(PAT_TYPE == 1'b0) begin apb3_wr('h82*4,32'h1);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_udp_rdata_task(2, 2'b00); check_udp_rdata_task(3, 2'b00); end else begin apb3_wr('h82*4,32'h2);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_rdata_task(2, 2'b00); check_rdata_task(3, 2'b00); end end begin //Send 2 mac frames if(PAT_TYPE == 1'b0) begin apb3_wr('h82*4,32'h1);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_udp_rdata_task(4, 2'b00); check_udp_rdata_task(5, 2'b00); end else begin apb3_wr('h82*4,32'h2);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_rdata_task(4, 2'b00); check_rdata_task(5, 2'b00); end //send 1 pause frames pause_gen_task(16'd8); //Send 2 mac frames if(PAT_TYPE == 1'b0) begin apb3_wr('h82*4,32'h1);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en // check to make sure entire pause frame is received while (rx_data_rlast == 0) @(posedge clk_125m); repeat(1) @(posedge clk_125m); check_udp_rdata_task(6, 2'b00); check_udp_rdata_task(7, 2'b00); end else begin apb3_wr('h82*4,32'h2);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en // check to make sure entire pause frame is received while (rx_data_rlast == 0) @(posedge clk_125m); repeat(1) @(posedge clk_125m); check_rdata_task(8, 2'b00); check_rdata_task(9, 2'b00); end end end endtask task test_case_4_task; begin apb3_wr('h83*4,{16'hf,16'h1});//ex_reg pat_gen_ipg & pat_gen_num //Send 1 mac frames if(PAT_TYPE == 1'b0) begin apb3_wr('h5*4,16'd9000+46);//mac_reg frm_length apb3_wr('h8c*4,16'd9000);//ex_reg pat_udp_dlen apb3_wr('h82*4,32'h1);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_udp_rdata_task(0, 2'b00); end else begin apb3_wr('h5*4,16'd9000+18);//mac_reg frm_length apb3_wr('h88*4,16'd9000);//ex_reg pat_mac_dlen apb3_wr('h82*4,32'h2);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_rdata_task(0, 2'b00); end //Send 1 mac frames if(PAT_TYPE == 1'b0) begin apb3_wr('h8c*4,16'd9001);//ex_reg pat_udp_dlen apb3_wr('h82*4,32'h1);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_udp_rdata_task(1, 2'b01); end else begin apb3_wr('h88*4,16'd9001);//ex_reg pat_mac_dlen apb3_wr('h82*4,32'h2);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_rdata_task(1, 2'b01); end end endtask task test_case_5_task; begin apb3_wr('h83*4,{16'hf,16'd20});//ex_reg pat_gen_ipg & pat_gen_num for (i=0; i<20; i = i + 1) begin apb3_wr('h88*4,i);//ex_reg pat_mac_dlen apb3_wr('h8c*4,i);//ex_reg pat_udp_dlen //Send 1 mac frames if(PAT_TYPE == 1'b0) begin apb3_wr('h82*4,32'h1);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_udp_rdata_task(i, 2'b00); end else begin apb3_wr('h82*4,32'h2);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_rdata_task(i, 2'b00); end end end endtask task test_case_6_task; begin apb3_wr('h88*4,16'd64);//ex_reg pat_mac_dlen apb3_wr('h8c*4,16'd64);//ex_reg pat_udp_dlen apb3_wr('h83*4,{16'hf,16'h1});//ex_reg pat_gen_ipg & pat_gen_num //Send 1 mac frames if(PAT_TYPE == 1'b0) begin apb3_wr('h82*4,32'h1);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_udp_rdata_task(0, 2'b00); end else begin apb3_wr('h82*4,32'h2);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_rdata_task(0, 2'b00); end //Send 1 mac frames if(PAT_TYPE == 1'b0) begin apb3_wr('h82*4,32'h1);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_udp_rdata_task(1, 2'b00); end else begin apb3_wr('h82*4,32'h2);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_rdata_task(1, 2'b00); end //Send 1 mac frames if(PAT_TYPE == 1'b0) begin apb3_wr('h8c*4,16'd200);//ex_reg pat_udp_dlen apb3_wr('h82*4,32'h1);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en $display("%t Wait for rgmii_rx_ctl to go high", $time); wait(u_temac_ex.u_tsemac.u_efx_mac1gbe.inst_tsemac.rgmii_rx_ctl_HI == 1); repeat(20) @(posedge rgmii_rxc); err_ins <= 1'b1; $display("%t - insert error", $time); repeat(4) @(posedge rgmii_rxc); err_ins <= 1'b0; $display("%t - deassert error", $time); check_udp_rdata_task(2, 2'b01); end else begin apb3_wr('h88*4,16'd200);//ex_reg pat_mac_dlen apb3_wr('h82*4,32'h2);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en $display("%t Wait for rgmii_rx_ctl to go high", $time); wait(u_temac_ex.u_tsemac.u_efx_mac1gbe.inst_tsemac.rgmii_rx_ctl_HI == 1); repeat(20) @(posedge rgmii_rxc); err_ins <= 1'b1; $display("%t - insert error", $time); repeat(4) @(posedge rgmii_rxc); err_ins <= 1'b0; $display("%t - deassert error", $time); check_rdata_task(2, 2'b01); end end endtask task test_case_7_task; begin apb3_wr('h88*4,16'd64);//ex_reg pat_mac_dlen apb3_wr('h8c*4,16'd64);//ex_reg pat_udp_dlen apb3_wr('h83*4,{16'hf,16'h1});//ex_reg pat_gen_ipg & pat_gen_num //Send 1 mac frames if(PAT_TYPE == 1'b0) begin apb3_wr('h82*4,32'h1);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_udp_rdata_task(0, 2'b00); end else begin apb3_wr('h82*4,32'h2);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_rdata_task(0, 2'b00); end apb3_wr('h51*4,32'hffffffff);//mac_reg mac_addr_mask[31:0] apb3_wr('h52*4,16'hffff);//mac_reg mac_addr_mask[47:32] //Send 1 mac frames if(PAT_TYPE == 1'b0) begin apb3_wr('h82*4,32'h1);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_udp_rdata_task(1, 2'b10); end else begin apb3_wr('h82*4,32'h2);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_rdata_task(1, 2'b10); end apb3_wr('h84*4,32'hffffffff);//ex_reg pat_dst_mac[31:0] apb3_wr('h85*4,16'hffff);//ex_reg pat_dst_mac[47:32] //Send 1 mac frames if(PAT_TYPE == 1'b0) begin apb3_wr('h82*4,32'h1);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_udp_rdata_task(2, 2'b01); end else begin apb3_wr('h82*4,32'h2);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_rdata_task(2, 2'b01); end apb3_wr('h50*4,32'h1);//mac_reg broadcast_filter_en //Send 1 mac frames if(PAT_TYPE == 1'b0) begin apb3_wr('h82*4,32'h1);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_udp_rdata_task(3, 2'b10); end else begin apb3_wr('h82*4,32'h2);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en check_rdata_task(3, 2'b10); end end endtask task test_case_8_task; // small packet length & small inter-gap begin apb3_wr('h81*4,32'h2);//ex_reg pat_mux_select & axi4_st_mux_select apb3_wr('h88*4,MAC_DLEN);//ex_reg pat_mac_dlen apb3_wr('h83*4,{16'd12,16'd100});//ex_reg pat_gen_ipg & pat_gen_num apb3_wr('h82*4,32'h2);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en for (i=0; i<16'd100; i = i + 1) begin check_rdata_task(i, 2'b00); end end endtask task test_case_9_task; // small packet length & small inter-gap begin apb3_wr('h81*4,32'h0);//ex_reg pat_mux_select & axi4_st_mux_select apb3_wr('h8c*4,UDP_DLEN);//ex_reg pat_udp_dlen apb3_wr('h83*4,{16'd12,16'd100});//ex_reg pat_gen_ipg & pat_gen_num apb3_wr('h82*4,32'h1);//ex_reg mac_pat_gen_en & udp_pat_gen_en apb3_wr('h82*4,32'h0);//ex_reg mac_pat_gen_en & udp_pat_gen_en for (i=0; i<16'd100; i = i + 1) begin check_udp_rdata_task(i, 2'b00); end end endtask endmodule