aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/lib/sim/fifo/axi_fifo
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/lib/sim/fifo/axi_fifo')
-rw-r--r--fpga/usrp3/lib/sim/fifo/axi_fifo/Makefile34
-rw-r--r--fpga/usrp3/lib/sim/fifo/axi_fifo/axi_fifo_tb.sv134
2 files changed, 168 insertions, 0 deletions
diff --git a/fpga/usrp3/lib/sim/fifo/axi_fifo/Makefile b/fpga/usrp3/lib/sim/fifo/axi_fifo/Makefile
new file mode 100644
index 000000000..3cd861176
--- /dev/null
+++ b/fpga/usrp3/lib/sim/fifo/axi_fifo/Makefile
@@ -0,0 +1,34 @@
+#
+# Copyright 2016 Ettus Research
+#
+
+#-------------------------------------------------
+# Top-of-Makefile
+#-------------------------------------------------
+# Define BASE_DIR to point to the "top" dir
+BASE_DIR = $(abspath ../../../../top)
+# Include viv_sim_preamble after defining BASE_DIR
+include $(BASE_DIR)/../tools/make/viv_sim_preamble.mak
+
+#-------------------------------------------------
+# Testbench Specific
+#-------------------------------------------------
+# Define only one toplevel module
+SIM_TOP = axi_fifo_tb
+
+SIM_SRCS = $(abspath \
+axi_fifo_tb.sv \
+$(LIB_DIR)/fifo/axi_fifo.v \
+$(LIB_DIR)/fifo/axi_fifo_flop.v \
+$(LIB_DIR)/fifo/axi_fifo_flop2.v \
+$(LIB_DIR)/fifo/axi_fifo_short.v \
+$(LIB_DIR)/fifo/axi_fifo_bram.v \
+)
+
+#-------------------------------------------------
+# Bottom-of-Makefile
+#-------------------------------------------------
+# Include all simulator specific makefiles here
+# Each should define a unique target to simulate
+# e.g. xsim, vsim, etc and a common "clean" target
+include $(BASE_DIR)/../tools/make/viv_simulator.mak
diff --git a/fpga/usrp3/lib/sim/fifo/axi_fifo/axi_fifo_tb.sv b/fpga/usrp3/lib/sim/fifo/axi_fifo/axi_fifo_tb.sv
new file mode 100644
index 000000000..c2832cade
--- /dev/null
+++ b/fpga/usrp3/lib/sim/fifo/axi_fifo/axi_fifo_tb.sv
@@ -0,0 +1,134 @@
+//
+// Copyright 2016 Ettus Research
+//
+
+`timescale 1ns/1ps
+`define SIM_TIMEOUT_US 1000
+`define NS_PER_TICK 1
+`define NUM_TEST_CASES 4
+
+`include "sim_exec_report.vh"
+`include "sim_clks_rsts.vh"
+`include "sim_cvita_lib.svh"
+`include "sim_axis_lib.svh"
+`include "sim_set_rb_lib.svh"
+
+module axi_fifo_tb();
+ /*********************************************
+ ** Setup Testbench
+ *********************************************/
+ `TEST_BENCH_INIT("axi_fifo_tb",`NUM_TEST_CASES,`NS_PER_TICK);
+ localparam CLK_PERIOD = $ceil(1e9/166.67e6);
+ `DEFINE_CLK(clk, CLK_PERIOD, 50);
+ `DEFINE_RESET(reset, 0, 100);
+
+ // 4 variants: axi_fifo_flop, axi_fifo_flop2, axi_fifo_short, axi_fifo_bram
+ localparam NUM_FIFOS = 4;
+ localparam integer FIFO_SIZES[NUM_FIFOS-1:0] = '{0,1,5,8};
+ localparam NUM_ITERATIONS = 10000;
+
+ /*********************************************
+ ** DUTs
+ ** - Instances of all variations of AXI FIFO
+ *********************************************/
+ reg [NUM_FIFOS-1:0] clear;
+ axis_master #(.DWIDTH(32), .NUM_STREAMS(NUM_FIFOS)) m_axis(.clk(clk));
+ axis_slave #(.DWIDTH(32), .NUM_STREAMS(NUM_FIFOS)) s_axis(.clk(clk));
+
+ genvar n;
+ generate
+ for (n = 0; n < NUM_FIFOS; n = n + 1) begin
+ axi_fifo #(
+ .SIZE(FIFO_SIZES[n]),
+ .WIDTH(32))
+ axi_fifo (
+ .clk(clk), .reset(reset), .clear(clear[n]),
+ .i_tdata(m_axis.axis.tdata[32*n +: 32]), .i_tvalid(m_axis.axis.tvalid[n]), .i_tready(m_axis.axis.tready[n]),
+ .o_tdata(s_axis.axis.tdata[32*n +: 32]), .o_tvalid(s_axis.axis.tvalid[n]), .o_tready(s_axis.axis.tready[n]),
+ .space(), .occupied());
+ end
+ endgenerate
+
+ /*********************************************
+ ** Testbench
+ *********************************************/
+ int write_word = 0;
+ int read_word = 0;
+ logic last;
+ string s;
+
+ initial begin
+ clear = 'd0;
+
+ /********************************************************
+ ** Test 1 -- Reset
+ ********************************************************/
+ `TEST_CASE_START("Wait for Reset");
+ m_axis.reset();
+ s_axis.reset();
+ while (reset) @(posedge clk);
+ `TEST_CASE_DONE(~reset);
+
+ /********************************************************
+ ** Test 2 -- Check filling FIFOs
+ ********************************************************/
+ `TEST_CASE_START("Check filling FIFOs");
+ for (int i = 0; i < NUM_FIFOS; i++) begin
+ $display("Testing FIFO %0d, SIZE %0d",i,2**FIFO_SIZES[i]);
+ for (int k = 0; k < 2**FIFO_SIZES[i]; k++) begin
+ $sformat(s,"FIFO size should be %0d entries, but detected %0d!",2**FIFO_SIZES[i],k);
+ `ASSERT_FATAL(m_axis.axis.tready[i],s);
+ m_axis.push_word(k,0,i);
+ end
+ $sformat(s,"FIFO depth appears to be greater than %0d entries! Might be due to output registering.",2**FIFO_SIZES[i]);
+ `ASSERT_WARN(~m_axis.axis.tready[i],s);
+ end
+ `TEST_CASE_DONE(1);
+
+ /********************************************************
+ ** Test 3 -- Check emptying FIFOs
+ ********************************************************/
+ `TEST_CASE_START("Check emptying FIFOs");
+ for (int i = 0; i < NUM_FIFOS; i++) begin
+ $display("Testing FIFO %0d, SIZE %0d",i,2**FIFO_SIZES[i]);
+ for (int k = 0; k < 2**FIFO_SIZES[i]; k = k + 1) begin
+ $sformat(s,"FIFO prematurely empty! Occured after %0d reads!",k);
+ `ASSERT_FATAL(s_axis.axis.tvalid[i],s);
+ s_axis.pull_word(read_word,last,i);
+ $sformat(s,"Read invalid FIFO word! Expected: %0d, Actual: %0d",k,read_word);
+ `ASSERT_FATAL(read_word == k,s);
+ end
+ `ASSERT_FATAL(~s_axis.axis.tvalid[i],"FIFO not empty after reading all entries!");
+ end
+ `TEST_CASE_DONE(1);
+
+ /********************************************************
+ ** Test 4 -- Randomized Write / Read Timing
+ ********************************************************/
+ `TEST_CASE_START("Randomized Write / Read");
+ for (int i = 0; i < NUM_FIFOS; i++) begin
+ $display("Testing FIFO %0d, SIZE %0d",i,2**FIFO_SIZES[i]);
+ fork
+ begin
+ write_word = 0;
+ for (int k = 0; k < NUM_ITERATIONS; k++) begin
+ while ($signed($random()) > 0) @(posedge clk);
+ m_axis.push_word(write_word,0,i);
+ write_word++;
+ end
+ end
+ begin
+ for (int k = 0; k < NUM_ITERATIONS; k++) begin
+ while ($signed($random()) > 0) @(posedge clk);
+ s_axis.pull_word(read_word,last,i);
+ $sformat(s,"Read invalid FIFO word! Expected: %0d, Actual: %0d",read_word,k);
+ `ASSERT_FATAL(read_word == k,s);
+ end
+ end
+ join
+ end
+ `TEST_CASE_DONE(1);
+ `TEST_BENCH_DONE;
+ end
+
+endmodule