aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/lib
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/lib')
-rw-r--r--fpga/usrp3/lib/fifo/axi_fifo_2clk.v16
-rw-r--r--fpga/usrp3/lib/rfnoc/utils/ctrlport_clk_cross.v45
2 files changed, 33 insertions, 28 deletions
diff --git a/fpga/usrp3/lib/fifo/axi_fifo_2clk.v b/fpga/usrp3/lib/fifo/axi_fifo_2clk.v
index 1f3eee924..a1af5ee8e 100644
--- a/fpga/usrp3/lib/fifo/axi_fifo_2clk.v
+++ b/fpga/usrp3/lib/fifo/axi_fifo_2clk.v
@@ -88,14 +88,14 @@ module axi_fifo_2clk #(
wire o_ext_tvalid;
wire o_ext_tready;
- // Ideally the following parameters should be technology
- // specific. For now these values have been optimized for
- // 7Series FPGAs. They also work for Spartan6 but may not
- // be optimal. For future generations, make these values
- // depend on the DEVICE parameter.
- localparam BASE_WIDTH = 72;
- localparam SRL_THRESHOLD = 5;
- localparam RAM_THRESHOLD = 9;
+ // Derive constants based on device.
+ // First triple of values is for Intel's MAX10 FPGAs. The FIFO generator for
+ // those devices supports embedded memory only (SRL_THRESHOLD = 0).
+ // The later triple has been optimized for Xilinx 7Series FPGAs. They also
+ // work for Spartan6 but may not be optimal.
+ localparam BASE_WIDTH = (DEVICE == "MAX10") ? 36 : 72;
+ localparam SRL_THRESHOLD = (DEVICE == "MAX10") ? 0 : 5;
+ localparam RAM_THRESHOLD = (DEVICE == "MAX10") ? 8 : 9;
// How many parallel FIFOs to instantiate to fit WIDTH
localparam NUM_FIFOS = ((WIDTH-1)/BASE_WIDTH)+1;
diff --git a/fpga/usrp3/lib/rfnoc/utils/ctrlport_clk_cross.v b/fpga/usrp3/lib/rfnoc/utils/ctrlport_clk_cross.v
index 6aa74c74f..6cd45b86b 100644
--- a/fpga/usrp3/lib/rfnoc/utils/ctrlport_clk_cross.v
+++ b/fpga/usrp3/lib/rfnoc/utils/ctrlport_clk_cross.v
@@ -11,8 +11,9 @@
//
-module ctrlport_clk_cross (
-
+module ctrlport_clk_cross #(
+ parameter DEVICE = "7SERIES" // FPGA technology identifier (for optimal FIFO inference)
+)(
input wire rst, // Can be either clock domain, but must be glitch-free
//---------------------------------------------------------------------------
@@ -58,7 +59,7 @@ module ctrlport_clk_cross (
// Slave to Master Clock Crossing (Request)
//---------------------------------------------------------------------------
- localparam REQ_W =
+ localparam REQ_W =
1 + // ctrlport_req_wr
1 + // ctrlport_req_rd
20 + // ctrlport_req_addr
@@ -76,22 +77,25 @@ module ctrlport_clk_cross (
wire m_ctrlport_req_wr_tmp;
wire m_ctrlport_req_rd_tmp;
+ // Sort by descreasing order of usage possibility.
+ // This way instance, which do not need port IDs, time etc. can save the MSBs.
assign s_req_flat = {
- s_ctrlport_req_wr,
- s_ctrlport_req_rd,
- s_ctrlport_req_addr,
s_ctrlport_req_portid,
s_ctrlport_req_rem_epid,
s_ctrlport_req_rem_portid,
- s_ctrlport_req_data,
- s_ctrlport_req_byte_en,
s_ctrlport_req_has_time,
- s_ctrlport_req_time
+ s_ctrlport_req_time,
+ s_ctrlport_req_byte_en,
+ s_ctrlport_req_data,
+ s_ctrlport_req_addr,
+ s_ctrlport_req_wr,
+ s_ctrlport_req_rd
};
axi_fifo_2clk #(
- .WIDTH (REQ_W),
- .SIZE (3)
+ .WIDTH (REQ_W),
+ .SIZE (3),
+ .DEVICE (DEVICE)
) req_fifo (
.reset (rst),
.i_aclk (s_ctrlport_clk),
@@ -105,16 +109,16 @@ module ctrlport_clk_cross (
);
assign {
- m_ctrlport_req_wr_tmp,
- m_ctrlport_req_rd_tmp,
- m_ctrlport_req_addr,
m_ctrlport_req_portid,
m_ctrlport_req_rem_epid,
m_ctrlport_req_rem_portid,
- m_ctrlport_req_data,
- m_ctrlport_req_byte_en,
m_ctrlport_req_has_time,
- m_ctrlport_req_time
+ m_ctrlport_req_time,
+ m_ctrlport_req_byte_en,
+ m_ctrlport_req_data,
+ m_ctrlport_req_addr,
+ m_ctrlport_req_wr_tmp,
+ m_ctrlport_req_rd_tmp
} = m_req_flat;
assign m_ctrlport_req_wr = m_ctrlport_req_wr_tmp & m_req_flat_valid;
@@ -125,7 +129,7 @@ module ctrlport_clk_cross (
// Master to Slave Clock Crossing (Response)
//---------------------------------------------------------------------------
- localparam RESP_W =
+ localparam RESP_W =
1 + // ctrlport_resp_ack,
2 + // ctrlport_resp_status,
32; // ctrlport_resp_data
@@ -142,8 +146,9 @@ module ctrlport_clk_cross (
};
axi_fifo_2clk #(
- .WIDTH (RESP_W),
- .SIZE (3)
+ .WIDTH (RESP_W),
+ .SIZE (3),
+ .DEVICE (DEVICE)
) resp_fifo (
.reset (rst),
.i_aclk (m_ctrlport_clk),