Files
b210-k7-fpga/top/x400/rf/sim/tb_adc_iq_repacker.sv
5cadf901c7 fpga: Add X440/FBX support
Co-authored-by: Martin Braun <martin.braun@ettus.com>
Co-authored-by: Wade Fife <wade.fife@ni.com>
Co-authored-by: Ryan Marlow <ryan@lmarlow.com>


Original-commit: 596760a12e4834e47589c12f8a4fd083aa2f7c25
2023-06-12 10:27:29 -05:00

110 lines
3.1 KiB
Systemverilog

//
// Copyright 2022 Ettus Research, a National Instruments Brand
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//
// Module: tb_adc_iq_repacker
//
// Description:
//
// This testbench mainly tests tb_adc_iq_repacker. It runs
// 3 different tests:
// - test data propagation when not swapping data
// - test data propagation when swapping data
// - check that data valid does not propagate when block
// is not enabled.
//
`timescale 1ns/1ps
`define NS_PER_TICK 1
`define NUM_TEST_CASES 3
`include "sim_clks_rsts.vh"
`include "sim_exec_report.vh"
module tb_adc_iq_repacker();
import PkgRandom::*;
`TEST_BENCH_INIT("tb_adc_iq_repacker", `NUM_TEST_CASES, `NS_PER_TICK);
//sets up clock
localparam CLK_PERIOD = $ceil(1e9/100.0e6);
`DEFINE_CLK(clk, CLK_PERIOD, 50);
//declare parameters
localparam SPC = 1;
localparam SAMPLE_WIDTH = 16;
//declare wires and regs
reg enable;
reg valid_in;
reg swap_iq;
reg [SPC*SAMPLE_WIDTH-1:0] adc_q_in;
reg [SPC*SAMPLE_WIDTH-1:0] adc_i_in;
reg StopSim;
wire [SPC*SAMPLE_WIDTH*2-1:0] data_out_tdata;
wire data_out_tvalid;
PkgRandom::Rand #(SPC*SAMPLE_WIDTH) rand_i;
PkgRandom::Rand #(SPC*SAMPLE_WIDTH) rand_q;
// instance adc_iq_repacker
adc_iq_repacker #(
.SPC(SPC),
.SAMPLE_WIDTH(SAMPLE_WIDTH)
) adc_iq_repacker_inst (
.clk(clk),
// Data in
.adc_q_in(adc_q_in),
.adc_i_in(adc_i_in),
.valid_in(valid_in),
.enable(enable),
// Data is packed [Q,I] (I in LSBs) when swap_iq is '0', and [I,Q] otherwise
.swap_iq(swap_iq),
// Data out
.data_out_tdata(data_out_tdata),
.data_out_tvalid(data_out_tvalid)
);
// initial statement with test cases
initial begin : tb_main
// test data propagation when not swapping data
`TEST_CASE_START("test data propagation, no swap, core enabled");
repeat (10) @(posedge clk);
swap_iq = 0;
enable = 1;
StopSim = 0;
valid_in = 1;
for (int i = 0; i < 10; i++) begin
adc_q_in = rand_q.rand_bit();
adc_i_in = rand_i.rand_bit();
repeat (3) @(posedge clk);
`ASSERT_ERROR(data_out_tdata[SAMPLE_WIDTH*2-1:0] == {adc_q_in[SAMPLE_WIDTH-1:0], adc_i_in[SAMPLE_WIDTH-1:0]}, "Output data is wrong");
`ASSERT_ERROR(data_out_tvalid == 1, "output valid not asserted");
end
`TEST_CASE_DONE(1);
// test data propagation when swapping data
`TEST_CASE_START("test data propagation w/ swap_iq=1");
swap_iq = 1;
for (int i = 0; i < 10; i++) begin
adc_q_in = rand_q.rand_bit();
adc_i_in = rand_i.rand_bit();
repeat (3) @(posedge clk);
`ASSERT_ERROR(data_out_tdata[SAMPLE_WIDTH*2-1:0] == {adc_i_in[SAMPLE_WIDTH-1:0], adc_q_in[SAMPLE_WIDTH-1:0]}, "Output data is wrong");
`ASSERT_ERROR(data_out_tvalid == 1, "output valid not asserted");
end
`TEST_CASE_DONE(1);
// check that data valid does not propagate when block
// is not enabled.
`TEST_CASE_START("test data valid when enable = 0");
enable = 0;
repeat (10) @(posedge clk);
`ASSERT_ERROR(data_out_tvalid == 0, "block should be disabled");
`TEST_CASE_DONE(1);
StopSim = 1;
end
endmodule : tb_adc_iq_repacker