Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / niu / rtl / niu_zcp_tt.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: niu_zcp_tt.v
4// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
5// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
6//
7// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8//
9// This program is free software; you can redistribute it and/or modify
10// it under the terms of the GNU General Public License as published by
11// the Free Software Foundation; version 2 of the License.
12//
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21//
22// For the avoidance of doubt, and except that if any non-GPL license
23// choice is available it will apply instead, Sun elects to use only
24// the General Public License version 2 (GPLv2) at this time for any
25// software where a choice of GPL license versions is made
26// available with the language indicating that GPLv2 or any later version
27// may be used, or where a choice of which version of the GPL is applied is
28// otherwise unspecified.
29//
30// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
31// CA 95054 USA or visit www.sun.com if you need additional information or
32// have any questions.
33//
34// ========== Copyright Header End ============================================
35/*%W% %G%*/
36
37/***************************************************************
38 *
39 * File Name : niu_zcp_tt.v
40 * Author Name : John Lo
41 * Description :
42 * Parent Module:
43 * Child Module:
44 * Interface Mod:
45 * Date Created : 5/6/04
46 *
47 * Copyright (c) 2020, Sun Microsystems, Inc.
48 * Sun Proprietary and Confidential
49 *
50 * Modification :
51 *
52 * Synthesis Notes:
53 *
54 * Design Notes:
55 *
56 *
57 **************************************************************/
58
59`include "niu_zcp.h"
60
61module niu_zcp_tt (
62`ifdef NEPTUNE
63dmaw_threshold,
64// error handling
65va_ram_perr,
66dn_ram_perr,
67st_ram_perr,
68// tt intf
69va_dout,
70st_dout,
71dn_dout,
72tt_index_4va,
73tt_index_4dn,
74tt_index_4st,
75// req ptr intf
76credit_ok,
77zcp_tt_index_err_lv,
78tt_index,
79buf_req,
80wptr_HoQ_reg,
81cross_q_end_reg,
82cross_4KB_reg,
83ring_size_reg,
84ring_base_addr_reg,
85reach_buf_end_reg,
86total_num_buf_requested_reg,
87// wb
88wb_dn_reg,
89wb_tt0,
90wb_tt1,
91//
92tt_rd_en0,
93tt_rd_en1,
94tt_rd_en2,
95tt_rd_en3,
96tt_active,
97tt_sm_rw,
98// debug
99tcp_payld_len,
100l2_hdr_len,
101l3_hdr_len,
102header_len,
103tt_ok_reg7,
104buf_req_ok,
105// MCP debug
106TL,
107S,
108payload_len, // registered output.
109header_delta, // registered output.
110UE,
111TL_bt_UE,
112TL_eq_UE,
113qual_ulp_end_fail_reg,
114running_anchor_seq,
115first_byte_buf,
116last_byte_buf,
117index0,
118index1,
119index2,
120index3,
121win_ok,
122ulp_end_fail,
123mapped_in_fail,
124dmaw_threshold_fail,
125unmap_on_left_oc,
126last_line2,
127second_line2,
128first_line2,
129last_line3,
130second_line3,
131first_line3,
132`else // N2
133`endif
134last_line0,
135second_line0,
136first_line0,
137last_line1,
138second_line1,
139first_line1,
140clk,
141reset,
142kickoff_tt_reg,
143set_tt_program_err,
144fflp_data,
145// zcp_slv intf
146tt_en,
147fn,
148handle,
149// fflp wr intf
150ififo_ren,
151ififo_dout,
152// rx dmc stuff
153decode_default_rdc,
154decode_table_rdc,
155decode_zc_rdc,
156tt_rdc_reg,
157fflp_rdc,
158default_rdc,
159table_rdc,
160zc_rdc,
161wr_data,
162wr_en0,
163wr_en1,
164wr_en2,
165wr_en3,
166tt_state
167);
168
169 `ifdef NEPTUNE
170 input [10:0] dmaw_threshold;
171 // error handling
172 input va_ram_perr;
173 input dn_ram_perr;
174 input st_ram_perr;
175 // tt intf
176 input [1023:0] va_dout;
177 input [`ST_R] st_dout;
178 input [`DN_R] dn_dout;
179 output [11:0] tt_index_4va;
180 output [11:0] tt_index_4dn;
181 output [11:0] tt_index_4st;
182 // req ptr intf
183 input credit_ok;
184 input zcp_tt_index_err_lv;
185 output [11:0] tt_index ;
186 output buf_req ;
187 output [15:0] wptr_HoQ_reg ;
188 output cross_q_end_reg ;
189 output cross_4KB_reg ;
190 output [3:0] ring_size_reg ;
191 output [38:0] ring_base_addr_reg ;
192 output reach_buf_end_reg ;
193 output [5:0] total_num_buf_requested_reg;
194 // wb
195 output [`DN_R] wb_dn_reg;
196 output wb_tt0;
197 output wb_tt1;
198 //
199 output tt_rd_en0;
200 output tt_rd_en1;
201 output tt_rd_en2;
202 output tt_rd_en3;
203 output tt_active;
204 output tt_sm_rw;
205 // debug
206 output [15:0] tcp_payld_len;
207 output [9:0] l2_hdr_len;
208 output [9:0] l3_hdr_len;
209 output [9:0] header_len;
210 output tt_ok_reg7;
211 output buf_req_ok;
212 // MCP debug
213 output [`XPAN_TCP_SEQ_SPACE]TL;
214 output [`XPAN_TCP_SEQ_SPACE]S;
215 output [`PKT_LEN_R] payload_len; // registered output.
216 output [`PKT_LEN_R] header_delta; // registered output.
217 output [`XPAN_TCP_SEQ_SPACE]UE;
218 output TL_bt_UE;
219 output TL_eq_UE;
220 output qual_ulp_end_fail_reg;
221 output [`TCP_SEQ_SPACE] running_anchor_seq;
222 output [5:0] first_byte_buf;
223 output [20:0] last_byte_buf;
224 output [5:0] index0;
225 output [5:0] index1;
226 output [5:0] index2;
227 output [5:0] index3;
228 output win_ok;
229 output ulp_end_fail;
230 output mapped_in_fail;
231 output dmaw_threshold_fail;
232 output unmap_on_left_oc;
233 //
234 output last_line2;
235 output second_line2;
236 output first_line2;
237 output last_line3;
238 output second_line3;
239 output first_line3;
240 `else // N2
241 `endif
242 output last_line0;
243 output second_line0;
244 output first_line0;
245 output last_line1;
246 output second_line1;
247 output first_line1;
248 input clk;
249 // vlint flag_input_port_not_connected off
250 input [10:0] reset;
251 // vlint flag_input_port_not_connected on
252 output kickoff_tt_reg;
253 output set_tt_program_err ; // zcp_slv.v
254 output [`IFIFO_W_R] fflp_data;
255 // zcp_slv intf
256 input tt_en;
257 input [1:0] fn;
258 input [19:0] handle;
259 // fflp wr intf
260 // vlint flag_input_port_not_connected off
261 input [2:0] ififo_ren;
262 // vlint flag_input_port_not_connected on
263 input [`IFIFO_W_R] ififo_dout;
264 // rx dmc stuff
265 output decode_default_rdc;
266 output decode_table_rdc;
267 output decode_zc_rdc;
268 output [7:0] tt_rdc_reg;
269 output [7:0] fflp_rdc;
270 input [4:0] default_rdc;
271 input [4:0] table_rdc;
272 input [4:0] zc_rdc;
273 output [`CFIFO_W_R] wr_data;
274 output wr_en0;
275 output wr_en1;
276 output wr_en2;
277 output wr_en3;
278 output [3:0] tt_state;
279
280/*AUTOWIRE*/
281// Beginning of automatic wires (for undeclared instantiated-module outputs)
282// End of automatics
283
284// manually created by loj
285 wire [1:0] dmaw_type_reg;
286 wire [23:0] first_byte_offset_reg;
287 wire [`PKT_LEN_R] tt_dmaw_len0_reg;
288 wire [`PKT_LEN_R] tt_dmaw_len1_reg;
289 wire [`PKT_LEN_R] tt_dmaw_len2_reg;
290 wire [`PKT_LEN_R] tt_dmaw_len3_reg;
291 wire [`DMA_R] tt_dmaw_va0_reg;
292 wire [`DMA_R] tt_dmaw_va1_reg;
293 wire [`DMA_R] tt_dmaw_va2_reg;
294 wire [`DMA_R] tt_dmaw_va3_reg;
295 wire [`PKT_LEN_R] tt_hdr_len_reg;
296 wire wr_2words;
297 wire wr_4words;
298 wire zc_mode;
299 wire kickoff_tt;
300 wire [1:0] mac_port;
301 wire wr_en0;
302 wire wr_en1;
303 wire wr_en2;
304 wire wr_en3;
305 wire wr_2words0;
306 wire wr_2words1;
307 wire [`IFIFO_W_R] fflp_data;
308 wire va_ram_perr;
309 wire dn_ram_perr;
310 wire st_ram_perr;
311 wire tt_err = va_ram_perr | dn_ram_perr | st_ram_perr;
312
313 // vlint flag_dangling_net_within_module off
314 // vlint flag_net_has_no_load off
315 wire [10:0] reset;
316 wire reset9 = reset[9]; // for niu_zcp_tt_dpath
317 wire reset10= reset[10]; // for niu_zcp_tt_sm
318 wire wb_tt0;
319 wire wb_tt1;
320 wire tt_rd_en0;
321 wire tt_rd_en1;
322 wire tt_rd_en2;
323 wire tt_rd_en3;
324 wire tt_rd_en4;
325 wire tt_active;
326 wire tt_sm_rw;
327 wire [7:0] tt_rdc_reg ;
328 wire buf_req ;
329 wire [15:0] wptr_HoQ_reg ;
330 wire [15:0] HoQ_reg ;
331 wire cross_q_end_reg ;
332 wire cross_4KB_reg ;
333 wire [3:0] ring_size_reg ;
334 wire [38:0] ring_base_addr_reg ;
335 wire reach_buf_end_reg ;
336 wire [5:0] total_num_buf_requested_reg ; // total number of buffer requested
337 wire [`DN_R] wb_dn_reg ;
338 wire wr_4words0;
339 wire wr_4words1;
340 wire wr_4words2;
341 wire wr_4words3;
342 wire set_tt_program_err;
343 wire [7:0] tt_ok_reg;
344 wire tt_ok_reg6 = tt_ok_reg[6];
345 wire tt_ok_reg7 = tt_ok_reg[7];
346 wire buf_req_ok;
347 wire [`PKT_LEN_R] payload_len; // registered output.
348 wire neptune_signature;
349 wire [5:0] first_byte_buf_reg;
350 wire [31:0] ld_cal_results;
351 wire tt_fail;
352 wire [2:0] ififo_ren;
353 // vlint flag_net_has_no_load on
354 // vlint flag_dangling_net_within_module on
355
356
357/* ----------------- start of fflp load ------------------ */
358// This is the first pipeline register after ififo.
359dffre #(`IFIFO_W) fflp_data_dffre (.clk(clk),
360 .reset(reset[0]),
361 .en(ififo_ren[0]),
362 .d(ififo_dout[`IFIFO_W_R]),
363 .q(fflp_data[`IFIFO_W_R]));
364
365df1 #(1) kickoff_tt_df1 (.clk(clk),
366 .d(ififo_ren[1]),
367 .q(kickoff_tt));
368
369df1 #(1) kickoff_tt_reg_df1 (.clk(clk),
370 .d(kickoff_tt),
371 .q(kickoff_tt_reg));
372
373
374// vlint flag_dangling_net_within_module off
375// vlint flag_net_has_no_load off
376 wire [7:0] B0 = fflp_data[`BBYTE0];
377 wire [7:0] B1 = fflp_data[`BBYTE1];
378 wire [7:0] B4 = fflp_data[`BBYTE4];
379 wire [7:0] B6 = fflp_data[`BBYTE6];
380 wire [7:0] B18 = fflp_data[`BBYTE18];
381 wire [7:0] B2 = fflp_data[`BBYTE2];
382 wire [7:0] B7 = fflp_data[`BBYTE7];
383 wire [7:0] B20 = fflp_data[`BBYTE20];
384 wire [7:0] B21 = fflp_data[`BBYTE21];
385 wire [7:0] B22 = fflp_data[`BBYTE22];
386 wire [7:0] B23 = fflp_data[`BBYTE23];
387 wire [7:0] B24 = fflp_data[`BBYTE24];
388 wire [7:0] B25 = fflp_data[`BBYTE25];
389 wire [7:0] B26 = fflp_data[`BBYTE26];
390 // aliasing
391 wire vlan = B1[7]; // 4 bytes
392 wire llc_snap = B1[6]; // 8 bytes
393 wire tzfvld = B1[0];
394 wire [7:0] fflp_rdc = B2; // will be replaced by default_RDC, and table_RDC after RDC table lookup.
395 wire hzfvld = B4[3];
396 wire [11:0] tt_index ={B6[3:0],B7};
397 wire ip_ver = B18[6];
398 wire [1:0] tt_index_hi = tt_index[11:10];
399 wire [15:0] ip_pkt_len ={B20,B21}; // IPv4 pkt len or IPv6 payload len
400 wire [3:0] ip_hdr_len = B22[7:4]; // IPv4 header only
401 wire [3:0] tcp_hdr_len = B22[3:0];
402 wire [`TCP_SEQ_SPACE]tcp_seq_num ={B23,B24,B25,B26};
403// vlint flag_dangling_net_within_module on
404// vlint flag_net_has_no_load on
405
406 assign zc_mode = tzfvld | hzfvld; // un register version
407
408/* ----------------- end of fflp load -------------------- */
409
410/* ******* translation algorithm is happening here ******* */
411
412/* ----------------- post TT to cfifo -------------------- */
413
414// latch data from zero copy processing results
415// and prepare for writing to cfifo
416
417// latch the first 20 bytes from fflp for posting to rdmc
418// wire [151:0] fflp_cword;
419// vlint flag_dangling_net_within_module off
420// vlint flag_net_has_no_load off
421 wire [`IFIFO_W_R] fflp_cword;
422// vlint flag_dangling_net_within_module on
423// vlint flag_net_has_no_load on
424
425assign fflp_cword[63:0] = 0;
426zcp_xREG #(32) fflp_cword0_xREG(.clk(clk),.reset(reset[1]),.en(ld_cal_results[26]),.din(fflp_data[95:64] ),.qout(fflp_cword[95:64] ));
427zcp_xREG #(32) fflp_cword1_xREG(.clk(clk),.reset(reset[2]),.en(ld_cal_results[27]),.din(fflp_data[127:96] ),.qout(fflp_cword[127:96] ));
428zcp_xREG #(32) fflp_cword2_xREG(.clk(clk),.reset(reset[3]),.en(ld_cal_results[28]),.din(fflp_data[159:128]),.qout(fflp_cword[159:128]));
429zcp_xREG #(32) fflp_cword3_xREG(.clk(clk),.reset(reset[4]),.en(ld_cal_results[29]),.din(fflp_data[191:160]),.qout(fflp_cword[191:160]));
430zcp_xREG #(24) fflp_cword4_xREG(.clk(clk),.reset(reset[5]),.en(ld_cal_results[31]),.din(fflp_data[215:192]),.qout(fflp_cword[215:192]));
431
432/* vlint change by Shimon --- this is not used anywhere
433 wire [7:0] CC2 = fflp_cword[`BBYTE2];
434 wire [7:0] CC5 = fflp_cword[`BBYTE5];
435*/
436 // The following data will stay for 8 clocks
437 // until another ld_cal_results happens.
438 // These CC/fflp_cword data are valid at the same time
439 // as tt_ok_reg, wb_tt, wr_2words, wr_4words.
440 wire [7:0] CC0 = fflp_cword[`BBYTE0];
441 wire [7:0] CC1 = fflp_cword[`BBYTE1];
442 wire [7:0] CC3 = fflp_cword[`BBYTE3];
443 wire [7:0] CC6 = fflp_cword[`BBYTE6];
444 wire [7:0] CC7 = fflp_cword[`BBYTE7];
445 wire [7:0] CC8 = fflp_cword[`BBYTE8];
446 wire [7:0] CC9 = fflp_cword[`BBYTE9];
447 wire [7:0] CC10 = fflp_cword[`BBYTE10];
448 wire [7:0] CC11 = fflp_cword[`BBYTE11];
449 wire [7:0] CC12 = fflp_cword[`BBYTE12];
450 wire [7:0] CC13 = fflp_cword[`BBYTE13];
451 wire [7:0] CC14 = fflp_cword[`BBYTE14];
452 wire [7:0] CC15 = fflp_cword[`BBYTE15];
453 wire [7:0] CC16 = fflp_cword[`BBYTE16];
454 wire [7:0] CC17 = fflp_cword[`BBYTE17];
455 wire [7:0] CC18 = fflp_cword[`BBYTE18];
456 wire [7:0] CC19 = fflp_cword[`BBYTE19];
457 wire [7:0] CC20 = fflp_cword[`BBYTE20];
458 wire [7:0] CC21 = fflp_cword[`BBYTE21];
459 wire [7:0] CC22 = fflp_cword[`BBYTE22];
460 wire [7:0] CC23 = fflp_cword[`BBYTE23];
461 wire [7:0] CC24 = fflp_cword[`BBYTE24];
462 wire [7:0] CC25 = fflp_cword[`BBYTE25];
463 wire [7:0] CC26 = fflp_cword[`BBYTE26];
464 wire [7:0] CC27 = 8'b0; // unused field
465 wire [7:0] CC28 = 8'b0; // unused field
466 wire [7:0] CC29 = 8'b0; // unused field
467 wire [7:0] CC30 = 8'b0; // unused field
468 wire [7:0] CC31 = 8'b0; // unused field
469// vlint flag_dangling_net_within_module off
470// vlint flag_net_has_no_load off
471 wire [7:0] CC4 = fflp_cword[`BBYTE4];
472 wire [7:0] CC32 = 8'b0; // unused field
473 wire [7:0] CC40 = 8'b0; // unused field
474 wire [7:0] CC48 = 8'b0; // unused field
475 wire [7:0] CC56 = 8'b0; // unused field
476// vlint flag_dangling_net_within_module on
477// vlint flag_net_has_no_load on
478 wire [`CFIFO_W_R] full_cword0;
479 wire [`CFIFO_W_R] full_cword1;
480 wire [`CFIFO_W_R] full_cword2;
481 wire [`CFIFO_W_R] full_cword3;
482 reg [127:0] cword0;
483 reg [127:0] cword1;
484 wire [127:0] cword2;
485 wire [127:0] cword3;
486 wire rdmc_tzfvld = CC1[0];
487 wire rdmc_hzfvld = CC4[3];
488 wire rdmc_zc_mode = rdmc_tzfvld | rdmc_hzfvld;
489 wire rsv = 1'b0;
490
491 always @ (/*AUTOSENSE*/CC0 or CC1 or CC10 or CC11 or CC12 or CC13
492 or CC14 or CC15 or CC16 or CC17 or CC18 or CC19 or CC20
493 or CC21 or CC22 or CC23 or CC24 or CC25 or CC26 or CC27
494 or CC28 or CC29 or CC3 or CC30 or CC31 or CC4 or CC6
495 or CC7 or CC8 or CC9 or HoQ_reg or default_rdc
496 or dmaw_type_reg or first_byte_buf_reg
497 or first_byte_offset_reg or fn or handle or payload_len
498 or rdmc_zc_mode or reach_buf_end_reg or rsv or table_rdc
499 or tt_err or tt_hdr_len_reg or tt_ok_reg6 or zc_rdc)
500 begin
501 if (rdmc_zc_mode & tt_ok_reg6)
502 begin // zcp packet
503 cword0 = {CC0,CC1,{default_rdc[4:0],table_rdc[4:2]},CC3,{table_rdc[1:0],CC4[5:0]},
504 {1'b1,{tt_err,{6{rsv}}}},// <-B5[7] tt_succeed == 1 => zc mode;
505 CC6,CC7,
506 tt_hdr_len_reg[15:0],payload_len[15:0],HoQ_reg[15:0],first_byte_offset_reg[23:8]};
507 cword1 = {first_byte_offset_reg[7:0], // 17th Byte
508 {reach_buf_end_reg,dmaw_type_reg[1:0],first_byte_buf_reg[4:0]}, // 18th Byte // win_buf_offset == first_byte_buf_reg
509 CC18,{CC19[7],dmaw_type_reg[1:0],zc_rdc[4:0]},CC20,CC21,CC22,CC23,CC24,CC25,CC26,CC27,CC28,
510 handle[19:0],fn[1:0],CC31[1:0]}; //CC29,CC30,CC31
511 end
512 else
513 begin // bypass packet
514 cword0 = {CC0,CC1,{default_rdc[4:0],table_rdc[4:2]},CC3,{table_rdc[1:0],CC4[5:0]},
515 {1'b0,{1'b0,{6{rsv}}}}, // <-B5[7] tt_succeed == 0 => bypass mode/ B5[6] tt_err == 0 always.
516 CC6,CC7,
517 CC8,CC9,CC10,CC11,CC12,CC13,CC14,CC15};
518 cword1 = {CC16,CC17, // end of control header
519 CC18,CC19,CC20,CC21,CC22,CC23,CC24,CC25,CC26,CC27,CC28,
520 CC29,CC30,CC31};
521 end
522 end // always @ (...
523
524 assign cword2 = {CC32[7:4],tt_dmaw_va0_reg[43:0],tt_dmaw_len0_reg[15:0],
525 CC40[7:4],tt_dmaw_va1_reg[43:0],tt_dmaw_len1_reg[15:0]};
526 assign cword3 = {CC48[7:4],tt_dmaw_va2_reg[43:0],tt_dmaw_len2_reg[15:0],
527 CC56[7:4],tt_dmaw_va3_reg[43:0],tt_dmaw_len3_reg[15:0]};
528
529
530
531
532 assign full_cword0[`CFIFO_W_R] = {`CFIFO_SOP, cword0}; // sop = 2'b01, B0~B15
533 assign full_cword1[`CFIFO_W_R] = {wr_2words1,1'b0,cword1}; // {eop,,,};
534 assign full_cword2[`CFIFO_W_R] = {2'b00, cword2};
535 assign full_cword3[`CFIFO_W_R] = {2'b10, cword3}; // {eop,,,};
536 assign mac_port = CC0[7:6];
537
538// wr_2words and wr_4words happens at the same time as
539df1 #(1) wr_2words0_df1(.clk(clk),.d(wr_2words), .q(wr_2words0));
540df1 #(1) wr_2words1_df1(.clk(clk),.d(wr_2words0),.q(wr_2words1));
541
542df1 #(1) wr_4words0_df1(.clk(clk),.d(wr_4words), .q(wr_4words0));
543df1 #(1) wr_4words1_df1(.clk(clk),.d(wr_4words0),.q(wr_4words1));
544df1 #(1) wr_4words2_df1(.clk(clk),.d(wr_4words1),.q(wr_4words2));
545df1 #(1) wr_4words3_df1(.clk(clk),.d(wr_4words2),.q(wr_4words3));
546
547 wire wr_ens = wr_2words0 | wr_2words1 |
548 wr_4words0 | wr_4words1 |
549 wr_4words2 | wr_4words3 ;
550
551 wire port0 = mac_port[1:0] == 2'b00;
552 wire port1 = mac_port[1:0] == 2'b01;
553 wire port2 = mac_port[1:0] == 2'b10;
554 wire port3 = mac_port[1:0] == 2'b11;
555
556 assign wr_en0 = (port0 & wr_ens);
557 assign wr_en1 = (port1 & wr_ens);
558 assign wr_en2 = (port2 & wr_ens);
559 assign wr_en3 = (port3 & wr_ens);
560
561 wire [`CFIFO_W_R] wr_data = (wr_4words0 | wr_2words0) ? full_cword0 :
562 (wr_4words1 | wr_2words1) ? full_cword1 :
563 (wr_4words2 ) ? full_cword2 :
564 (wr_4words3 ) ? full_cword3 :
565 full_cword0 ;
566
567 // ECC error injection logic
568 wire last_line0 = (port0 & (wr_2words1 | wr_4words3));
569 wire second_line0 = (port0 & (wr_2words1 | wr_4words1));
570 wire first_line0 = (port0 & (wr_2words0 | wr_4words0));
571 wire last_line1 = (port1 & (wr_2words1 | wr_4words3));
572 wire second_line1 = (port1 & (wr_2words1 | wr_4words1));
573 wire first_line1 = (port1 & (wr_2words0 | wr_4words0));
574
575/////////////////////////////////////////////////////////////////
576// ifdef between neptune and n2
577/////////////////////////////////////////////////////////////////
578
579`ifdef NEPTUNE
580 wire last_line2 = (port2 & (wr_2words1 | wr_4words3));
581 wire second_line2 = (port2 & (wr_2words1 | wr_4words1));
582 wire first_line2 = (port2 & (wr_2words0 | wr_4words0));
583 wire last_line3 = (port3 & (wr_2words1 | wr_4words3));
584 wire second_line3 = (port3 & (wr_2words1 | wr_4words1));
585 wire first_line3 = (port3 & (wr_2words0 | wr_4words0));
586 wire [1023:0] va_dout;
587 wire [`ST_R] st_dout;
588 wire [`DN_R] dn_dout;
589 wire [9:0] header_len;
590 wire [9:0] l3_hdr_len;
591 // vlint flag_dangling_net_within_module off
592 // vlint flag_net_has_no_load off
593 wire [23:0] buf_size;
594 wire [`XPAN_TCP_SEQ_SPACE]TL;
595 wire [`XPAN_TCP_SEQ_SPACE]S;
596 wire [`PKT_LEN_R] header_delta; // registered output.
597 wire [`XPAN_TCP_SEQ_SPACE]UE;
598 wire TL_bt_UE;
599 wire TL_eq_UE;
600 wire qual_ulp_end_fail_reg;
601 wire [`TCP_SEQ_SPACE]running_anchor_seq;
602 wire [5:0] first_byte_buf;
603 wire [20:0] last_byte_buf;
604 wire [5:0] index0;
605 wire [5:0] index1;
606 wire [5:0] index2;
607 wire [5:0] index3;
608 wire win_ok;
609 wire ulp_end_fail;
610 wire mapped_in_fail;
611 wire dmaw_threshold_fail;
612 wire unmap_on_left_oc;
613 // vlint flag_dangling_net_within_module on
614 // vlint flag_net_has_no_load on
615 wire [10:0] dmaw_threshold;
616
617 assign neptune_signature = 1;
618
619// tcp_payload_len (tcp_segment_len) calculation:
620//
621// IPv4: tcp_payld_len = ip_pkt_length (16 bits) - ip_hdr_length x 4 bytes - tcp_hdr_length x 4 bytes;
622//
623// IPv6: tcp_payld_len = ip_payload_length (16 bits) - tcp_hdr_length x 4 bytes;
624//
625// Generate pkt_off_set for calculating pkt_length for IBTP
626 wire [15:0] ipv4_hdr_lenx4 = {10'b0,ip_hdr_len, 2'b0};
627 wire [15:0] tcp_hdr_lenx4 = {10'b0,tcp_hdr_len,2'b0};
628
629/* ----- Start the tt_index registration which is to resolve timing issues ----- */
630// Every ram got its own tt_index as address
631// wire [11:0] tt_index ={B6[3:0],B7};
632
633// vlint flag_dangling_net_within_module off
634// vlint flag_net_has_no_load off
635 wire [3:0] fflp_data_4va_rsv;
636 wire [3:0] fflp_data_4dn_rsv;
637 wire [3:0] fflp_data_4st_rsv;
638// vlint flag_dangling_net_within_module on
639// vlint flag_net_has_no_load on
640
641 wire [11:0] tt_index_4va;
642
643dffre #(16) fflp_data_4va_dffre (.clk(clk),
644 .reset(reset[6]),
645 .en(ififo_ren[1]),
646 .d({ififo_dout[`BBYTE6],ififo_dout[`BBYTE7]}),
647 .q({fflp_data_4va_rsv[3:0],tt_index_4va[11:0]}));
648
649 wire [11:0] tt_index_4dn;
650
651dffre #(16) fflp_data_4dn_dffre (.clk(clk),
652 .reset(reset[7]),
653 .en(ififo_ren[2]),
654 .d({ififo_dout[`BBYTE6],ififo_dout[`BBYTE7]}),
655 .q({fflp_data_4dn_rsv[3:0],tt_index_4dn[11:0]}));
656
657 wire [11:0] tt_index_4st;
658dffre #(16) fflp_data_4st_dffre (.clk(clk),
659 .reset(reset[8]),
660 .en(ififo_ren[2]),
661 .d({ififo_dout[`BBYTE6],ififo_dout[`BBYTE7]}),
662 .q({fflp_data_4st_rsv[3:0],tt_index_4st[11:0]}));
663/* ----- end of tt_index registration which is to resolve timing issues ----- */
664
665
666 reg [15:0] tcp_payld_len;
667always @ (/*AUTOSENSE*/ip_pkt_len or ip_ver or ipv4_hdr_lenx4
668 or tcp_hdr_lenx4)
669 case(ip_ver)
670 1'b0: tcp_payld_len = ip_pkt_len[15:0] - ipv4_hdr_lenx4[15:0] - tcp_hdr_lenx4[15:0]; // IPv4
671 1'b1: tcp_payld_len = ip_pkt_len[15:0] - tcp_hdr_lenx4[15:0]; // IPv6
672 default:tcp_payld_len = ip_pkt_len[15:0] - ipv4_hdr_lenx4[15:0] - tcp_hdr_lenx4[15:0]; // IPv4
673 endcase
674
675
676 reg [9:0] l2_hdr_len;
677always @ (/*AUTOSENSE*/llc_snap or vlan)
678 casex({llc_snap,vlan})
679 2'b00: l2_hdr_len = 10'd14;
680 2'b01: l2_hdr_len = 10'd18;
681 2'b10: l2_hdr_len = 10'd22;
682 2'b11: l2_hdr_len = 10'd26;
683 default:l2_hdr_len = 10'd14;
684 endcase
685
686 assign l3_hdr_len = ip_ver ? 10'd40 : ipv4_hdr_lenx4[9:0];
687
688 assign header_len = tcp_hdr_lenx4[9:0] + l3_hdr_len[9:0] + l2_hdr_len[9:0];
689
690
691/* ------------ instantiations ------------ */
692niu_zcp_tt_dpath niu_zcp_tt_dpath
693 (/*AUTOINST*/
694 // Outputs
695 .tt_rdc_reg (tt_rdc_reg[7:0]),
696 .tt_ok_reg (tt_ok_reg[7:0]),
697 .dmaw_type_reg (dmaw_type_reg[1:0]),
698 .tt_dmaw_va0_reg (tt_dmaw_va0_reg[`DMA_R]),
699 .tt_dmaw_len0_reg (tt_dmaw_len0_reg[`PKT_LEN_R]),
700 .tt_dmaw_va1_reg (tt_dmaw_va1_reg[`DMA_R]),
701 .tt_dmaw_len1_reg (tt_dmaw_len1_reg[`PKT_LEN_R]),
702 .tt_dmaw_va2_reg (tt_dmaw_va2_reg[`DMA_R]),
703 .tt_dmaw_len2_reg (tt_dmaw_len2_reg[`PKT_LEN_R]),
704 .tt_dmaw_va3_reg (tt_dmaw_va3_reg[`DMA_R]),
705 .tt_dmaw_len3_reg (tt_dmaw_len3_reg[`PKT_LEN_R]),
706 .tt_hdr_len_reg (tt_hdr_len_reg[`PKT_LEN_R]),
707 .first_byte_buf_reg (first_byte_buf_reg[5:0]),
708 .first_byte_offset_reg (first_byte_offset_reg[23:0]),
709 .HoQ_reg (HoQ_reg[15:0]),
710 .wptr_HoQ_reg (wptr_HoQ_reg[15:0]),
711 .cross_q_end_reg (cross_q_end_reg),
712 .cross_4KB_reg (cross_4KB_reg),
713 .ring_size_reg (ring_size_reg[3:0]),
714 .ring_base_addr_reg (ring_base_addr_reg[38:0]),
715 .reach_buf_end_reg (reach_buf_end_reg),
716 .total_num_buf_requested_reg (total_num_buf_requested_reg[5:0]),
717 .wb_dn_reg (wb_dn_reg[`DN_R]),
718 .buf_req_ok (buf_req_ok),
719 .set_tt_program_err (set_tt_program_err),
720 .buf_size (buf_size[23:0]),
721 .TL (TL[`XPAN_TCP_SEQ_SPACE]),
722 .S (S[`XPAN_TCP_SEQ_SPACE]),
723 .payload_len (payload_len[`PKT_LEN_R]),
724 .header_delta (header_delta[`PKT_LEN_R]),
725 .UE (UE[`XPAN_TCP_SEQ_SPACE]),
726 .TL_bt_UE (TL_bt_UE),
727 .TL_eq_UE (TL_eq_UE),
728 .qual_ulp_end_fail_reg (qual_ulp_end_fail_reg),
729 .running_anchor_seq (running_anchor_seq[`TCP_SEQ_SPACE]),
730 .first_byte_buf (first_byte_buf[5:0]),
731 .last_byte_buf (last_byte_buf[20:0]),
732 .index0 (index0[5:0]),
733 .index1 (index1[5:0]),
734 .index2 (index2[5:0]),
735 .index3 (index3[5:0]),
736 .win_ok (win_ok),
737 .ulp_end_fail (ulp_end_fail),
738 .mapped_in_fail (mapped_in_fail),
739 .dmaw_threshold_fail (dmaw_threshold_fail),
740 .unmap_on_left_oc (unmap_on_left_oc),
741 // Inputs
742 .clk (clk),
743 .reset9 (reset9),
744 .dmaw_threshold (dmaw_threshold[10:0]),
745 .credit_ok (credit_ok),
746 .tcp_seq_num (tcp_seq_num[`TCP_SEQ_SPACE]),
747 .tcp_payld_len (tcp_payld_len[`PKT_LEN_R]),
748 .header_len (header_len[9:0]),
749 .tt_index_hi (tt_index_hi[1:0]),
750 .zcp_tt_index_err_lv (zcp_tt_index_err_lv),
751 .tt_rd_en4 (tt_rd_en4),
752 .ld_cal_results (ld_cal_results[21:0]),
753 .va_dout (va_dout[1023:0]),
754 .st_dout (st_dout[`ST_R]),
755 .dn_dout (dn_dout[`DN_R]));
756`else // N2 mode
757 // Unused niu_zcp_tt_dpath signals are driven to 0.
758
759 assign dmaw_type_reg = 0;
760 assign first_byte_offset_reg = 0;
761 assign tt_dmaw_len0_reg = 0;
762 assign tt_dmaw_len1_reg = 0;
763 assign tt_dmaw_len2_reg = 0;
764 assign tt_dmaw_len3_reg = 0;
765 assign tt_dmaw_va0_reg = 0;
766 assign tt_dmaw_va1_reg = 0;
767 assign tt_dmaw_va2_reg = 0;
768 assign tt_dmaw_va3_reg = 0;
769 assign tt_hdr_len_reg = 0;
770 assign va_ram_perr = 0;
771 assign dn_ram_perr = 0;
772 assign st_ram_perr = 0;
773
774 assign neptune_signature = 0;
775 assign tt_ok_reg = 0;
776 assign buf_req_ok = 0;
777 // error handling
778 assign wptr_HoQ_reg = 0;
779 assign HoQ_reg = 0;
780 assign cross_q_end_reg = 0;
781 assign cross_4KB_reg = 0;
782 assign ring_size_reg = 0;
783 assign ring_base_addr_reg = 0;
784 assign reach_buf_end_reg = 0;
785 assign total_num_buf_requested_reg = 0;
786 assign wb_dn_reg = 0;
787 //
788 assign tt_rdc_reg = 0;
789 assign first_byte_buf_reg = 0;
790 assign set_tt_program_err = 0;
791 assign payload_len = 0;
792
793`endif
794
795niu_zcp_tt_sm niu_zcp_tt_sm
796 (/*AUTOINST*/
797 // Outputs
798 .tt_rd_en0 (tt_rd_en0),
799 .tt_rd_en1 (tt_rd_en1),
800 .tt_rd_en2 (tt_rd_en2),
801 .tt_rd_en3 (tt_rd_en3),
802 .tt_rd_en4 (tt_rd_en4),
803 .wb_tt0 (wb_tt0),
804 .wb_tt1 (wb_tt1),
805 .decode_default_rdc (decode_default_rdc),
806 .decode_table_rdc (decode_table_rdc),
807 .decode_zc_rdc (decode_zc_rdc),
808 .tt_active (tt_active),
809 .tt_sm_rw (tt_sm_rw),
810 .ld_cal_results (ld_cal_results[31:0]),
811 .tt_fail (tt_fail),
812 .buf_req (buf_req),
813 .wr_2words (wr_2words),
814 .wr_4words (wr_4words),
815 .tt_state (tt_state[3:0]),
816 // Inputs
817 .clk (clk),
818 .reset10 (reset10),
819 .kickoff_tt (kickoff_tt),
820 .tt_ok_reg (tt_ok_reg[5:0]),
821 .tt_en (tt_en),
822 .zc_mode (zc_mode),
823 .buf_req_ok (buf_req_ok));
824
825/* --------------- spare gates --------------- */
826`ifdef NEPTUNE
827wire [3:0] do_nad;
828wire [3:0] do_nor;
829wire [3:0] do_inv;
830wire [3:0] do_mux;
831wire [3:0] do_q;
832wire so;
833
834 zcp_spare_gates zcp_tt_spare_gates (
835 .di_nd3 ({1'h1, 1'h1, do_q[3]}),
836 .di_nd2 ({1'h1, 1'h1, do_q[2]}),
837 .di_nd1 ({1'h1, 1'h1, do_q[1]}),
838 .di_nd0 ({1'h1, 1'h1, do_q[0]}),
839 .di_nr3 ({1'h0, 1'h0}),
840 .di_nr2 ({1'h0, 1'h0}),
841 .di_nr1 ({1'h0, 1'h0}),
842 .di_nr0 ({1'h0, 1'h0}),
843 .di_inv (do_nad[3:0]),
844 .di_mx3 ({1'h0, 1'h0}),
845 .di_mx2 ({1'h0, 1'h0}),
846 .di_mx1 ({1'h0, 1'h0}),
847 .di_mx0 ({1'h0, 1'h0}),
848 .mx_sel (do_nor[3:0]),
849 .di_reg (do_inv[3:0]),
850 .wt_ena (do_mux[3:0]),
851 .rst (reset[10:7]),
852 .si (1'h0),
853 .se (1'h0),
854 .clk (clk),
855 .do_nad (do_nad[3:0]),
856 .do_nor (do_nor[3:0]),
857 .do_inv (do_inv[3:0]),
858 .do_mux (do_mux[3:0]),
859 .do_q (do_q[3:0]),
860 .so (so)
861 );
862
863`else
864`endif
865
866
867endmodule // niu_zcp_tt
868