1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
//
// Copyright 2016 Ettus Research
//
`timescale 1ns/1ps
`define SIM_TIMEOUT_US 120
`define NS_PER_TICK 1
`define NUM_TEST_CASES 7
`include "sim_clks_rsts.vh"
`include "sim_exec_report.vh"
`include "sim_cvita_lib.svh"
`include "sim_axi4_lib.svh"
`include "sim_set_rb_lib.svh"
module dram_fifo_tb();
`TEST_BENCH_INIT("dram_fifo_tb",`NUM_TEST_CASES,`NS_PER_TICK)
// Define all clocks and resets
`DEFINE_DIFF_CLK(sys_clk_p, sys_clk_n, 10, 50) //100MHz differential sys_clk to generate DDR3 clocking
`DEFINE_CLK(bus_clk, 1000/200, 50) //200MHz bus_clk
`DEFINE_CLK(dma_engine_clk, 1000.0/305.0, 50) //305MHz dma_engine_clk
`DEFINE_RESET(bus_rst, 0, 100) //100ns for GSR to deassert
`DEFINE_RESET_N(sys_rst_n, 0, 100) //100ns for GSR to deassert
settings_bus_master #(.SR_AWIDTH(8),.SR_DWIDTH(32)) tst_set (.clk(bus_clk));
cvita_master chdr_i (.clk(bus_clk));
cvita_slave chdr_o (.clk(bus_clk));
// Initialize DUT
wire calib_complete;
axis_dram_fifo_single dut_single (
.bus_clk(bus_clk),
.bus_rst(bus_rst),
.sys_clk_p(sys_clk_p),//use differential clock on N310
.sys_clk_n(sys_clk_n),
.sys_rst_n(sys_rst_n),
.dma_engine_clk(dma_engine_clk),
.i_tdata(chdr_i.axis.tdata),
.i_tlast(chdr_i.axis.tlast),
.i_tvalid(chdr_i.axis.tvalid),
.i_tready(chdr_i.axis.tready),
.o_tdata(chdr_o.axis.tdata),
.o_tlast(chdr_o.axis.tlast),
.o_tvalid(chdr_o.axis.tvalid),
.o_tready(chdr_o.axis.tready),
.set_stb(tst_set.settings_bus.set_stb),
.set_addr(tst_set.settings_bus.set_addr),
.set_data(tst_set.settings_bus.set_data),
.rb_data(),
.forced_bit_err(64'h0),
.init_calib_complete(calib_complete)
);
//Testbench variables
cvita_hdr_t header;
cvita_pkt_t pkt_out;
integer i;
//------------------------------------------
//Main thread for testbench execution
//------------------------------------------
initial begin : tb_main
string s;
`TEST_CASE_START("Wait for reset");
while (bus_rst) @(posedge bus_clk);
while (~sys_rst_n) @(posedge sys_clk_p);
`TEST_CASE_DONE((~bus_rst & sys_rst_n));
`TEST_CASE_START("Wait for initial calibration to complete");
while (calib_complete !== 1'b1) @(posedge bus_clk);
`TEST_CASE_DONE(calib_complete);
`TEST_CASE_START("Clear FIFO");
tst_set.write(1, {16'h0, 12'd280, 2'b00, 1'b0, 1'b1});
repeat (200) @(posedge bus_clk);
tst_set.write(1, {16'h0, 12'd280, 2'b00, 1'b0, 1'b0});
repeat (200) @(posedge bus_clk);
`TEST_CASE_DONE(1);
header = '{
pkt_type:DATA, has_time:0, eob:0, seqnum:12'h666,
length:0, src_sid:$random, dst_sid:$random, timestamp:64'h0};
`TEST_CASE_START("Fill up empty FIFO then drain (short packet)");
chdr_i.push_ramp_pkt(16, 64'd0, 64'h100, header);
chdr_o.pull_pkt(pkt_out);
$sformat(s, "Bad packet: Length mismatch. Expected: %0d, Actual: %0d",16,pkt_out.payload.size());
`ASSERT_ERROR(pkt_out.payload.size()==16, s);
$sformat(s, "Bad packet: Wrong SID. Expected: %08x, Actual: %08x",
{header.src_sid,header.dst_sid},{pkt_out.hdr.src_sid,pkt_out.hdr.dst_sid});
`ASSERT_ERROR({header.src_sid,header.dst_sid}=={pkt_out.hdr.src_sid,pkt_out.hdr.dst_sid}, s);
`TEST_CASE_DONE(1);
`TEST_CASE_START("Fill up empty FIFO then drain (long packet)");
chdr_i.push_ramp_pkt(1024, 64'd0, 64'h100, header);
chdr_o.pull_pkt(pkt_out);
$sformat(s, "Bad packet: Length mismatch. Expected: %0d, Actual: %0d",1024,pkt_out.payload.size());
`ASSERT_ERROR(pkt_out.payload.size()==1024, s);
$sformat(s, "Bad packet: Wrong SID. Expected: %08x, Actual: %08x",
{header.src_sid,header.dst_sid},{pkt_out.hdr.src_sid,pkt_out.hdr.dst_sid});
`ASSERT_ERROR({header.src_sid,header.dst_sid}=={pkt_out.hdr.src_sid,pkt_out.hdr.dst_sid}, s);
`TEST_CASE_DONE(1);
header = '{
pkt_type:DATA, has_time:0, eob:0, seqnum:12'h666,
length:0, src_sid:$random, dst_sid:$random, timestamp:64'h0};
`TEST_CASE_START("Concurrent read and write (single packet)");
fork
begin
chdr_i.push_ramp_pkt(20, 64'd0, 64'h100, header);
end
begin
chdr_o.pull_pkt(pkt_out);
end
join
$sformat(s, "Bad packet: Length mismatch. Expected: %0d, Actual: %0d",20,pkt_out.payload.size());
`ASSERT_ERROR(pkt_out.payload.size()==20, s);
i = 0;
repeat (20) begin
$sformat(s, "Bad packet: Wrong payload. Index: %d, Expected: %08x, Actual: %08x",
i,(i * 64'h100),pkt_out.payload[i]);
`ASSERT_ERROR(pkt_out.payload[i]==(i * 64'h100), s);
end
`TEST_CASE_DONE(1);
`TEST_CASE_START("Concurrent read and write (multiple packets)");
fork
begin
repeat (10) begin
chdr_i.push_ramp_pkt(20, 64'd0, 64'h100, header);
repeat (30) @(posedge bus_clk);
end
end
begin
repeat (10) begin
chdr_o.pull_pkt(pkt_out);
$sformat(s, "Bad packet: Length mismatch. Expected: %0d, Actual: %0d",20,pkt_out.payload.size());
`ASSERT_ERROR(pkt_out.payload.size()==20, s);
i = 0;
repeat (20) begin
$sformat(s, "Bad packet: Wrong payload. Index: %d, Expected: %08x, Actual: %08x",
i,(i * 64'h100),pkt_out.payload[i]);
`ASSERT_ERROR(pkt_out.payload[i]==(i * 64'h100), s);
end
end
end
join
`TEST_CASE_DONE(1);
`TEST_BENCH_DONE;
end
endmodule
|