fpga: lib: rfnoc: Add resize capability to chdr_stream_endpoint
This means that the stream endpoint's crossbar connection can be wider and therefore support a higher bandwidth than the RFNoC block to which the endpoint is connected. This improves host streaming performance. Original-commit: 6e15e8bdb668163d51ff9e4099f587fde404ec63
This commit is contained in:
@@ -15,7 +15,8 @@
|
||||
// Parameters:
|
||||
// - DEVICE_FAMILY: The FPGA device family (e.g., "7SERIES" or "ULTRASCALE")
|
||||
// - PROTOVER: RFNoC protocol version {8'd<major>, 8'd<minor>}
|
||||
// - CHDR_W: Width of the CHDR bus in bits
|
||||
// - CHDR_W: Width of the CHDR bus in bits on the crossbar side (axis_chdr)
|
||||
// - BLOCK_CHDR_W: Width of the CHDR bus in bits on the block side (axis_data)
|
||||
// - INST_NUM: The instance number of this module
|
||||
// - CTRL_XBAR_PORT: The port index on the control crossbar that
|
||||
// this module's control path will connect to
|
||||
@@ -25,9 +26,9 @@
|
||||
// - NUM_DATA_O: Number of AXIS data master ports
|
||||
// - INGRESS_BUFF_SIZE: Buffer size in log2 of the number of words
|
||||
// in the ingress buffer for the stream
|
||||
// - MTU: Log2 of the maximum packet size in words
|
||||
// - MTU: Log2 of the maximum packet size in CHDR_W words
|
||||
// - REPORT_STRM_ERRS: Report data stream errors upstream
|
||||
// - SIM_SPEEDUP: Set to 1 in simultion, and 0 otherwise
|
||||
// - SIM_SPEEDUP: Set to 1 in simulation, and 0 otherwise
|
||||
//
|
||||
// Signals:
|
||||
// - device_id : The ID of the device that has instantiated this module
|
||||
@@ -37,20 +38,24 @@
|
||||
// - strm_*_err_stb: The stream encountered an error
|
||||
// - signal_*_err : Notify upstream that we encountered an error
|
||||
|
||||
`default_nettype none
|
||||
|
||||
|
||||
module chdr_stream_endpoint #(
|
||||
parameter DEVICE_FAMILY = "7SERIES",
|
||||
parameter [15:0] PROTOVER = {8'd1, 8'd0},
|
||||
parameter CHDR_W = 64,
|
||||
parameter [9:0] INST_NUM = 0,
|
||||
parameter [9:0] CTRL_XBAR_PORT = 0,
|
||||
parameter [0:0] AXIS_CTRL_EN = 1,
|
||||
parameter [0:0] AXIS_DATA_EN = 1,
|
||||
parameter [5:0] NUM_DATA_I = 1,
|
||||
parameter [5:0] NUM_DATA_O = 1,
|
||||
parameter [5:0] INGRESS_BUFF_SIZE = 12,
|
||||
parameter [5:0] MTU = 10,
|
||||
parameter [0:0] REPORT_STRM_ERRS = 1,
|
||||
parameter [0:0] SIM_SPEEDUP = 0
|
||||
parameter BLOCK_CHDR_W = CHDR_W,
|
||||
parameter [ 9:0] INST_NUM = 0,
|
||||
parameter [ 9:0] CTRL_XBAR_PORT = 0,
|
||||
parameter [ 0:0] AXIS_CTRL_EN = 1,
|
||||
parameter [ 0:0] AXIS_DATA_EN = 1,
|
||||
parameter [ 5:0] NUM_DATA_I = 1,
|
||||
parameter [ 5:0] NUM_DATA_O = 1,
|
||||
parameter [ 5:0] INGRESS_BUFF_SIZE = 12,
|
||||
parameter [ 5:0] MTU = 10,
|
||||
parameter [ 0:0] REPORT_STRM_ERRS = 1,
|
||||
parameter [ 0:0] SIM_SPEEDUP = 0
|
||||
)(
|
||||
// Clock, reset and settings
|
||||
input wire rfnoc_chdr_clk,
|
||||
@@ -58,38 +63,36 @@ module chdr_stream_endpoint #(
|
||||
input wire rfnoc_ctrl_clk,
|
||||
input wire rfnoc_ctrl_rst,
|
||||
// Device info
|
||||
input wire [15:0] device_id,
|
||||
// CHDR in (AXI-Stream)
|
||||
input wire [CHDR_W-1:0] s_axis_chdr_tdata,
|
||||
input wire [ 15:0] device_id,
|
||||
// Full CHDR bus (AXI-Stream crossbar connections)
|
||||
input wire [ CHDR_W-1:0] s_axis_chdr_tdata,
|
||||
input wire s_axis_chdr_tlast,
|
||||
input wire s_axis_chdr_tvalid,
|
||||
output wire s_axis_chdr_tready,
|
||||
// CHDR out (AXI-Stream)
|
||||
output wire [CHDR_W-1:0] m_axis_chdr_tdata,
|
||||
output wire [ CHDR_W-1:0] m_axis_chdr_tdata,
|
||||
output wire m_axis_chdr_tlast,
|
||||
output wire m_axis_chdr_tvalid,
|
||||
input wire m_axis_chdr_tready,
|
||||
// Flow controlled data in (AXI-Stream)
|
||||
input wire [(CHDR_W*NUM_DATA_I)-1:0] s_axis_data_tdata,
|
||||
input wire [NUM_DATA_I-1:0] s_axis_data_tlast,
|
||||
input wire [NUM_DATA_I-1:0] s_axis_data_tvalid,
|
||||
output wire [NUM_DATA_I-1:0] s_axis_data_tready,
|
||||
// Flow controlled data out (AXI-Stream)
|
||||
output wire [(CHDR_W*NUM_DATA_O)-1:0] m_axis_data_tdata,
|
||||
output wire [NUM_DATA_O-1:0] m_axis_data_tlast,
|
||||
output wire [NUM_DATA_O-1:0] m_axis_data_tvalid,
|
||||
input wire [NUM_DATA_O-1:0] m_axis_data_tready,
|
||||
// Data-only CHDR buses (AXI-Stream RFNoC block connections)
|
||||
input wire [BLOCK_CHDR_W*NUM_DATA_I-1:0] s_axis_data_tdata,
|
||||
input wire [ NUM_DATA_I-1:0] s_axis_data_tlast,
|
||||
input wire [ NUM_DATA_I-1:0] s_axis_data_tvalid,
|
||||
output wire [ NUM_DATA_I-1:0] s_axis_data_tready,
|
||||
output wire [BLOCK_CHDR_W*NUM_DATA_O-1:0] m_axis_data_tdata,
|
||||
output wire [ NUM_DATA_O-1:0] m_axis_data_tlast,
|
||||
output wire [ NUM_DATA_O-1:0] m_axis_data_tvalid,
|
||||
input wire [ NUM_DATA_O-1:0] m_axis_data_tready,
|
||||
// Control in (AXI-Stream)
|
||||
input wire [31:0] s_axis_ctrl_tdata,
|
||||
input wire [ 31:0] s_axis_ctrl_tdata,
|
||||
input wire s_axis_ctrl_tlast,
|
||||
input wire s_axis_ctrl_tvalid,
|
||||
output wire s_axis_ctrl_tready,
|
||||
// Control out (AXI-Stream)
|
||||
output wire [31:0] m_axis_ctrl_tdata,
|
||||
output wire [ 31:0] m_axis_ctrl_tdata,
|
||||
output wire m_axis_ctrl_tlast,
|
||||
output wire m_axis_ctrl_tvalid,
|
||||
input wire m_axis_ctrl_tready,
|
||||
// Stream status specfic
|
||||
// Stream status specific
|
||||
output wire strm_seq_err_stb,
|
||||
output wire strm_data_err_stb,
|
||||
output wire strm_route_err_stb,
|
||||
@@ -372,10 +375,20 @@ module chdr_stream_endpoint #(
|
||||
end
|
||||
|
||||
// ---------------------------------------------------
|
||||
// Data and Flow Control Path
|
||||
// Data Path
|
||||
// ---------------------------------------------------
|
||||
|
||||
wire [CHDR_W*NUM_DATA_I-1:0] rs_i_data_tdata;
|
||||
wire [ NUM_DATA_I-1:0] rs_i_data_tlast;
|
||||
wire [ NUM_DATA_I-1:0] rs_i_data_tvalid;
|
||||
wire [ NUM_DATA_I-1:0] rs_i_data_tready;
|
||||
wire [CHDR_W*NUM_DATA_O-1:0] rs_o_data_tdata;
|
||||
wire [ NUM_DATA_O-1:0] rs_o_data_tlast;
|
||||
wire [ NUM_DATA_O-1:0] rs_o_data_tvalid;
|
||||
wire [ NUM_DATA_O-1:0] rs_o_data_tready;
|
||||
|
||||
genvar i;
|
||||
generate if (AXIS_DATA_EN) begin: datapath
|
||||
generate if (AXIS_DATA_EN) begin: gen_data_path
|
||||
localparam INPUT_FLUSH_TIMEOUT_W = SIM_SPEEDUP ? 6 : 14;
|
||||
|
||||
// Data => CHDR
|
||||
@@ -390,25 +403,25 @@ module chdr_stream_endpoint #(
|
||||
if (NUM_DATA_I == 6'd1) begin
|
||||
axi_fifo #(.WIDTH(CHDR_W+1), .SIZE(1)) axis_s_reg_i (
|
||||
.clk(rfnoc_chdr_clk), .reset(rfnoc_chdr_rst | reg_ostrm_reset), .clear(1'b0),
|
||||
.i_tdata({s_axis_data_tlast, s_axis_data_tdata}),
|
||||
.i_tvalid(s_axis_data_tvalid), .i_tready(s_axis_data_tready),
|
||||
.i_tdata({rs_i_data_tlast, rs_i_data_tdata}),
|
||||
.i_tvalid(rs_i_data_tvalid), .i_tready(rs_i_data_tready),
|
||||
.o_tdata({axis_di_tlast, axis_di_tdata_pre}),
|
||||
.o_tvalid(axis_di_tvalid), .o_tready(axis_di_tready),
|
||||
.space(), .occupied()
|
||||
);
|
||||
assign axis_di_tdest = 6'd0;
|
||||
end else begin
|
||||
wire [((CHDR_W+6)*NUM_DATA_I)-1:0] s_axis_data_tdata_tmp;
|
||||
wire [((CHDR_W+6)*NUM_DATA_I)-1:0] rs_i_data_tdata_tmp;
|
||||
for (i = 0; i < NUM_DATA_I; i=i+1) begin
|
||||
assign s_axis_data_tdata_tmp[(i*(CHDR_W+6))+:(CHDR_W+6)] = {i[5:0], s_axis_data_tdata[(i*CHDR_W)+:CHDR_W]};
|
||||
assign rs_i_data_tdata_tmp[(i*(CHDR_W+6))+:(CHDR_W+6)] = {i[5:0], rs_i_data_tdata[(i*CHDR_W)+:CHDR_W]};
|
||||
end
|
||||
|
||||
axi_mux #(
|
||||
.WIDTH(CHDR_W+6), .SIZE(NUM_DATA_I), .PRIO(0), .PRE_FIFO_SIZE(1), .POST_FIFO_SIZE(1)
|
||||
) axis_s_mux_i (
|
||||
.clk(rfnoc_chdr_clk), .reset(rfnoc_chdr_rst | reg_ostrm_reset), .clear(1'b0),
|
||||
.i_tdata(s_axis_data_tdata_tmp), .i_tlast(s_axis_data_tlast),
|
||||
.i_tvalid(s_axis_data_tvalid), .i_tready(s_axis_data_tready),
|
||||
.i_tdata(rs_i_data_tdata_tmp), .i_tlast(rs_i_data_tlast),
|
||||
.i_tvalid(rs_i_data_tvalid), .i_tready(rs_i_data_tready),
|
||||
.o_tdata({axis_di_tdest, axis_di_tdata_pre}), .o_tlast(axis_di_tlast),
|
||||
.o_tvalid(axis_di_tvalid), .o_tready(axis_di_tready)
|
||||
);
|
||||
@@ -539,8 +552,8 @@ module chdr_stream_endpoint #(
|
||||
.clk(rfnoc_chdr_clk), .reset(rfnoc_chdr_rst | reg_istrm_reset), .clear(1'b0),
|
||||
.i_tdata({axis_dos_tlast, axis_dos_tdata}),
|
||||
.i_tvalid(axis_dos_tvalid), .i_tready(axis_dos_tready),
|
||||
.o_tdata({m_axis_data_tlast, m_axis_data_tdata}),
|
||||
.o_tvalid(m_axis_data_tvalid), .o_tready(m_axis_data_tready),
|
||||
.o_tdata({rs_o_data_tlast, rs_o_data_tdata}),
|
||||
.o_tvalid(rs_o_data_tvalid), .o_tready(rs_o_data_tready),
|
||||
.space(), .occupied()
|
||||
);
|
||||
end else begin
|
||||
@@ -554,12 +567,78 @@ module chdr_stream_endpoint #(
|
||||
.dest((data_vc < NUM_DATA_O) ? data_vc[$clog2(NUM_DATA_O)-1:0] : {$clog2(NUM_DATA_O){1'b0}}),
|
||||
.i_tdata(axis_dos_tdata), .i_tlast(axis_dos_tlast),
|
||||
.i_tvalid(axis_dos_tvalid), .i_tready(axis_dos_tready),
|
||||
.o_tdata(m_axis_data_tdata), .o_tlast(m_axis_data_tlast),
|
||||
.o_tvalid(m_axis_data_tvalid), .o_tready(m_axis_data_tready)
|
||||
.o_tdata(rs_o_data_tdata), .o_tlast(rs_o_data_tlast),
|
||||
.o_tvalid(rs_o_data_tvalid), .o_tready(rs_o_data_tready)
|
||||
);
|
||||
end
|
||||
|
||||
end else begin // if (AXIS_DATA_EN)
|
||||
// -------------
|
||||
// CHDR Resize
|
||||
// -------------
|
||||
|
||||
// We put resize on the block side, rather than the crossbar side, to
|
||||
// minimize the impact on streaming performance.
|
||||
|
||||
if (CHDR_W != BLOCK_CHDR_W) begin : gen_chdr_resize
|
||||
for (i = 0; i < NUM_DATA_O; i=i+1) begin : gen_outputs
|
||||
chdr_resize #(
|
||||
.I_CHDR_W(CHDR_W ),
|
||||
.O_CHDR_W(BLOCK_CHDR_W),
|
||||
.USER_W (1 ),
|
||||
.PIPELINE("OUT" )
|
||||
) chdr_resize_out (
|
||||
.clk (rfnoc_chdr_clk ),
|
||||
.rst (rfnoc_chdr_rst ),
|
||||
.i_chdr_tdata (rs_o_data_tdata [i*CHDR_W +: CHDR_W] ),
|
||||
.i_chdr_tuser (1'b1 ),
|
||||
.i_chdr_tlast (rs_o_data_tlast [i] ),
|
||||
.i_chdr_tvalid(rs_o_data_tvalid [i] ),
|
||||
.i_chdr_tready(rs_o_data_tready [i] ),
|
||||
.o_chdr_tdata (m_axis_data_tdata [i*BLOCK_CHDR_W +: BLOCK_CHDR_W]),
|
||||
.o_chdr_tuser ( ),
|
||||
.o_chdr_tlast (m_axis_data_tlast [i] ),
|
||||
.o_chdr_tvalid(m_axis_data_tvalid[i] ),
|
||||
.o_chdr_tready(m_axis_data_tready[i] )
|
||||
);
|
||||
end
|
||||
|
||||
for (i = 0; i < NUM_DATA_I; i=i+1) begin: gen_inputs
|
||||
chdr_resize #(
|
||||
.I_CHDR_W(BLOCK_CHDR_W),
|
||||
.O_CHDR_W(CHDR_W ),
|
||||
.USER_W (1 ),
|
||||
.PIPELINE("IN" )
|
||||
) chdr_resize_in (
|
||||
.clk (rfnoc_chdr_clk ),
|
||||
.rst (rfnoc_chdr_rst ),
|
||||
.i_chdr_tdata (s_axis_data_tdata [i*BLOCK_CHDR_W +: BLOCK_CHDR_W]),
|
||||
.i_chdr_tuser (1'b1 ),
|
||||
.i_chdr_tlast (s_axis_data_tlast [i] ),
|
||||
.i_chdr_tvalid(s_axis_data_tvalid[i] ),
|
||||
.i_chdr_tready(s_axis_data_tready[i] ),
|
||||
.o_chdr_tdata (rs_i_data_tdata [i*CHDR_W +: CHDR_W] ),
|
||||
.o_chdr_tuser ( ),
|
||||
.o_chdr_tlast (rs_i_data_tlast [i] ),
|
||||
.o_chdr_tvalid(rs_i_data_tvalid [i] ),
|
||||
.o_chdr_tready(rs_i_data_tready [i] )
|
||||
);
|
||||
end
|
||||
|
||||
end else begin : gen_no_chdr_resize
|
||||
|
||||
assign m_axis_data_tdata = rs_o_data_tdata;
|
||||
assign m_axis_data_tlast = rs_o_data_tlast;
|
||||
assign m_axis_data_tvalid = rs_o_data_tvalid;
|
||||
assign rs_o_data_tready = m_axis_data_tready;
|
||||
|
||||
assign rs_i_data_tdata = s_axis_data_tdata;
|
||||
assign rs_i_data_tlast = s_axis_data_tlast;
|
||||
assign rs_i_data_tvalid = s_axis_data_tvalid;
|
||||
assign s_axis_data_tready = rs_i_data_tready;
|
||||
|
||||
end
|
||||
|
||||
end else begin : gen_no_data_path
|
||||
|
||||
assign data_i_tready = 1'b1;
|
||||
assign data_o_tdata = {CHDR_W{1'b0}};
|
||||
@@ -571,7 +650,7 @@ module chdr_stream_endpoint #(
|
||||
assign strs_o_tlast = 1'b0;
|
||||
assign strs_o_tvalid = 1'b0;
|
||||
|
||||
assign s_axis_data_tready = {NUM_DATA_I{1'b0}};
|
||||
assign s_axis_data_tready = {NUM_DATA_I{1'b1}};
|
||||
assign m_axis_data_tdata = {(CHDR_W*NUM_DATA_O){1'b0}};
|
||||
assign m_axis_data_tlast = {NUM_DATA_O{1'b0}};
|
||||
assign m_axis_data_tvalid = {NUM_DATA_O{1'b0}};
|
||||
@@ -581,7 +660,8 @@ module chdr_stream_endpoint #(
|
||||
// ---------------------------------------------------
|
||||
// Control Path
|
||||
// ---------------------------------------------------
|
||||
generate if (AXIS_CTRL_EN) begin: ctrlpath
|
||||
|
||||
generate if (AXIS_CTRL_EN) begin: gen_ctrlpath
|
||||
|
||||
// Convert from a CHDR control packet to an AXIS control packet
|
||||
chdr_to_axis_ctrl #(
|
||||
@@ -610,7 +690,7 @@ module chdr_stream_endpoint #(
|
||||
.m_rfnoc_ctrl_tready(m_axis_ctrl_tready)
|
||||
);
|
||||
|
||||
end else begin // if (AXIS_CTRL_EN)
|
||||
end else begin : gen_no_ctrl_path
|
||||
|
||||
assign ctrl_i_tready = 1'b1;
|
||||
assign ctrl_o_tdata = {CHDR_W{1'b0}};
|
||||
@@ -626,3 +706,5 @@ module chdr_stream_endpoint #(
|
||||
|
||||
endmodule // chdr_stream_endpoint
|
||||
|
||||
|
||||
`default_nettype wire
|
||||
|
||||
Reference in New Issue
Block a user