`timescale 1ns / 1ps module sampler_tb; localparam DATA_WIDTH = 12; localparam PACK_FACTOR = 1; localparam PROCESS_MODE = 0; localparam CLK_PERIOD = 15.3846; // ===================================================== // DUT SIGNALS // ===================================================== logic clk; logic rst; logic [DATA_WIDTH-1:0] data_in; logic out_of_range; logic [31:0] smp_num; logic done; logic request; logic [DATA_WIDTH*PACK_FACTOR-1:0] m_axis_tdata; logic m_axis_tvalid; // ===================================================== // SCOREBOARD // ===================================================== int received_count; int expected_count; // ===================================================== // DUT // ===================================================== sampler #( .DATA_WIDTH (DATA_WIDTH), .PACK_FACTOR (PACK_FACTOR), .PROCESS_MODE(PROCESS_MODE) ) dut ( .clk_in (clk), .rst (rst), .data_in (data_in), .out_of_range (out_of_range), .smp_num (smp_num), .done (done), .m_axis_tdata (m_axis_tdata), .m_axis_tvalid(m_axis_tvalid), .request (request) ); // ===================================================== // CLOCK // ===================================================== initial begin clk = 0; forever #(CLK_PERIOD/2) clk = ~clk; end // ===================================================== // RESET // ===================================================== initial begin rst = 1; data_in = 0; out_of_range = 0; done = 0; smp_num = 0; repeat(5) @(posedge clk); rst = 0; end // ===================================================== // RECEIVED COUNTER // ===================================================== always @(posedge clk) begin if (m_axis_tvalid) received_count++; end // ===================================================== // CONFIG // ===================================================== task automatic set_config(input int n); begin smp_num = n; @(posedge clk); end endtask // ===================================================== // WAIT SAMPLER START // ===================================================== task automatic wait_sampler_start; begin wait(dut.enable == 1'b1); // @(negedge clk); end endtask // ===================================================== // HANDSHAKE // ===================================================== task automatic synchronize_sampler( input bit sampler_first, input int delay_before_ack, input int ack_duration ); begin if (sampler_first) begin repeat(delay_before_ack) @(posedge clk); done <= 1'b1; wait(request == 1'b1); repeat(ack_duration) @(posedge clk); done <= 1'b0; end else begin wait(request == 1'b1); repeat(delay_before_ack) @(posedge clk); done <= 1'b1; repeat(ack_duration) @(posedge clk); done <= 1'b0; end end endtask // ===================================================== // DATA FEED // ===================================================== task automatic feed_data_stream( input int num_words, input bit random_data, input bit random_out_of_range ); logic [DATA_WIDTH-1:0] value; bit oor; begin value = 1; for (int i = 0; i < num_words; i++) begin if (random_data) value = $urandom_range(1, (1<