aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/lib/sim/fifo/axi_fifo_2clk
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/lib/sim/fifo/axi_fifo_2clk')
-rw-r--r--fpga/usrp3/lib/sim/fifo/axi_fifo_2clk/axi_fifo_2clk_tb.sv121
1 files changed, 121 insertions, 0 deletions
diff --git a/fpga/usrp3/lib/sim/fifo/axi_fifo_2clk/axi_fifo_2clk_tb.sv b/fpga/usrp3/lib/sim/fifo/axi_fifo_2clk/axi_fifo_2clk_tb.sv
new file mode 100644
index 000000000..c2c69b963
--- /dev/null
+++ b/fpga/usrp3/lib/sim/fifo/axi_fifo_2clk/axi_fifo_2clk_tb.sv
@@ -0,0 +1,121 @@
+//
+// Copyright 2016 Ettus Research
+//
+
+module axi_fifo_2clk_tb();
+
+ localparam WIDTH = 32;
+ localparam SIZE = 5;
+
+ reg s_axis_clk;
+ reg s_axis_rst;
+ reg [WIDTH-1:0] s_axis_tdata;
+ reg s_axis_tvalid;
+ reg s_axis_tlast;
+ wire s_axis_tready;
+ reg m_axis_clk;
+ reg m_axis_rst;
+ wire [WIDTH-1:0] m_axis_tdata;
+ wire m_axis_tvalid;
+ wire m_axis_tlast;
+ reg m_axis_tready;
+ wire [SIZE:0] s_axis_occupied;
+ wire s_axis_full;
+ wire s_axis_empty;
+ wire [SIZE:0] m_axis_occupied;
+ wire m_axis_full;
+ wire m_axis_empty;
+
+ axi_fifo_2clk #(.SIZE(SIZE),.WIDTH(WIDTH)) axi_fifo_2clk (
+ .s_axis_clk(s_axis_clk),
+ .s_axis_rst(s_axis_rst),
+ .s_axis_tdata(s_axis_tdata),
+ .s_axis_tvalid(s_axis_tvalid),
+ .s_axis_tlast(s_axis_tlast),
+ .s_axis_tready(s_axis_tready),
+ .m_axis_clk(m_axis_clk),
+ .m_axis_rst(m_axis_rst),
+ .m_axis_tdata(m_axis_tdata),
+ .m_axis_tvalid(m_axis_tvalid),
+ .m_axis_tlast(m_axis_tlast),
+ .m_axis_tready(m_axis_tready),
+ .s_axis_occupied(s_axis_occupied),
+ .s_axis_full(s_axis_full),
+ .s_axis_empty(s_axis_empty),
+ .m_axis_occupied(m_axis_occupied),
+ .m_axis_full(m_axis_full),
+ .m_axis_empty(m_axis_empty));
+
+ `define S_AXIS_CLK_PERIOD 7
+ initial begin
+ s_axis_clk = 1'b0;
+ forever begin
+ #(`S_AXIS_CLK_PERIOD/2) s_axis_clk = ~s_axis_clk;
+ end
+ end
+
+ `define S_AXIS_RESET_PERIOD 70
+ initial begin
+ s_axis_rst = 1'b1;
+ #(`S_AXIS_RESET_PERIOD) s_axis_rst = 1'b0;
+ end
+
+ `define M_AXIS_CLK_PERIOD 10
+ initial begin
+ m_axis_clk = 1'b0;
+ forever begin
+ #(`M_AXIS_CLK_PERIOD/2) m_axis_clk = ~m_axis_clk;
+ end
+ end
+
+ `define M_AXIS_RESET_PERIOD 100
+ initial begin
+ m_axis_rst = 1'b1;
+ #(`M_AXIS_RESET_PERIOD) m_axis_rst = 1'b0;
+ end
+
+ initial begin
+ @(posedge m_axis_clk);
+ @(posedge s_axis_clk);
+ s_axis_tdata = 'd0;
+ s_axis_tlast = 1'b0;
+ s_axis_tvalid = 1'b0;
+ m_axis_tready = 1'b0;
+ assert(~s_axis_full && ~m_axis_full) else $error("FIFO is full during reset!");
+ assert(s_axis_empty == 1'b1 && m_axis_empty == 1'b1) else $error("FIFO is not empty during reset!");
+ assert(s_axis_occupied == 0 && m_axis_occupied == 0) else $error("FIFO is occupied during reset!");
+ while (s_axis_rst) @(negedge s_axis_rst);
+ while (m_axis_rst) @(negedge m_axis_rst);
+ @(posedge m_axis_clk);
+ @(posedge s_axis_clk);
+ assert(~s_axis_full && ~m_axis_full) else $error("FIFO is full after reset!");
+ assert(s_axis_empty == 1'b1 && m_axis_empty == 1'b1) else $error("FIFO is not empty after reset!");
+ assert(s_axis_occupied == 0 && m_axis_occupied == 0) else $error("FIFO is occupied after reset!");
+ // Fill FIFO
+ while (~s_axis_tready) @(posedge s_axis_clk);
+ for (int i = 0; i < 1 << DEPTH_LOG2; i++) begin
+ s_axis_tdata = i+1'b1;
+ s_axis_tvalid = 1'b1;
+ @(posedge s_axis_clk);
+ end
+ repeat (6) @(posedge s_axis_clk);
+ assert(s_axis_full && m_axis_full) else $error("Incorrect FIFO full flag!");
+ assert(~s_axis_empty && ~m_axis_empty) else $error("Incorrect FIFO empty flag!");
+ assert(s_axis_occupied == (1 << DEPTH_LOG2) && m_axis_occupied == (1 << DEPTH_LOG2)) else $error("Incorrect FIFO occupied count!");
+ // Empty FIFO
+ s_axis_tdata = 'd0;
+ s_axis_tvalid = 1'b0;
+ @(posedge m_axis_clk);
+ while (~m_axis_tvalid) @(posedge m_axis_clk);
+ for (int i = 0; i < 1 << DEPTH_LOG2; i++) begin
+ m_axis_tready = 1'b1;
+ @(posedge m_axis_clk);
+ assert(m_axis_tdata == i+1'b1) else $error("Incorrect FIFO data! (read)");
+ end
+ repeat (6) @(posedge m_axis_clk);
+ assert(~s_axis_full && ~m_axis_full) else $error("Incorrect FIFO full flag!");
+ assert(s_axis_empty && m_axis_empty) else $error("Incorrect FIFO empty flag!");
+ assert(s_axis_occupied == 0 && m_axis_occupied == 0) else $error("Incorrect FIFO occupied count!");
+ end
+
+endmodule \ No newline at end of file