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
110 lines
3.1 KiB
Systemverilog
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
|