|
1 | 1 | /*
|
2 | 2 |
|
3 |
| -Copyright (c) 2021 Alex Forencich |
| 3 | +Copyright (c) 2021-2023 Alex Forencich |
4 | 4 |
|
5 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy
|
6 | 6 | of this software and associated documentation files (the "Software"), to deal
|
@@ -87,85 +87,89 @@ module axis_pipeline_fifo #
|
87 | 87 |
|
88 | 88 | parameter FIFO_ADDR_WIDTH = LENGTH < 2 ? 3 : $clog2(LENGTH*4+1);
|
89 | 89 |
|
| 90 | +wire [DATA_WIDTH-1:0] axis_tdata_pipe[0:LENGTH]; |
| 91 | +wire [KEEP_WIDTH-1:0] axis_tkeep_pipe[0:LENGTH]; |
| 92 | +wire axis_tvalid_pipe[0:LENGTH]; |
| 93 | +wire axis_tready_pipe[0:LENGTH]; |
| 94 | +wire axis_tlast_pipe[0:LENGTH]; |
| 95 | +wire [ID_WIDTH-1:0] axis_tid_pipe[0:LENGTH]; |
| 96 | +wire [DEST_WIDTH-1:0] axis_tdest_pipe[0:LENGTH]; |
| 97 | +wire [USER_WIDTH-1:0] axis_tuser_pipe[0:LENGTH]; |
| 98 | + |
90 | 99 | generate
|
91 | 100 |
|
92 |
| -if (LENGTH > 0) begin |
| 101 | +genvar n; |
| 102 | + |
| 103 | +for (n = 0; n < LENGTH; n = n + 1) begin : stage |
93 | 104 |
|
94 |
| - // pipeline |
95 | 105 | (* shreg_extract = "no" *)
|
96 |
| - reg [DATA_WIDTH-1:0] axis_tdata_reg[0:LENGTH-1]; |
| 106 | + reg [DATA_WIDTH-1:0] axis_tdata_reg = 0; |
97 | 107 | (* shreg_extract = "no" *)
|
98 |
| - reg [KEEP_WIDTH-1:0] axis_tkeep_reg[0:LENGTH-1]; |
| 108 | + reg [KEEP_WIDTH-1:0] axis_tkeep_reg = 0; |
99 | 109 | (* shreg_extract = "no" *)
|
100 |
| - reg axis_tvalid_reg[0:LENGTH-1]; |
| 110 | + reg axis_tvalid_reg = 0; |
101 | 111 | (* shreg_extract = "no" *)
|
102 |
| - reg axis_tready_reg[0:LENGTH-1]; |
| 112 | + reg axis_tready_reg = 0; |
103 | 113 | (* shreg_extract = "no" *)
|
104 |
| - reg axis_tlast_reg[0:LENGTH-1]; |
| 114 | + reg axis_tlast_reg = 0; |
105 | 115 | (* shreg_extract = "no" *)
|
106 |
| - reg [ID_WIDTH-1:0] axis_tid_reg[0:LENGTH-1]; |
| 116 | + reg [ID_WIDTH-1:0] axis_tid_reg = 0; |
107 | 117 | (* shreg_extract = "no" *)
|
108 |
| - reg [DEST_WIDTH-1:0] axis_tdest_reg[0:LENGTH-1]; |
| 118 | + reg [DEST_WIDTH-1:0] axis_tdest_reg = 0; |
109 | 119 | (* shreg_extract = "no" *)
|
110 |
| - reg [USER_WIDTH-1:0] axis_tuser_reg[0:LENGTH-1]; |
| 120 | + reg [USER_WIDTH-1:0] axis_tuser_reg = 0; |
111 | 121 |
|
112 |
| - wire [DATA_WIDTH-1:0] m_axis_tdata_int = axis_tdata_reg[LENGTH-1]; |
113 |
| - wire [KEEP_WIDTH-1:0] m_axis_tkeep_int = axis_tkeep_reg[LENGTH-1]; |
114 |
| - wire m_axis_tvalid_int = axis_tvalid_reg[LENGTH-1]; |
115 |
| - wire m_axis_tready_int; |
116 |
| - wire m_axis_tlast_int = axis_tlast_reg[LENGTH-1]; |
117 |
| - wire [ID_WIDTH-1:0] m_axis_tid_int = axis_tid_reg[LENGTH-1]; |
118 |
| - wire [DEST_WIDTH-1:0] m_axis_tdest_int = axis_tdest_reg[LENGTH-1]; |
119 |
| - wire [USER_WIDTH-1:0] m_axis_tuser_int = axis_tuser_reg[LENGTH-1]; |
120 |
| - |
121 |
| - assign s_axis_tready = axis_tready_reg[0]; |
122 |
| - |
123 |
| - integer i; |
124 |
| - |
125 |
| - initial begin |
126 |
| - for (i = 0; i < LENGTH; i = i + 1) begin |
127 |
| - axis_tdata_reg[i] = {DATA_WIDTH{1'b0}}; |
128 |
| - axis_tkeep_reg[i] = {KEEP_WIDTH{1'b0}}; |
129 |
| - axis_tvalid_reg[i] = 1'b0; |
130 |
| - axis_tready_reg[i] = 1'b0; |
131 |
| - axis_tlast_reg[i] = 1'b0; |
132 |
| - axis_tid_reg[i] = {ID_WIDTH{1'b0}}; |
133 |
| - axis_tdest_reg[i] = {DEST_WIDTH{1'b0}}; |
134 |
| - axis_tuser_reg[i] = {USER_WIDTH{1'b0}}; |
135 |
| - end |
136 |
| - end |
| 122 | + assign axis_tdata_pipe[n+1] = axis_tdata_reg; |
| 123 | + assign axis_tkeep_pipe[n+1] = axis_tkeep_reg; |
| 124 | + assign axis_tvalid_pipe[n+1] = axis_tvalid_reg; |
| 125 | + assign axis_tlast_pipe[n+1] = axis_tlast_reg; |
| 126 | + assign axis_tid_pipe[n+1] = axis_tid_reg; |
| 127 | + assign axis_tdest_pipe[n+1] = axis_tdest_reg; |
| 128 | + assign axis_tuser_pipe[n+1] = axis_tuser_reg; |
| 129 | + |
| 130 | + assign axis_tready_pipe[n] = axis_tready_reg; |
137 | 131 |
|
138 | 132 | always @(posedge clk) begin
|
139 |
| - axis_tdata_reg[0] <= s_axis_tdata; |
140 |
| - axis_tkeep_reg[0] <= s_axis_tkeep; |
141 |
| - axis_tvalid_reg[0] <= s_axis_tvalid && s_axis_tready; |
142 |
| - axis_tlast_reg[0] <= s_axis_tlast; |
143 |
| - axis_tid_reg[0] <= s_axis_tid; |
144 |
| - axis_tdest_reg[0] <= s_axis_tdest; |
145 |
| - axis_tuser_reg[0] <= s_axis_tuser; |
146 |
| - |
147 |
| - axis_tready_reg[LENGTH-1] <= m_axis_tready_int; |
148 |
| - |
149 |
| - for (i = 0; i < LENGTH-1; i = i + 1) begin |
150 |
| - axis_tdata_reg[i+1] <= axis_tdata_reg[i]; |
151 |
| - axis_tkeep_reg[i+1] <= axis_tkeep_reg[i]; |
152 |
| - axis_tvalid_reg[i+1] <= axis_tvalid_reg[i]; |
153 |
| - axis_tlast_reg[i+1] <= axis_tlast_reg[i]; |
154 |
| - axis_tid_reg[i+1] <= axis_tid_reg[i]; |
155 |
| - axis_tdest_reg[i+1] <= axis_tdest_reg[i]; |
156 |
| - axis_tuser_reg[i+1] <= axis_tuser_reg[i]; |
157 |
| - |
158 |
| - axis_tready_reg[i] <= axis_tready_reg[i+1]; |
159 |
| - end |
| 133 | + axis_tdata_reg <= axis_tdata_pipe[n]; |
| 134 | + axis_tkeep_reg <= axis_tkeep_pipe[n]; |
| 135 | + axis_tvalid_reg <= axis_tvalid_pipe[n]; |
| 136 | + axis_tlast_reg <= axis_tlast_pipe[n]; |
| 137 | + axis_tid_reg <= axis_tid_pipe[n]; |
| 138 | + axis_tdest_reg <= axis_tdest_pipe[n]; |
| 139 | + axis_tuser_reg <= axis_tuser_pipe[n]; |
| 140 | + |
| 141 | + axis_tready_reg <= axis_tready_pipe[n+1]; |
160 | 142 |
|
161 | 143 | if (rst) begin
|
162 |
| - for (i = 0; i < LENGTH; i = i + 1) begin |
163 |
| - axis_tvalid_reg[i] <= 1'b0; |
164 |
| - axis_tready_reg[i] <= 1'b0; |
165 |
| - end |
| 144 | + axis_tvalid_reg <= 1'b0; |
| 145 | + axis_tready_reg <= 1'b0; |
166 | 146 | end
|
167 | 147 | end
|
168 | 148 |
|
| 149 | +end |
| 150 | + |
| 151 | +if (LENGTH > 0) begin : fifo |
| 152 | + |
| 153 | + assign axis_tdata_pipe[0] = s_axis_tdata; |
| 154 | + assign axis_tkeep_pipe[0] = s_axis_tkeep; |
| 155 | + assign axis_tvalid_pipe[0] = s_axis_tvalid & s_axis_tready; |
| 156 | + assign axis_tlast_pipe[0] = s_axis_tlast; |
| 157 | + assign axis_tid_pipe[0] = s_axis_tid; |
| 158 | + assign axis_tdest_pipe[0] = s_axis_tdest; |
| 159 | + assign axis_tuser_pipe[0] = s_axis_tuser; |
| 160 | + assign s_axis_tready = axis_tready_pipe[0]; |
| 161 | + |
| 162 | + wire [DATA_WIDTH-1:0] m_axis_tdata_int = axis_tdata_pipe[LENGTH]; |
| 163 | + wire [KEEP_WIDTH-1:0] m_axis_tkeep_int = axis_tkeep_pipe[LENGTH]; |
| 164 | + wire m_axis_tvalid_int = axis_tvalid_pipe[LENGTH]; |
| 165 | + wire m_axis_tready_int; |
| 166 | + wire m_axis_tlast_int = axis_tlast_pipe[LENGTH]; |
| 167 | + wire [ID_WIDTH-1:0] m_axis_tid_int = axis_tid_pipe[LENGTH]; |
| 168 | + wire [DEST_WIDTH-1:0] m_axis_tdest_int = axis_tdest_pipe[LENGTH]; |
| 169 | + wire [USER_WIDTH-1:0] m_axis_tuser_int = axis_tuser_pipe[LENGTH]; |
| 170 | + |
| 171 | + assign axis_tready_pipe[LENGTH] = m_axis_tready_int; |
| 172 | + |
169 | 173 | // output datapath logic
|
170 | 174 | reg [DATA_WIDTH-1:0] m_axis_tdata_reg = {DATA_WIDTH{1'b0}};
|
171 | 175 | reg [KEEP_WIDTH-1:0] m_axis_tkeep_reg = {KEEP_WIDTH{1'b0}};
|
|
0 commit comments