aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/lib/rfnoc/axi_pipe.v
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/lib/rfnoc/axi_pipe.v')
-rw-r--r--fpga/usrp3/lib/rfnoc/axi_pipe.v67
1 files changed, 67 insertions, 0 deletions
diff --git a/fpga/usrp3/lib/rfnoc/axi_pipe.v b/fpga/usrp3/lib/rfnoc/axi_pipe.v
new file mode 100644
index 000000000..4c635a5bf
--- /dev/null
+++ b/fpga/usrp3/lib/rfnoc/axi_pipe.v
@@ -0,0 +1,67 @@
+
+// Copyright 2014 Ettus Research
+// Copyright 2018 Ettus Research, a National Instruments Company
+//
+// SPDX-License-Identifier: LGPL-3.0-or-later
+
+
+module axi_pipe
+ #(parameter STAGES=3)
+ (input clk, input reset, input clear,
+ input i_tlast, input i_tvalid, output i_tready,
+ output o_tlast, output o_tvalid, input o_tready,
+ output [STAGES-1:0] enables,
+ output reg [STAGES-1:0] valids);
+
+ assign o_tvalid = valids[STAGES-1];
+ assign i_tready = enables[0];
+
+ // //////////////////////////////
+ // Valids
+ genvar i;
+ generate
+ for(i=1; i<STAGES; i=i+1)
+ always @(posedge clk)
+ if(reset | clear)
+ valids[i] <= 1'b0;
+ else
+ valids[i] <= valids[i-1] | (valids[i] & ~enables[i]);
+ endgenerate
+
+ always @(posedge clk)
+ if(reset | clear)
+ valids[0] <= 1'b0;
+ else
+ valids[0] <= i_tvalid | (valids[0] & ~enables[0]);
+
+ // //////////////////////////////
+ // Enables
+ genvar j;
+ generate
+ for(j=0; j<STAGES; j=j+1)
+ assign enables[j] = o_tready | (|(~valids[STAGES-1:j]));
+ endgenerate
+
+ // /////////////////////////////
+ // tlast
+ reg [STAGES-1:0] tlast;
+
+ genvar k;
+ generate
+ for(k=1; k<STAGES; k=k+1)
+ always @(posedge clk)
+ if(reset | clear)
+ tlast[k] <= 1'b0;
+ else if(enables[k])
+ tlast[k] <= tlast[k-1];
+ endgenerate
+
+ always @(posedge clk)
+ if(reset | clear)
+ tlast[0] <= 1'b0;
+ else if(enables[0])
+ tlast[0] <= i_tlast;
+
+ assign o_tlast = tlast[STAGES-1];
+
+endmodule // axi_pipe