aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/top/e31x/sim/dram_test
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/top/e31x/sim/dram_test')
-rw-r--r--fpga/usrp3/top/e31x/sim/dram_test/Makefile65
-rw-r--r--fpga/usrp3/top/e31x/sim/dram_test/dram_test_tb.sv121
2 files changed, 186 insertions, 0 deletions
diff --git a/fpga/usrp3/top/e31x/sim/dram_test/Makefile b/fpga/usrp3/top/e31x/sim/dram_test/Makefile
new file mode 100644
index 000000000..164f956f3
--- /dev/null
+++ b/fpga/usrp3/top/e31x/sim/dram_test/Makefile
@@ -0,0 +1,65 @@
+#
+# Copyright 2015 Ettus Research LLC
+#
+
+#-------------------------------------------------
+# Top-of-Makefile
+#-------------------------------------------------
+# Define BASE_DIR to point to the "top" dir
+BASE_DIR = $(abspath ../../..)
+# Include viv_sim_preample after defining BASE_DIR
+include $(BASE_DIR)/../tools/make/viv_sim_preamble.mak
+
+#-------------------------------------------------
+# Design Specific
+#-------------------------------------------------
+# Define part using PART_ID (<device>/<package>/<speedgrade>)
+ARCH = zynq
+PART_ID= xc7z020/clg484/-1
+
+# Include makefiles and sources for the DUT and its dependencies
+include $(BASE_DIR)/../lib/fifo/Makefile.srcs
+include $(BASE_DIR)/../lib/axi/Makefile.srcs
+include $(BASE_DIR)/../lib/control/Makefile.srcs
+
+DESIGN_SRCS = $(abspath \
+$(FIFO_SRCS) \
+$(AXI_SRCS) \
+$(CONTROL_LIB_SRCS) \
+)
+
+#-------------------------------------------------
+# IP Specific
+#-------------------------------------------------
+# If simulation contains IP, define the IP_DIR and point
+# it to the base level IP directory
+IP_DIR = ../../ip
+
+# Include makefiles and sources for all IP components
+# *after* defining the IP_DIR
+include $(IP_DIR)/mig_7series_0/Makefile.inc
+
+DESIGN_SRCS += $(abspath \
+$(IP_MIG_7SERIES_0_SRCS) \
+)
+
+#-------------------------------------------------
+# Testbench Specific
+#-------------------------------------------------
+# Define only one toplevel module
+SIM_TOP = dram_test_tb
+
+SIM_SRCS = \
+$(abspath dram_test_tb.sv) \
+$(IP_MIG_7SERIES_0_SIM_OUTS) \
+$(IP_MIG_7SERIES_TG_SRCS) \
+$(SIM_GENERAL_SRCS) \
+$(SIM_AXI_SRCS)
+
+#-------------------------------------------------
+# 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/top/e31x/sim/dram_test/dram_test_tb.sv b/fpga/usrp3/top/e31x/sim/dram_test/dram_test_tb.sv
new file mode 100644
index 000000000..e447c80a6
--- /dev/null
+++ b/fpga/usrp3/top/e31x/sim/dram_test/dram_test_tb.sv
@@ -0,0 +1,121 @@
+//
+// Copyright 2016 Ettus Research
+//
+
+
+`timescale 1ns/1ps
+`define SIM_TIMEOUT_US 10000
+`define NS_PER_TICK 1
+`define NUM_TEST_CASES 3
+
+`define SIM_RUNTIME_US 100
+
+`include "sim_clks_rsts.vh"
+`include "sim_exec_report.vh"
+
+module dram_test_tb();
+ `TEST_BENCH_INIT("dram_test_tb",`NUM_TEST_CASES,`NS_PER_TICK)
+
+ // Define all clocks and resets
+ `DEFINE_CLK(sys_clk, 10, 50) //100MHz sys_clk to generate DDR3 clocking
+ `DEFINE_CLK(ref_clk, 5, 50) //200MHz ref_clk to generate DDR3 clocking
+ `DEFINE_RESET(sys_rst, 0, 250000) //100ns for GSR to deassert
+
+ // Initialize DUT
+ wire calib_complete;
+
+ wire [15:0] ddr3_dq; // Data pins. Input for Reads; Output for Writes.
+ wire [1:0] ddr3_dqs_n; // Data Strobes. Input for Reads; Output for Writes.
+ wire [1:0] ddr3_dqs_p;
+ wire [14:0] ddr3_addr; // Address
+ wire [2:0] ddr3_ba; // Bank Address
+ wire ddr3_ras_n; // Row Address Strobe.
+ wire ddr3_cas_n; // Column address select
+ wire ddr3_we_n; // Write Enable
+ wire ddr3_reset_n; // SDRAM reset pin.
+ wire [0:0] ddr3_ck_p; // Differential clock
+ wire [0:0] ddr3_ck_n;
+ wire [0:0] ddr3_cke; // Clock Enable
+ wire [0:0] ddr3_cs_n; // Chip Select
+ wire [3:0] ddr3_dm; // Data Mask [3] = UDM.U26; [2] = LDM.U26;
+ wire [0:0] ddr3_odt; // On-Die termination enable.
+
+ ddr3_model #(
+ .DEBUG(1) //Disable verbose prints
+ ) sdram_i0 (
+ .rst_n (ddr3_reset_n),
+ .ck (ddr3_ck_p),
+ .ck_n (ddr3_ck_n),
+ .cke (ddr3_cke),
+ .cs_n (1'b0),
+ .ras_n (ddr3_ras_n),
+ .cas_n (ddr3_cas_n),
+ .we_n (ddr3_we_n),
+ .dm_tdqs (ddr3_dm[1:0]),
+ .ba (ddr3_ba),
+ .addr (ddr3_addr),
+ .dq (ddr3_dq[15:0]),
+ .dqs (ddr3_dqs_p[1:0]),
+ .dqs_n (ddr3_dqs_n[1:0]),
+ .tdqs_n (), // Unused on x16
+ .odt (ddr3_odt)
+ );
+
+ example_top inst_example_top
+ (
+ .ddr3_dq (ddr3_dq),
+ .ddr3_dqs_n (ddr3_dqs_n),
+ .ddr3_dqs_p (ddr3_dqs_p),
+ .ddr3_addr (ddr3_addr),
+ .ddr3_ba (ddr3_ba),
+ .ddr3_ras_n (ddr3_ras_n),
+ .ddr3_cas_n (ddr3_cas_n),
+ .ddr3_we_n (ddr3_we_n),
+ .ddr3_reset_n (ddr3_reset_n),
+ .ddr3_ck_p (ddr3_ck_p),
+ .ddr3_ck_n (ddr3_ck_n),
+ .ddr3_cke (ddr3_cke),
+ .ddr3_dm (ddr3_dm),
+ .ddr3_odt (ddr3_odt),
+ .sys_clk_i (sys_clk),
+ .clk_ref_i (ref_clk),
+ .tg_compare_error (tg_compare_error),
+ .init_calib_complete (calib_complete),
+ .sys_rst (sys_rst)
+ );
+
+ //
+ //Make sure we catch the error condition
+ //
+ reg tg_compare_error_reg;
+ always @ (posedge sys_clk)
+ if (sys_rst)
+ tg_compare_error_reg = 1'b0;
+ else
+ tg_compare_error_reg = tg_compare_error | tg_compare_error_reg;
+
+ //------------------------------------------
+ //Main thread for testbench execution
+ //------------------------------------------
+
+ initial begin : tb_main
+
+ `TEST_CASE_START("Wait for reset");
+ while (sys_rst) @(posedge sys_clk);
+ `TEST_CASE_DONE((~sys_rst));
+
+ repeat (200) @(posedge sys_clk);
+
+ `TEST_CASE_START("Wait for initial calibration to complete");
+ while (calib_complete !== 1'b1) @(posedge sys_clk);
+ `TEST_CASE_DONE(calib_complete);
+
+ `TEST_CASE_START("Run for a while, then check for error");
+ repeat (2_000_000) @(posedge sys_clk);
+ `ASSERT_ERROR(tg_compare_error_reg == 1'b0, "Test generator reported error");
+ `TEST_CASE_DONE(1'b1);
+ `TEST_BENCH_DONE;
+
+ end
+
+endmodule