aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/top/x300/sim/x300_pcie_int
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/top/x300/sim/x300_pcie_int')
-rw-r--r--fpga/usrp3/top/x300/sim/x300_pcie_int/Makefile66
-rw-r--r--fpga/usrp3/top/x300/sim/x300_pcie_int/x300_pcie_int_tb.sv596
2 files changed, 662 insertions, 0 deletions
diff --git a/fpga/usrp3/top/x300/sim/x300_pcie_int/Makefile b/fpga/usrp3/top/x300/sim/x300_pcie_int/Makefile
new file mode 100644
index 000000000..02aaef59c
--- /dev/null
+++ b/fpga/usrp3/top/x300/sim/x300_pcie_int/Makefile
@@ -0,0 +1,66 @@
+#
+# 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 = kintex7
+PART_ID = xc7k410t/ffg900/-2
+
+# Include makefiles and sources for the DUT and its dependencies
+include $(BASE_DIR)/../lib/control/Makefile.srcs
+include $(BASE_DIR)/../lib/packet_proc/Makefile.srcs
+include $(BASE_DIR)/../lib/fifo/Makefile.srcs
+include $(BASE_DIR)/../lib/io_port2/Makefile.srcs
+
+DESIGN_SRCS = $(abspath \
+$(FIFO_SRCS) \
+$(CONTROL_LIB_SRCS) \
+$(PACKET_PROC_SRCS) \
+$(IOPORT2_SRCS) \
+../../x300_pcie_int.v \
+)
+
+#-------------------------------------------------
+# 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)/fifo_short_2clk/Makefile.inc
+include $(IP_DIR)/fifo_4k_2clk/Makefile.inc
+
+DESIGN_SRCS += $(abspath \
+$(IP_FIFO_4K_2CLK_SRCS) \
+$(IP_FIFO_SHORT_2CLK_SRCS) \
+)
+
+#-------------------------------------------------
+# Testbench Specific
+#-------------------------------------------------
+# Define only one toplevel module
+SIM_TOP = x300_pcie_int_tb
+
+SIM_SRCS = \
+$(abspath x300_pcie_int_tb.sv)
+
+#-------------------------------------------------
+# 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/x300/sim/x300_pcie_int/x300_pcie_int_tb.sv b/fpga/usrp3/top/x300/sim/x300_pcie_int/x300_pcie_int_tb.sv
new file mode 100644
index 000000000..0093e4315
--- /dev/null
+++ b/fpga/usrp3/top/x300/sim/x300_pcie_int/x300_pcie_int_tb.sv
@@ -0,0 +1,596 @@
+//
+// Copyright 2013 Ettus Research LLC
+//
+
+
+`timescale 1ns/1ps
+`define NS_PER_TICK 1
+`define NUM_TEST_CASES 23
+
+`define SIM_TIMEOUT_US 1000 // 1ms
+
+`include "sim_clks_rsts.vh"
+`include "sim_exec_report.vh"
+
+module x300_pcie_int_tb();
+ `DEFINE_CLK(clk, 8.000, 50)
+ `DEFINE_RESET(reset, 0, 10)
+
+ `TEST_BENCH_INIT("x300_pcie_int_tb",`NUM_TEST_CASES,`NS_PER_TICK)
+
+ reg temp_pass = 0;
+ reg pkt_swap = 0;
+ reg [15:0] it = 0;
+ reg [15:0] tx_ch, rx_ch = 0;
+
+ reg [31:0] dma_sample_cnt = 0;
+ reg [31:0] dma_packet_cnt = 0;
+ reg [31:0] dma_out_sample_cnt[0:5];
+ reg [63:0] dma_out_last_sample[0:5];
+
+ reg pcie_usr_reg_wr, pcie_usr_reg_rd;
+ reg [1:0] pcie_usr_reg_len;
+ reg [19:0] pcie_usr_reg_addr;
+ reg [31:0] pcie_usr_reg_data_in, pcie_usr_data;
+ wire pcie_usr_reg_rc, pcie_usr_reg_rdy;
+ wire [31:0] pcie_usr_reg_data_out;
+
+ wire chinch_reg_wr, chinch_reg_rd;
+ wire [1:0] chinch_reg_len;
+ wire [19:0] chinch_reg_addr;
+ wire [31:0] chinch_reg_data_out;
+ reg chinch_reg_rc, chinch_reg_rdy;
+ reg [31:0] chinch_reg_data_in;
+
+ reg [2:0] i_chan, o_chan;
+ reg [383:0] i_tdata_par;
+ reg [5:0] i_tvalid_par = 6'b000000, o_tready_par = 6'b111111;
+ wire [383:0] o_tdata_par;
+ wire [5:0] o_tvalid_par, i_tready_par;
+
+ reg i_tvalid, i_tready, o_tvalid, o_tready;
+ reg [63:0] i_tdata, o_tdata;
+
+ localparam READ = 2'b01;
+ localparam WRITE = 2'b10;
+
+ task usr_regport_request;
+ input [1:0] operation;
+ input [19:0] address;
+ input [31:0] data;
+ begin
+ pcie_usr_reg_data_in <= data;
+ pcie_usr_reg_addr <= address;
+ pcie_usr_reg_wr <= operation[1];
+ pcie_usr_reg_rd <= operation[0];
+ pcie_usr_reg_len <= 2'b10;
+
+ @(posedge clk);
+ while (~pcie_usr_reg_rdy) @(posedge clk);
+
+ pcie_usr_reg_wr <= 1'b0;
+ pcie_usr_reg_rd <= 1'b0;
+ @(posedge clk);
+ end
+ endtask // usr_regport_request
+
+ task usr_regport_response;
+ begin
+ @(posedge clk);
+ while (~pcie_usr_reg_rc) @(posedge clk);
+ pcie_usr_data <= pcie_usr_reg_data_out;
+ @(posedge clk);
+ end
+ endtask // usr_regport_response
+
+ task chinch_regport_request;
+ input [1:0] operation;
+ input [19:0] address;
+ input [31:0] data;
+ begin
+ @(posedge clk);
+ while (~(chinch_reg_rdy &&
+ chinch_reg_addr == address &&
+ {chinch_reg_wr,chinch_reg_rd} == operation &&
+ chinch_reg_len == 2'b10 &&
+ (operation == WRITE || chinch_reg_data_out == data)
+ )) @(posedge clk);
+
+ @(posedge clk);
+ end
+ endtask // chinch_regport_request
+
+ task chinch_regport_response;
+ input [31:0] data;
+ begin
+ @(posedge clk);
+ chinch_reg_data_in <= data;
+ chinch_reg_rc <= 1'b1;
+ @(posedge clk);
+ chinch_reg_rc <= 1'b0;
+ end
+ endtask // chinch_regport_response
+
+ task send_packet;
+ input [63:0] sid;
+ input [31:0] len;
+ input [31:0] quant;
+ begin
+ if(quant < 2) begin
+ i_tdata <= { sid[63:32],len[15:0], sid[15:0] };
+ i_tvalid <= 1;
+ @(posedge clk);
+ i_tvalid <= 0;
+ @(posedge clk);
+ end else begin
+ i_tdata <= { sid[63:32],len[15:0], sid[15:0] };
+ i_tvalid <= 1;
+ @(posedge clk);
+ i_tdata <= 64'h0000_0001_0000_0000;
+ repeat(quant - 2) begin
+ i_tdata <= i_tdata + 64'h0000_0002_0000_0002;
+ @(posedge clk);
+ end
+ i_tdata <= i_tdata + 64'h0000_0002_0000_0002;
+ @(posedge clk);
+ i_tvalid <= 1'b0;
+ @(posedge clk);
+ end // else: !if(len < 3)
+ end
+ endtask // send_packet
+
+ task reset_dma_counts;
+ begin
+ dma_sample_cnt <= 32'd0;
+ dma_packet_cnt <= 32'd0;
+ dma_out_sample_cnt[0] <= 32'd0;
+ dma_out_sample_cnt[1] <= 32'd0;
+ dma_out_sample_cnt[2] <= 32'd0;
+ dma_out_sample_cnt[3] <= 32'd0;
+ dma_out_sample_cnt[4] <= 32'd0;
+ dma_out_sample_cnt[5] <= 32'd0;
+ dma_out_last_sample[0] <= 64'd0;
+ dma_out_last_sample[1] <= 64'd0;
+ dma_out_last_sample[2] <= 64'd0;
+ dma_out_last_sample[3] <= 64'd0;
+ dma_out_last_sample[4] <= 64'd0;
+ dma_out_last_sample[5] <= 64'd0;
+ @(posedge clk);
+ end
+ endtask // reset_dma_counts
+
+ task select_channels;
+ input [2:0] tx_ch;
+ input [2:0] rx_ch;
+ begin
+ i_chan <= tx_ch;
+ o_chan <= rx_ch;
+ @(posedge clk);
+ end
+ endtask // select_channels
+
+ task wait_for_pkt_loopback;
+ begin
+ while (i_tvalid & i_tready) @(posedge clk); //Wait for outbound pkt to pad and send
+ while (~o_tvalid) @(posedge clk); //Wait for inbound pkt to arrive
+ while (o_tvalid & o_tready) @(posedge clk); //Wait for inbound pkt to finish
+ end
+ endtask // wait_for_pkt_loopback
+
+ wire [63:0] dma_loop_tdata ;
+ wire [ 2:0] dma_loop_tuser ;
+ wire dma_loop_tvalid, dma_loop_tlast, dma_loop_tready;
+
+ wire [63:0] iop2_msg_tdata ;
+ wire iop2_msg_tvalid, iop2_msg_tlast, iop2_msg_tready;
+
+
+ initial begin : tb_main
+ while (reset) @(posedge clk);
+
+ chinch_reg_rdy <= 1'b1;
+ chinch_reg_rc <= 1'b0;
+
+ `TEST_CASE_START("Verify signature register");
+ usr_regport_request(READ, 20'h40000, 32'h0);
+ usr_regport_response();
+ `TEST_CASE_DONE((pcie_usr_data == "X300"))
+
+ `TEST_CASE_START("Verify counter frequency register");
+ usr_regport_request(READ, 20'h4000C, 32'h0);
+ usr_regport_response();
+ `TEST_CASE_DONE((pcie_usr_data == 166666667));
+
+ `TEST_CASE_START("Verify scratch registers");
+ usr_regport_request(WRITE, 20'h40010, 32'hDEAD);
+ usr_regport_request(WRITE, 20'h40014, 32'hBEEF);
+ usr_regport_request(READ, 20'h40014, 32'h0);
+ usr_regport_response();
+ temp_pass <= (pcie_usr_data == 32'hBEEF);
+ usr_regport_request(READ, 20'h40010, 32'h0);
+ usr_regport_response();
+ `TEST_CASE_DONE((pcie_usr_data == 32'hDEAD) & temp_pass);
+
+ `TEST_CASE_START("Client register port write 1");
+ usr_regport_request(WRITE, 20'h60000, 32'h12345678);
+ chinch_regport_request(WRITE, 20'h60000, 32'h12345678);
+
+ usr_regport_request(WRITE, 20'h7FFFC, 32'h1357);
+ chinch_regport_request(WRITE, 20'h7FFFC, 32'h1357);
+
+ usr_regport_request(WRITE, 20'h70000, 32'h2468);
+ chinch_regport_request(WRITE, 20'h70000, 32'h2468);
+ `TEST_CASE_DONE(1);
+
+ `TEST_CASE_START("Client register port read 1");
+ usr_regport_request(READ, 20'h60000, 32'h0);
+ chinch_regport_request(READ, 20'h60000, 32'h0);
+ chinch_regport_response(32'hACE0BA51);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 32'hACE0BA51),"");
+
+ usr_regport_request(READ, 20'h7FFFC, 32'h0);
+ chinch_regport_request(READ, 20'h7FFFC, 32'h0);
+ chinch_regport_response(32'hACE0BA52);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 32'hACE0BA52),"");
+
+ usr_regport_request(READ, 20'h70000, 32'h0);
+ chinch_regport_request(READ, 20'h70000, 32'h0);
+ chinch_regport_response(32'hACE0BA53);
+ usr_regport_response();
+ `TEST_CASE_DONE((pcie_usr_data == 32'hACE0BA53));
+
+ `TEST_CASE_START("Configure RX DMA routing table");
+ usr_regport_request(WRITE, 20'h40500, 32'h0000_0000);
+ usr_regport_request(WRITE, 20'h40500, 32'h0001_0001);
+ usr_regport_request(WRITE, 20'h40500, 32'h0002_0002);
+ usr_regport_request(WRITE, 20'h40500, 32'h0003_0003);
+ usr_regport_request(WRITE, 20'h40500, 32'h00D3_0000);
+ usr_regport_request(WRITE, 20'h40500, 32'h00D2_0001);
+ usr_regport_request(WRITE, 20'h40500, 32'h00D1_0002);
+ usr_regport_request(WRITE, 20'h40500, 32'h00D0_0003);
+ `TEST_CASE_DONE(1);
+
+ `TEST_CASE_START("Frame size register read");
+ usr_regport_request(READ, 20'h40204, 32'h0);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 32), "Frame size register read (Default) [TX0].");
+ usr_regport_request(READ, 20'h40214, 32'h0);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 32), "Frame size register read (Default) [TX1].");
+ usr_regport_request(READ, 20'h40404, 32'h0);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 32), "Frame size register read (Default) [RX0].");
+ usr_regport_request(READ, 20'h40414, 32'h0);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 32), "Frame size register read (Default) [RX1].");
+ `TEST_CASE_DONE(1);
+
+ o_tready <= 1'b1;
+
+ `TEST_CASE_START("Loopback packet");
+ reset_dma_counts();
+ usr_regport_request(WRITE, 20'h40200, 32'h0000_0012);
+ usr_regport_request(WRITE, 20'h40400, 32'h0000_0012);
+ select_channels(0,0);
+ send_packet(16'h00D2, 80, 32);
+ wait_for_pkt_loopback();
+ `TEST_CASE_DONE((dma_sample_cnt==10 && dma_packet_cnt==1 && dma_out_sample_cnt[0]==32));
+
+ reset_dma_counts();
+ select_channels(1,0);
+ send_packet(16'h00D3, 80, 32);
+ wait_for_pkt_loopback();
+ `TEST_CASE_DONE(dma_sample_cnt==10 && dma_packet_cnt==1 && dma_out_sample_cnt[0]==32);
+
+ `TEST_CASE_START("Frame size register write.");
+ usr_regport_request(WRITE, 20'h40224, 32'd16);
+ usr_regport_request(WRITE, 20'h40234, 32'd16);
+ usr_regport_request(WRITE, 20'h40424, 32'd16);
+ usr_regport_request(WRITE, 20'h40434, 32'd16);
+ `TEST_CASE_DONE(1);
+
+ `TEST_CASE_START("Frame size register read");
+ usr_regport_request(READ, 20'h40224, 32'h0);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 16), "Frame size register read [TX2].");
+ usr_regport_request(READ, 20'h40234, 32'h0);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 16), "Frame size register read [TX3].");
+ usr_regport_request(READ, 20'h40424, 32'h0);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 16), "Frame size register read [RX2].");
+ usr_regport_request(READ, 20'h40434, 32'h0);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 16), "Frame size register read [RX3].");
+ `TEST_CASE_DONE(1);
+
+ `TEST_CASE_START("Loopback packet");
+ reset_dma_counts();
+ select_channels(2,2);
+ send_packet(16'h0002, 32, 16);
+ wait_for_pkt_loopback();
+ `TEST_CASE_DONE(dma_sample_cnt==4 && dma_packet_cnt==1 && dma_out_sample_cnt[2]==16);
+
+ reset_dma_counts();
+ select_channels(3,3);
+ send_packet(16'h0003, 32, 16);
+ wait_for_pkt_loopback();
+ `TEST_CASE_DONE((dma_sample_cnt==4 && dma_packet_cnt==1 && dma_out_sample_cnt[3]==16));
+
+ `TEST_CASE_START("Loopback multiple packets");
+ reset_dma_counts();
+ select_channels(3,2);
+ send_packet(16'h0002, 128, 16);
+ send_packet(16'h0002, 128, 16);
+ send_packet(16'h0002, 128, 16);
+ send_packet(16'h0002, 128, 16);
+ wait_for_pkt_loopback();
+ repeat(64) @(posedge clk);
+ `TEST_CASE_DONE(dma_sample_cnt==64 && dma_packet_cnt==4 && dma_out_sample_cnt[2]==64 && o_tdata==64'h0000009e00000020);
+
+ `TEST_CASE_START("Loopback multiple packets (RX Swapped)");
+ reset_dma_counts();
+ select_channels(3,2);
+
+ usr_regport_request(WRITE, 20'h40230, 32'h10);
+ usr_regport_request(WRITE, 20'h40420, 32'h00);
+ repeat(16) @(posedge clk);
+
+ send_packet(16'h0002, 128, 16);
+ send_packet(16'h0002, 128, 16);
+ wait_for_pkt_loopback();
+ repeat(64) @(posedge clk);
+ `TEST_CASE_DONE(dma_sample_cnt==32 && dma_packet_cnt==2 && dma_out_sample_cnt[2]==32 && o_tdata==64'h000000200000009e);
+
+ /* @TODO: Need to implement data swapping in TB
+ `TEST_CASE_START();
+ reset_dma_counts();
+ select_channels(3,2);
+
+ usr_regport_request(WRITE, 20'h40230, 32'h00);
+ usr_regport_request(WRITE, 20'h40420, 32'h10);
+ repeat(16) @(posedge clk);
+
+ send_packet(16'h0002, 128, 16);
+ send_packet(16'h0002, 128, 16);
+ wait_for_pkt_loopback();
+ repeat(64) @(posedge clk);
+ `TEST_CASE_DONE(dma_sample_cnt==32 && dma_packet_cnt==2 && dma_out_sample_cnt[2]==32 && o_tdata[7:0]==32,
+ "Loopback multiple packets (TX Swapped).");
+ */
+
+ `TEST_CASE_START("Good DMA status.");
+ reset_dma_counts();
+ select_channels(3,2);
+ usr_regport_request(READ, 20'h40230, 32'h0);
+ usr_regport_response();
+ temp_pass <= (pcie_usr_data == 32'h0);
+ usr_regport_request(READ, 20'h40420, 32'h0);
+ usr_regport_response();
+ `TEST_CASE_DONE(temp_pass && (pcie_usr_data == 32'h0));
+
+ `TEST_CASE_START("Bad DMA status.");
+ send_packet(16'h0002, 160, 20);
+ repeat(64) @(posedge clk);
+ usr_regport_request(READ, 20'h40230, 32'h0);
+ usr_regport_response();
+ temp_pass <= (pcie_usr_data == 32'h1);
+ usr_regport_request(READ, 20'h40420, 32'h0);
+ usr_regport_response();
+ `TEST_CASE_DONE(temp_pass || (pcie_usr_data == 32'h1));
+
+ `TEST_CASE_START("DMA Status reset.");
+ usr_regport_request(WRITE, 20'h40230, 32'h1);
+ usr_regport_request(READ, 20'h40230, 32'h0);
+ usr_regport_response();
+ temp_pass <= (pcie_usr_data == 32'h0);
+ usr_regport_request(WRITE, 20'h40420, 32'h1);
+ usr_regport_request(READ, 20'h40420, 32'h0);
+ usr_regport_response();
+ `TEST_CASE_DONE(temp_pass && (pcie_usr_data == 32'h0));
+
+ `TEST_CASE_START("Packet count register reset");
+ select_channels(2,1);
+ reset_dma_counts();
+ usr_regport_request(WRITE, 20'h4022C, 32'h0);
+ usr_regport_request(READ, 20'h4022C, 32'h0);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 0), "TX Packet count register reset.");
+ usr_regport_request(WRITE, 20'h4041C, 32'h0);
+ usr_regport_request(READ, 20'h4041C, 32'h0);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 0), "RX Packet count register reset.");
+ `TEST_CASE_DONE(1);
+
+ `TEST_CASE_START("TX Packet count register read");
+ send_packet(16'h0001, 80, 16);
+ send_packet(16'h0001, 24, 16);
+ send_packet(16'h0001, 48, 16);
+ repeat(64) @(posedge clk);
+ usr_regport_request(READ, 20'h4022C, 32'h0);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 3), "TX Packet count register read.");
+ usr_regport_request(READ, 20'h4041C, 32'h0);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 3), "RX Packet count register read.");
+ `TEST_CASE_DONE(1);
+
+ `TEST_CASE_START("TX Sample count register reset");
+ select_channels(1,2);
+ reset_dma_counts();
+ usr_regport_request(WRITE, 20'h40218, 32'h0);
+ usr_regport_request(READ, 20'h40218, 32'h0);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 0), "TX Sample count register reset.");
+ usr_regport_request(WRITE, 20'h40428, 32'h0);
+ usr_regport_request(READ, 20'h40428, 32'h0);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 0), "RX Sample count register reset.");
+ `TEST_CASE_DONE(1'b1);
+
+ `TEST_CASE_START("TX Sample count register read");
+ send_packet(16'h0002, 28, 16);
+ wait_for_pkt_loopback();
+ usr_regport_request(READ, 20'h40218, 32'h0);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 4), "TX Sample count register read.");
+ usr_regport_request(READ, 20'h40428, 32'h0);
+ usr_regport_response();
+ `ASSERT_ERROR((pcie_usr_data == 4), "RX Sample count register read.");
+ `TEST_CASE_DONE(1'b1);
+
+ `TEST_CASE_START("Setup for NxN DMA test");
+ for (it = 0; it < 16'd6; it = it + 16'd1) begin
+ usr_regport_request(WRITE, 20'h40204 + (it * 16), 32'h4);
+ usr_regport_request(WRITE, 20'h40404 + (it * 16), 32'h4);
+ usr_regport_request(WRITE, 20'h40500, {it, it});
+ end
+ `TEST_CASE_DONE(1'b1);
+
+ `TEST_CASE_START("Setup for NxN DMA test");
+ for (tx_ch = 0; tx_ch < 6; tx_ch = tx_ch + 16'd2) begin
+ for (rx_ch = 1; rx_ch < 6; rx_ch = rx_ch + 16'd1) begin
+ select_channels(tx_ch,rx_ch);
+ reset_dma_counts();
+ @(posedge clk);
+ send_packet(rx_ch, 16, 4);
+ wait_for_pkt_loopback();
+ if (dma_sample_cnt==2 && dma_packet_cnt==1 && dma_out_sample_cnt[rx_ch]==4) begin
+ $display("[TEST%d]: NxN DMA Test [TX=%d, RX=%d]...Passed",tc_run_count,tx_ch[3:0],rx_ch[3:0]);
+ end else begin
+ $display("[TEST%d]: NxN DMA Test [TX=%d, RX=%d]...FAILED!!!",tc_run_count,tx_ch[3:0],rx_ch[3:0]);
+ end
+ @(posedge clk);
+ end
+ end
+ `TEST_CASE_DONE(1'b1);
+ end // initial begin
+
+
+ x300_pcie_int #(
+ .DMA_STREAM_WIDTH (64),
+ .NUM_TX_STREAMS (6 ),
+ .NUM_RX_STREAMS (6 ),
+ .REGPORT_ADDR_WIDTH(20),
+ .REGPORT_DATA_WIDTH(32),
+ .IOP2_MSG_WIDTH (64)
+ ) x300_pcie_int (
+ .ioport2_clk (clk ),
+ .bus_clk (clk ),
+ .bus_rst (reset ),
+
+ //DMA TX FIFOs (IoPort2 Clock Domain)
+ .dmatx_tdata_iop2 (i_tdata_par ),
+ .dmatx_tvalid_iop2 (i_tvalid_par ),
+ .dmatx_tready_iop2 (i_tready_par ),
+
+ //DMA TX FIFOs (IoPort2 Clock Domain)
+ .dmarx_tdata_iop2 (o_tdata_par ),
+ .dmarx_tvalid_iop2 (o_tvalid_par ),
+ .dmarx_tready_iop2 (o_tready_par ),
+
+ //PCIe User Regport
+ .pcie_usr_reg_wr (pcie_usr_reg_wr ),
+ .pcie_usr_reg_rd (pcie_usr_reg_rd ),
+ .pcie_usr_reg_addr (pcie_usr_reg_addr ),
+ .pcie_usr_reg_data_in (pcie_usr_reg_data_in ),
+ .pcie_usr_reg_len (pcie_usr_reg_len ),
+ .pcie_usr_reg_data_out(pcie_usr_reg_data_out),
+ .pcie_usr_reg_rc (pcie_usr_reg_rc ),
+ .pcie_usr_reg_rdy (pcie_usr_reg_rdy ),
+
+ //Chinch Regport
+ .chinch_reg_wr (chinch_reg_wr ),
+ .chinch_reg_rd (chinch_reg_rd ),
+ .chinch_reg_addr (chinch_reg_addr ),
+ .chinch_reg_data_out (chinch_reg_data_out ),
+ .chinch_reg_len (chinch_reg_len ),
+ .chinch_reg_data_in (chinch_reg_data_in ),
+ .chinch_reg_rc (chinch_reg_rc ),
+ .chinch_reg_rdy (chinch_reg_rdy ),
+
+ //DMA TX FIFO (Bus Clock Domain)
+ .dmatx_tdata (dma_loop_tdata ),
+ .dmatx_tuser (dma_loop_tuser ),
+ .dmatx_tlast (dma_loop_tlast ),
+ .dmatx_tvalid (dma_loop_tvalid ),
+ .dmatx_tready (dma_loop_tready ),
+
+ //DMA RX FIFO (Bus Clock Domain)
+ .dmarx_tdata (dma_loop_tdata ),
+ .dmarx_tuser (dma_loop_tuser ),
+ .dmarx_tlast (dma_loop_tlast ),
+ .dmarx_tvalid (dma_loop_tvalid ),
+ .dmarx_tready (dma_loop_tready ),
+
+ //Message FIFO Out (Bus Clock Domain)
+ .rego_tdata (iop2_msg_tdata ),
+ .rego_tvalid (iop2_msg_tvalid ),
+ .rego_tlast (iop2_msg_tlast ),
+ .rego_tready (iop2_msg_tready ),
+
+ //Message FIFO In (Bus Clock Domain)
+ .regi_tdata (iop2_msg_tdata ),
+ .regi_tvalid (iop2_msg_tvalid ),
+ .regi_tlast (iop2_msg_tlast ),
+ .regi_tready (iop2_msg_tready ),
+
+ .debug ( )
+ );
+
+ always @(posedge clk) begin
+ if (dma_loop_tvalid & dma_loop_tready) begin
+ dma_sample_cnt <= dma_sample_cnt + 32'd1;
+ if (dma_loop_tlast) dma_packet_cnt <= dma_packet_cnt + 32'd1;
+ end
+ end
+
+ always @(posedge clk) begin
+ case (i_chan)
+ 3'd5:
+ {i_tdata_par[383:320], i_tvalid_par[5], i_tready} <= {i_tdata, i_tvalid, i_tready_par[5]};
+ 3'd4:
+ {i_tdata_par[319:256], i_tvalid_par[4], i_tready} <= {i_tdata, i_tvalid, i_tready_par[4]};
+ 3'd3:
+ {i_tdata_par[255:192], i_tvalid_par[3], i_tready} <= {i_tdata, i_tvalid, i_tready_par[3]};
+ 3'd2:
+ {i_tdata_par[191:128], i_tvalid_par[2], i_tready} <= {i_tdata, i_tvalid, i_tready_par[2]};
+ 3'd1:
+ {i_tdata_par[127:64], i_tvalid_par[1], i_tready} <= {i_tdata, i_tvalid, i_tready_par[1]};
+ default:
+ {i_tdata_par[63:0], i_tvalid_par[0], i_tready} <= {i_tdata, i_tvalid, i_tready_par[0]};
+ endcase
+ end
+
+ always @(posedge clk) begin
+ case (o_chan)
+ 3'd5:
+ {o_tdata, o_tvalid, o_tready_par[5]} <= {o_tdata_par[383:320], o_tvalid_par[5], o_tready};
+ 3'd4:
+ {o_tdata, o_tvalid, o_tready_par[4]} <= {o_tdata_par[319:256], o_tvalid_par[4], o_tready};
+ 3'd3:
+ {o_tdata, o_tvalid, o_tready_par[3]} <= {o_tdata_par[255:192], o_tvalid_par[3], o_tready};
+ 3'd2:
+ {o_tdata, o_tvalid, o_tready_par[2]} <= {o_tdata_par[191:128], o_tvalid_par[2], o_tready};
+ 3'd1:
+ {o_tdata, o_tvalid, o_tready_par[1]} <= {o_tdata_par[127:64], o_tvalid_par[1], o_tready};
+ default:
+ {o_tdata, o_tvalid, o_tready_par[0]} <= {o_tdata_par[63:0], o_tvalid_par[0], o_tready};
+ endcase
+ end
+
+ genvar i;
+ generate
+ for (i=0; i<6; i=i+1) begin: dma_counter_generator
+ always @(posedge clk) begin
+ if (o_tvalid_par[i] & o_tready_par[i]) begin
+ dma_out_sample_cnt[i] <= dma_out_sample_cnt[i] + 32'd1;
+ dma_out_last_sample[i] <= o_tdata_par[(64*i)+63:64*i];
+ end
+ end
+ end
+ endgenerate
+
+endmodule