`timescale 1ns / 1ps module tb_reflectometer; //------------------------------------------------------------ // Параметры //------------------------------------------------------------ localparam int unsigned DAC_DATA_WIDTH = 14; localparam int unsigned ADC_DATA_WIDTH = 12; localparam LOGIC_ZERO_LEVEL = 0; // DAC -5V for logic zero localparam VOLTAGE_ZERO_LEVEL = 2**(DAC_DATA_WIDTH-1); // DAC 0V for logic zero localparam PACK_FACTOR = 1; // not used in TB localparam PROCESS_MODE = 0; // 0 - uint, 1 - int localparam ACCUM_WIDTH = 32; // accumulator number bit witdth localparam N_MAX = 4096; // max value of windows to average by experiments localparam WINDOW_SIZE = 65; // fixed subwindow size to average by time localparam PACKET_SIZE = 1024; // bytes per UDP packet localparam ZERO_LEVEL = LOGIC_ZERO_LEVEL; // "logic" VS "true" localparam CLK_ETH_PHY_PERIOD = 8.000; // 125 MHz localparam CLK_REF_PERIOD = 5.000; // 200 MHz //------------------------------------------------------------ // Тактовые сигналы и сброс //------------------------------------------------------------ logic clk_ref = 1'b0; // 200 MHz logic clk_eth_phy = 1'b0; // common for RX & TX logic rst_n = 1'b0; //------------------------------------------------------------ // Управление и конфиг //------------------------------------------------------------ //------------------------------------------------------------ // Входы //------------------------------------------------------------ //------------------------------------------------------------ // Выходы //------------------------------------------------------------ wire mmcm_locked; //------------------------------------------------------------ // Внутренние сигналы тестбенча //------------------------------------------------------------ // AXI-S интерфейс для управления logic [7:0] m_axis_control_tdata = 8'b0; logic m_axis_control_tvalid = 1'b0; wire m_axis_control_tready; logic m_axis_control_tlast = 1'b0; // AXI-S интерфейс для данных wire [7:0] s_axis_accumulator_tdata; wire s_axis_accumulator_tvalid; logic s_axis_accumulator_tready = 1'b0; wire s_axis_accumulator_tlast; // DAC интерфейс wire clk_dac; wire dac_wrt; wire [DAC_DATA_WIDTH-1:0] dac_data; // ADC интерфейс wire clk_adc; wire adc_otr = 1'b0; wire [ADC_DATA_WIDTH-1:0] adc_data = '0; // Интерфейс хендшейка с MAC-PHY wire send_request; logic request_ready = 1'b0; // Сигналы ЦАП и АЦП real signal_voltage; //------------------------------------------------------------ // Virtual DAC //------------------------------------------------------------ virtual_dac_model #( // default voltage range is +/- 5V .DAC_DATA_WIDTH(DAC_DATA_WIDTH) ) virtual_dac ( .clk_i(clk_dac), .wrt_i(dac_wrt), .data_i(dac_data), .voltage_o(signal_voltage) ); //------------------------------------------------------------ // Virtual ADC //------------------------------------------------------------ virtual_adc_model #( // default voltage range is +/- 5V .ADC_DATA_WIDTH(ADC_DATA_WIDTH) ) virtual_adc ( .clk_i(clk_adc), .voltage_i(signal_voltage), .otr_o(adc_otr), .data_o(adc_data) ); //------------------------------------------------------------ // Statistics monitor //------------------------------------------------------------ //------------------------------------------------------------ // Config handler //------------------------------------------------------------ //------------------------------------------------------------ // DUT //------------------------------------------------------------ reflectometer_top #( .DAC_DATA_WIDTH(DAC_DATA_WIDTH), .ADC_DATA_WIDTH(ADC_DATA_WIDTH), .PACK_FACTOR(PACK_FACTOR), .PROCESS_MODE(PROCESS_MODE), .ZERO_LEVEL(ZERO_LEVEL), .ACCUM_WIDTH(ACCUM_WIDTH), .N_MAX(N_MAX), .WINDOW_SIZE(WINDOW_SIZE), .PACKET_SIZE(PACKET_SIZE) ) DUT ( .clk_in(clk_ref), .rst_n(rst_n), .locked(mmcm_locked), // Accumulator AXI-S bus .clk_m_axis(clk_eth_phy), // GMII PHY RX clock .m_axis_tdata(s_axis_accumulator_tdata), .m_axis_tvalid(s_axis_accumulator_tvalid), .m_axis_tready(s_axis_accumulator_tready), .m_axis_tlast(s_axis_accumulator_tlast), // Control AXI-S bus .clk_s_axis(clk_eth_phy), // GMII PHY TX clock .s_axis__tdata(maxis_control_tdata), .s_axis_tvalid(maxis_control_tvalid), .s_axis_tlast(maxis_control_tlast), .s_axis_tready(maxis_control_tready), // RTL-MAC handshake .request_ready(request_ready), .send_request(send_request), // DAC .dac_clk_o(clk_dac), .dac_data(dac_data), .dac_wrt(dac_wrt), // ADC .adc_clk_o(clk_adc), .adc_data(adc_data), .adc_otr(adc_otr) ); //------------------------------------------------------------ // Тактовые сигналы //------------------------------------------------------------ initial begin forever #(CLK_REF_PERIOD/2) clk_ref = ~clk_ref; end initial begin forever #(CLK_ETH_PHY_PERIOD/2) clk_eth_phy = ~clk_eth_phy; end //------------------------------------------------------------ // Таски для тестирования //------------------------------------------------------------ // task automatic axis_send_byte( // ref logic clk, // input logic [7:0] data, // input logic last, // ref logic tvalid, // ref logic [7:0] tdata, // ref logic tlast, // input logic tready // ); // @(posedge clk); // tdata <= data; // tlast <= last; // tvalid <= 1'b1; // // Ждем готовности приемника // wait(tready === 1'b1); // @(posedge clk); // tvalid <= 1'b0; // tlast <= 1'b0; // endtask // task automatic dut_soft_reset(); // axis_send_byte( // .clk(clk_eth_phy_rx), // .data(8'b00001111), // .last(1'b1), // .tvalid(m_axis_rx_tvalid), // .tdata(m_axis_rx_tdata), // .tlast(m_axis_rx_tlast), // .tready(m_axis_rx_tready) // ); // endtask // task automatic dut_start(); // axis_send_byte( // .clk(clk_eth_phy_rx), // .data(8'b11110000), // .last(1'b1), // .tvalid(m_axis_rx_tvalid), // .tdata(m_axis_rx_tdata), // .tlast(m_axis_rx_tlast), // .tready(m_axis_rx_tready) // ); // endtask // task automatic dut_send_config( // input logic [127:0] ctrl_config // ); // // команда set_data // axis_send_byte( // .clk(clk_eth_phy_rx), // .data(8'b10001000), // .last(1'b0), // .tvalid(m_axis_rx_tvalid), // .tdata(m_axis_rx_tdata), // .tlast(m_axis_rx_tlast), // .tready(m_axis_rx_tready) // ); // // config burst // for (int i = 0; i < 16; i++) begin // logic [7:0] byte_to_send; // logic is_last; // // get byte // byte_to_send = ctrl_config[i*8 +: 8]; // // tlast for last byte // is_last = (i == 15); // axis_send_byte( // .clk(clk_eth_phy_rx), // .data(byte_to_send), // .last(is_last), // .tvalid(m_axis_rx_tvalid), // .tdata(m_axis_rx_tdata), // .tlast(m_axis_rx_tlast), // .tready(m_axis_rx_tready) // ); // end // endtask //------------------------------------------------------------ // ОСНОВНОЙ ПРОЦЕСС ТЕСТИРОВАНИЯ //------------------------------------------------------------ initial begin $display("[TB] Tests start"); // Инициализация rst_n = 1; wait(mmcm_locked === 1'b1); #100; $display("[TB] ALL PASSED"); $finish; end endmodule