Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / niu / rtl / fflp_cam_srch.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: fflp_cam_srch.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/**********************************************************************/
36/*project name: N2 */
37/*module name: fflp_cam_srch */
38/*description: */
39/* Controls CAM accesses for both CPU commands and */
40/* flow lookups */
41/* */
42/*parent module in: */
43/*child modules in: fflp_cam_srch_sm */
44/*interface modules: */
45/*author name: Jeanne Cai */
46/*date created: 10-03-04 */
47/* */
48/* Copyright (c) 2004, Sun Microsystems, Inc. */
49/* Sun Proprietary and Confidential */
50/* */
51/*modifications: */
52/* */
53/**********************************************************************/
54
55`include "fflp.h"
56
57module fflp_cam_srch
58 (
59 cclk,
60 reset,
61 cam_srch_latency,
62 pio_disable_cam,
63 fwd_sched,
64 cpu_sched,
65 key_bus,
66 fwd_info_bus,
67 cam_hit,
68 cam_valid,
69 cam_haddr,
70 pio_rd_vld,
71 cam_msk_dat_out,
72 am_din_reg_dout,
73 pio_wen,
74 pio_addr,
75 pio_32b_mode,
76 pio_wr_data,
77
78 cpu_req_cam_acc,
79 ram_acc_type,
80 kick_off_ram_ctrl,
81 cam_haddr_reg1_dout,
82 cam_index,
83 cam_data_inp,
84 cam_compare,
85 cam_pio_wr,
86 cam_pio_rd,
87 cam_pio_sel,
88 matchout_5,
89 kick_off_ram_srch_4,
90 kick_off_ram_srch_5,
91 fwd_info_bus_2,
92 key_ecc_data_2,
93 cam_key_reg0_dout,
94 cam_key_reg1_dout,
95 cam_key_reg2_dout,
96 cam_key_reg3_dout,
97 cam_key_mask_reg0_dout,
98 cam_key_mask_reg1_dout,
99 cam_key_mask_reg2_dout,
100 cam_key_mask_reg3_dout,
101 cam_cmd_stat_reg_dout
102 );
103
104input cclk;
105input reset;
106input pio_disable_cam;
107input[3:0] cam_srch_latency;
108input fwd_sched;
109input cpu_sched;
110input[199:0] key_bus;
111input[445:0] fwd_info_bus;
112input cam_hit;
113input cam_valid;
114input[9:0] cam_haddr;
115input pio_rd_vld;
116input[199:0] cam_msk_dat_out;
117input[41:0] am_din_reg_dout;
118input pio_wen;
119input[19:0] pio_addr;
120input pio_32b_mode;
121input[63:0] pio_wr_data;
122
123output cpu_req_cam_acc;
124output[1:0] ram_acc_type;
125output kick_off_ram_ctrl;
126output[9:0] cam_haddr_reg1_dout;
127output[9:0] cam_index;
128output[199:0] cam_data_inp;
129output cam_compare;
130output cam_pio_wr;
131output cam_pio_rd;
132output cam_pio_sel;
133output matchout_5;
134output kick_off_ram_srch_4;
135output kick_off_ram_srch_5;
136output[445:0] fwd_info_bus_2;
137output[103:0] key_ecc_data_2;
138output[7:0] cam_key_reg0_dout;
139output[63:0] cam_key_reg1_dout;
140output[63:0] cam_key_reg2_dout;
141output[63:0] cam_key_reg3_dout;
142output[7:0] cam_key_mask_reg0_dout;
143output[63:0] cam_key_mask_reg1_dout;
144output[63:0] cam_key_mask_reg2_dout;
145output[63:0] cam_key_mask_reg3_dout;
146output[20:0] cam_cmd_stat_reg_dout;
147
148wire srch_matchout_2;
149wire matchout_1_in;
150wire matchout_1;
151wire matchout_2;
152wire matchout_3;
153wire matchout_4;
154wire matchout_5;
155wire cpu_cmd_done;
156wire cpu_cmd_done_1;
157wire cpu_cmd_done_2;
158wire kick_off_ram_srch;
159wire kick_off_ram_srch_1;
160wire kick_off_ram_srch_2;
161wire kick_off_ram_srch_3;
162wire kick_off_ram_srch_4;
163wire kick_off_ram_srch_5;
164
165wire[445:0] fwd_info_bus_1;
166wire[445:0] fwd_info_bus_2;
167wire[103:0] key_ecc_data_1;
168wire[103:0] key_ecc_data_2;
169
170reg kick_off_ram_ctrl;
171reg[1:0] ram_acc_type;
172reg cpu_req_ram_done;
173
174wire do_srch_cycle;
175wire do_cpu_cycle;
176
177wire cpu_req_en;
178wire cpu_req_in;
179wire cpu_req;
180wire is_cpu_sched_en;
181wire is_cpu_sched_in;
182wire is_cpu_sched;
183
184wire cpu_req_ram_done_3_in;
185wire cpu_req_cam_rd_dly;
186wire cpu_req_cam_rd_done_1;
187wire cpu_req_cam_rd_done_2;
188wire cpu_req_cam_rd_done_3;
189wire cpu_req_cam_rd_done_4;
190wire cpu_req_cam_rd_done_5;
191wire cpu_req_cam_rd_done_6;
192wire cpu_req_cam_rd_done_7;
193wire cpu_req_cam_rd_done_8;
194wire cpu_req_ram_done_1;
195wire cpu_req_ram_done_2;
196wire cpu_req_ram_done_3;
197
198wire cam_key_reg0_en;
199wire[7:0] cam_key_reg0_in;
200wire[7:0] cam_key_reg0_dout;
201wire cam_key_reg1_en;
202wire[31:0] cam_key_reg1_in;
203wire cam_key_reg1_h_en;
204wire[31:0] cam_key_reg1_h_in;
205wire[63:0] cam_key_reg1_dout;
206wire cam_key_reg2_en;
207wire[31:0] cam_key_reg2_in;
208wire cam_key_reg2_h_en;
209wire[31:0] cam_key_reg2_h_in;
210wire[63:0] cam_key_reg2_dout;
211wire cam_key_reg3_en;
212wire[31:0] cam_key_reg3_in;
213wire cam_key_reg3_h_en;
214wire[31:0] cam_key_reg3_h_in;
215wire[63:0] cam_key_reg3_dout;
216wire cam_key_mask_reg0_en;
217wire[7:0] cam_key_mask_reg0_in;
218wire[7:0] cam_key_mask_reg0_dout;
219wire cam_key_mask_reg1_en;
220wire[31:0] cam_key_mask_reg1_in;
221wire cam_key_mask_reg1_h_en;
222wire[31:0] cam_key_mask_reg1_h_in;
223wire[63:0] cam_key_mask_reg1_dout;
224wire cam_key_mask_reg2_en;
225wire[31:0] cam_key_mask_reg2_in;
226wire cam_key_mask_reg2_h_en;
227wire[31:0] cam_key_mask_reg2_h_in;
228wire[63:0] cam_key_mask_reg2_dout;
229wire cam_key_mask_reg3_en;
230wire[31:0] cam_key_mask_reg3_in;
231wire cam_key_mask_reg3_h_en;
232wire[31:0] cam_key_mask_reg3_h_in;
233wire[63:0] cam_key_mask_reg3_dout;
234wire cam_cmd_stat_reg_en;
235wire[20:0] cam_cmd_stat_reg_in;
236//wire[20:0] cam_cmd_stat_reg_dout;
237
238reg[20:0] cam_cmd_stat_reg_dout;
239
240wire cam_pio_rd_in;
241wire cam_pio_sel_in;
242wire[199:0] cam_key_mask_data;
243wire[199:0] cam_key_data;
244wire[199:0] cam_key_data_mux;
245wire[199:0] data_inp_in;
246wire[199:0] cam_data_inp;
247wire cam_compare;
248wire cam_pio_wr;
249wire cam_pio_rd;
250wire cam_pio_sel;
251
252wire pio_rd_vld_1;
253wire[9:0] cam_haddr_reg1_dout;
254wire[199:0] cam_msk_dat_reg_dout;
255
256wire[9:0] cam_index;
257wire status_bit;
258wire[2:0] cpu_cmd;
259wire cpu_req_cam_rd;
260wire cpu_req_ram_rd;
261wire cpu_req_ram_wr;
262wire cpu_req_cam_acc;
263
264wire cam_match;
265wire[9:0] cam_loc;
266wire cpu_sched_done;
267wire cpu_req_done;
268wire[20:0] cam_ram_stat_dout;
269wire cpu_req_cam_rd_done;
270wire cam_pio_rd_sel;
271wire cam_key_reg_rd_en;
272wire cam_mask_reg_rd_en;
273
274wire cam_key_reg3_pio_wen;
275wire cam_key_reg2_pio_wen;
276wire cam_key_reg1_pio_wen;
277wire cam_key_reg0_pio_wen;
278wire cam_key_reg3_h_pio_wen;
279wire cam_key_reg2_h_pio_wen;
280wire cam_key_reg1_h_pio_wen;
281
282wire cam_key_mask_reg3_pio_wen;
283wire cam_key_mask_reg2_pio_wen;
284wire cam_key_mask_reg1_pio_wen;
285wire cam_key_mask_reg0_pio_wen;
286wire cam_key_mask_reg3_h_pio_wen;
287wire cam_key_mask_reg2_h_pio_wen;
288wire cam_key_mask_reg1_h_pio_wen;
289
290wire cam_cmd_stat_reg_pio_wen;
291
292wire cam_compare_sm;
293wire cam_pio_wr_sm;
294wire cam_pio_sel_sm;
295wire[1:0] data_inp_sel;
296wire data_inp_en;
297wire srch_wait_done;
298wire cpu_cmd_done_sm;
299wire kick_off_ram_srch_sm;
300wire new_cam_hit = cam_hit & cam_valid;
301
302
303/*********************************/
304//CAM_RAM interface control
305/*********************************/
306assign matchout_1 = matchout_1_in & !pio_disable_cam;
307assign srch_matchout_2 = (matchout_1 | matchout_2) & kick_off_ram_srch_2;
308
309dffr #(1) matchout1_reg (cclk, reset, new_cam_hit, matchout_1_in);
310dffr #(1) matchout2_reg (cclk, reset, matchout_1, matchout_2);
311dffr #(1) matchout3_reg (cclk, reset, srch_matchout_2, matchout_3);
312dffr #(1) matchout4_reg (cclk, reset, matchout_3, matchout_4);
313dffr #(1) matchout5_reg (cclk, reset, matchout_4, matchout_5);
314dffr #(1) cpu_cmd_done_reg (cclk, reset, cpu_cmd_done_sm, cpu_cmd_done);
315dffr #(1) cpu_cmd_done1_reg (cclk, reset, cpu_cmd_done, cpu_cmd_done_1);
316dffr #(1) cpu_cmd_done2_reg (cclk, reset, cpu_cmd_done_1, cpu_cmd_done_2);
317dffr #(1) kick_off_ram_srch_reg (cclk, reset, kick_off_ram_srch_sm, kick_off_ram_srch);
318dffr #(1) kick_off_ram_srch1_reg(cclk, reset, kick_off_ram_srch, kick_off_ram_srch_1);
319dffr #(1) kick_off_ram_srch2_reg(cclk, reset, kick_off_ram_srch_1, kick_off_ram_srch_2);
320dffr #(1) kick_off_ram_srch3_reg(cclk, reset, kick_off_ram_srch_2, kick_off_ram_srch_3);
321dffr #(1) kick_off_ram_srch4_reg(cclk, reset, kick_off_ram_srch_3, kick_off_ram_srch_4);
322dffr #(1) kick_off_ram_srch5_reg(cclk, reset, kick_off_ram_srch_4, kick_off_ram_srch_5);
323
324dffre #(446) fwd_info_bus_1_reg (cclk, reset, srch_wait_done, fwd_info_bus, fwd_info_bus_1);
325dffre #(446) fwd_info_bus_2_reg (cclk, reset, kick_off_ram_srch_4, fwd_info_bus_1, fwd_info_bus_2);
326dffre #(104) key_ecc_data_1_reg (cclk, reset, srch_wait_done, key_bus[103:0], key_ecc_data_1);
327dffre #(104) key_ecc_data_2_reg (cclk, reset, kick_off_ram_srch_4, key_ecc_data_1, key_ecc_data_2);
328
329always @ (kick_off_ram_srch_2 or kick_off_ram_srch_3 or
330 kick_off_ram_srch_4 or kick_off_ram_srch_5 or
331 srch_matchout_2 or cpu_req_ram_rd or cpu_req_ram_wr)
332begin
333 if (srch_matchout_2)
334 begin
335 ram_acc_type = `RAM_RMW;
336 kick_off_ram_ctrl = 1'b1;
337 cpu_req_ram_done = 1'b0;
338 end
339 else if (kick_off_ram_srch_2 | kick_off_ram_srch_3 | kick_off_ram_srch_4 | kick_off_ram_srch_5)
340 begin
341 ram_acc_type = `RAM_RMW;
342 kick_off_ram_ctrl = 1'b0;
343 cpu_req_ram_done = 1'b0;
344 end
345 else if (cpu_req_ram_rd)
346 begin
347 ram_acc_type = `RAM_R;
348 kick_off_ram_ctrl = 1'b1;
349 cpu_req_ram_done = 1'b1;
350 end
351 else if (cpu_req_ram_wr)
352 begin
353 ram_acc_type = `RAM_W;
354 kick_off_ram_ctrl = 1'b1;
355 cpu_req_ram_done = 1'b1;
356 end
357 else
358 begin
359 ram_acc_type = `RAM_R;
360 kick_off_ram_ctrl = 1'b0;
361 cpu_req_ram_done = 1'b0;
362 end
363end
364
365/**********************************/
366//CPU Command Interface
367/**********************************/
368assign cam_index = cam_cmd_stat_reg_dout[9:0];
369assign status_bit = cam_cmd_stat_reg_dout[17];
370assign cpu_cmd = cam_cmd_stat_reg_dout[20:18];
371
372assign cpu_req_cam_rd = cpu_req & (cpu_cmd == `RD_CAM_KEY);
373assign cpu_req_ram_rd = cpu_req & (cpu_cmd == `RD_ASSOC_D);
374assign cpu_req_ram_wr = cpu_req & (cpu_cmd == `WR_ASSOC_D);
375assign cpu_req_cam_acc = cpu_req & !((cpu_cmd == `RD_CAM_KEY) |
376 (cpu_cmd == `RD_ASSOC_D) |
377 (cpu_cmd == `WR_ASSOC_D));
378
379assign cam_match = (matchout_1 | matchout_2) & cpu_cmd_done_2;
380assign cam_loc = cam_match ? cam_haddr_reg1_dout[9:0] : cam_index[9:0];
381assign cpu_sched_done = (cpu_sched | cpu_req_ram_done | cpu_req_cam_rd_done);
382assign cpu_req_done = (cpu_cmd_done_2 | cpu_req_ram_done_2 | cpu_req_cam_rd_done_8);
383assign cam_ram_stat_dout= {cpu_cmd[2:0], cpu_req_done, cam_match, 6'b0, cam_loc[9:0]};
384
385assign cpu_req_en = cpu_sched_done | (!status_bit && !is_cpu_sched);
386assign cpu_req_in = cpu_sched_done ? 1'b0 : 1'b1;
387assign is_cpu_sched_en = cpu_sched_done | cpu_req_done;
388assign is_cpu_sched_in = cpu_sched_done ? 1'b1 : 1'b0;
389
390dffre #(1) cpu_req_reg (cclk, reset, cpu_req_en, cpu_req_in, cpu_req);
391dffre #(1) is_cpu_sched_reg (cclk, reset, is_cpu_sched_en, is_cpu_sched_in, is_cpu_sched);
392
393/********************************/
394//TCAM Read, ASSOC_D Read
395/********************************/
396assign cpu_req_ram_done_3_in = cpu_req_ram_done_2 & (cpu_cmd == `RD_ASSOC_D);
397
398dffr #(1) cpu_req_cam_rd_dly_reg (cclk, reset, cpu_req_cam_rd, cpu_req_cam_rd_dly);
399dffr #(1) cpu_req_cam_rd_done_1_reg (cclk, reset, cpu_req_cam_rd_done, cpu_req_cam_rd_done_1);
400dffr #(1) cpu_req_cam_rd_done_2_reg (cclk, reset, cpu_req_cam_rd_done_1, cpu_req_cam_rd_done_2);
401dffr #(1) cpu_req_cam_rd_done_3_reg (cclk, reset, cpu_req_cam_rd_done_2, cpu_req_cam_rd_done_3);
402dffr #(1) cpu_req_cam_rd_done_4_reg (cclk, reset, cpu_req_cam_rd_done_3, cpu_req_cam_rd_done_4);
403dffr #(1) cpu_req_cam_rd_done_5_reg (cclk, reset, cpu_req_cam_rd_done_4, cpu_req_cam_rd_done_5);
404dffr #(1) cpu_req_cam_rd_done_6_reg (cclk, reset, cpu_req_cam_rd_done_5, cpu_req_cam_rd_done_6);
405dffr #(1) cpu_req_cam_rd_done_7_reg (cclk, reset, cpu_req_cam_rd_done_6, cpu_req_cam_rd_done_7);
406dffr #(1) cpu_req_cam_rd_done_8_reg (cclk, reset, cpu_req_cam_rd_done_7, cpu_req_cam_rd_done_8);
407dffr #(1) cpu_req_ram_done_1_reg (cclk, reset, cpu_req_ram_done, cpu_req_ram_done_1);
408dffr #(1) cpu_req_ram_done_2_reg (cclk, reset, cpu_req_ram_done_1, cpu_req_ram_done_2);
409dffr #(1) cpu_req_ram_done_3_reg (cclk, reset, cpu_req_ram_done_3_in, cpu_req_ram_done_3);
410
411assign cpu_req_cam_rd_done = cpu_req_cam_rd & !cpu_req_cam_rd_dly;
412assign cam_pio_rd_sel = (cpu_req_cam_rd_done_2 | cpu_req_cam_rd_done_3) ? 1'b1 : 1'b0;
413
414assign cam_key_reg_rd_en = (cpu_req_cam_rd_done_5 | cpu_req_cam_rd_done_6) & pio_rd_vld_1;
415assign cam_mask_reg_rd_en = (cpu_req_cam_rd_done_7 | cpu_req_cam_rd_done_8) & pio_rd_vld_1;
416
417
418/********************************************/
419//CAM-RAM PIO READ/WRITE
420/********************************************/
421assign cam_key_reg0_pio_wen = pio_wen & (pio_addr == 20'ha0090);
422assign cam_key_reg1_pio_wen = pio_wen & (pio_addr == 20'ha0098);
423assign cam_key_reg2_pio_wen = pio_wen & (pio_addr == 20'ha00a0);
424assign cam_key_reg3_pio_wen = pio_wen & (pio_addr == 20'ha00a8);
425
426assign cam_key_reg1_h_pio_wen = pio_wen & ((pio_addr == 20'ha0098) & !pio_32b_mode | (pio_addr == 20'ha009c) & pio_32b_mode);
427assign cam_key_reg2_h_pio_wen = pio_wen & ((pio_addr == 20'ha00a0) & !pio_32b_mode | (pio_addr == 20'ha00a4) & pio_32b_mode);
428assign cam_key_reg3_h_pio_wen = pio_wen & ((pio_addr == 20'ha00a8) & !pio_32b_mode | (pio_addr == 20'ha00ac) & pio_32b_mode);
429
430assign cam_key_mask_reg0_pio_wen= pio_wen & (pio_addr == 20'ha00b0);
431assign cam_key_mask_reg1_pio_wen= pio_wen & (pio_addr == 20'ha00b8);
432assign cam_key_mask_reg2_pio_wen= pio_wen & (pio_addr == 20'ha00c0);
433assign cam_key_mask_reg3_pio_wen= pio_wen & (pio_addr == 20'ha00c8);
434
435assign cam_key_mask_reg1_h_pio_wen= pio_wen & ((pio_addr == 20'ha00b8) & !pio_32b_mode | (pio_addr == 20'ha00bc) & pio_32b_mode);
436assign cam_key_mask_reg2_h_pio_wen= pio_wen & ((pio_addr == 20'ha00c0) & !pio_32b_mode | (pio_addr == 20'ha00c4) & pio_32b_mode);
437assign cam_key_mask_reg3_h_pio_wen= pio_wen & ((pio_addr == 20'ha00c8) & !pio_32b_mode | (pio_addr == 20'ha00cc) & pio_32b_mode);
438
439assign cam_cmd_stat_reg_pio_wen = pio_wen & (pio_addr == 20'ha00d0);
440
441assign cam_key_reg0_en = cam_key_reg0_pio_wen | cam_key_reg_rd_en;
442assign cam_key_reg0_in = cam_key_reg_rd_en ? cam_msk_dat_reg_dout[199:192] : pio_wr_data[7:0];
443
444assign cam_key_reg1_en = cam_key_reg1_pio_wen | cam_key_reg_rd_en | cpu_req_ram_done_3;
445assign cam_key_reg1_in = cam_key_reg_rd_en ? cam_msk_dat_reg_dout[159:128] :
446 cpu_req_ram_done_3 ? am_din_reg_dout[31:0] :
447 pio_wr_data[31:0];
448
449assign cam_key_reg1_h_en = cam_key_reg1_h_pio_wen | cam_key_reg_rd_en | cpu_req_ram_done_3;
450assign cam_key_reg1_h_in = cam_key_reg_rd_en ? cam_msk_dat_reg_dout[191:160] :
451 cpu_req_ram_done_3 ? {22'b0, am_din_reg_dout[41:32]} :
452 pio_32b_mode ? pio_wr_data[31:0] : pio_wr_data[63:32];
453
454assign cam_key_reg2_en = cam_key_reg2_pio_wen | cam_key_reg_rd_en;
455assign cam_key_reg2_in = cam_key_reg_rd_en ? cam_msk_dat_reg_dout[95:64] : pio_wr_data[31:0];
456
457assign cam_key_reg2_h_en = cam_key_reg2_h_pio_wen | cam_key_reg_rd_en;
458assign cam_key_reg2_h_in = cam_key_reg_rd_en ? cam_msk_dat_reg_dout[127:96] :
459 pio_32b_mode ? pio_wr_data[31:0] : pio_wr_data[63:32];
460
461assign cam_key_reg3_en = cam_key_reg3_pio_wen | cam_key_reg_rd_en;
462assign cam_key_reg3_in = cam_key_reg_rd_en ? cam_msk_dat_reg_dout[31:0] : pio_wr_data[31:0];
463
464assign cam_key_reg3_h_en = cam_key_reg3_h_pio_wen | cam_key_reg_rd_en;
465assign cam_key_reg3_h_in = cam_key_reg_rd_en ? cam_msk_dat_reg_dout[63:32] :
466 pio_32b_mode ? pio_wr_data[31:0] : pio_wr_data[63:32];
467
468
469assign cam_key_mask_reg0_en = cam_key_mask_reg0_pio_wen | cam_mask_reg_rd_en;
470assign cam_key_mask_reg0_in = cam_mask_reg_rd_en ? cam_msk_dat_reg_dout[199:192] : pio_wr_data[7:0];
471
472assign cam_key_mask_reg1_en = cam_key_mask_reg1_pio_wen | cam_mask_reg_rd_en;
473assign cam_key_mask_reg1_in = cam_mask_reg_rd_en ? cam_msk_dat_reg_dout[159:128] : pio_wr_data[31:0];
474
475assign cam_key_mask_reg1_h_en = cam_key_mask_reg1_h_pio_wen | cam_mask_reg_rd_en;
476assign cam_key_mask_reg1_h_in = cam_mask_reg_rd_en ? cam_msk_dat_reg_dout[191:160] :
477 pio_32b_mode ? pio_wr_data[31:0] : pio_wr_data[63:32];
478
479assign cam_key_mask_reg2_en = cam_key_mask_reg2_pio_wen | cam_mask_reg_rd_en;
480assign cam_key_mask_reg2_in = cam_mask_reg_rd_en ? cam_msk_dat_reg_dout[95:64] : pio_wr_data[31:0];
481
482assign cam_key_mask_reg2_h_en = cam_key_mask_reg2_h_pio_wen | cam_mask_reg_rd_en;
483assign cam_key_mask_reg2_h_in = cam_mask_reg_rd_en ? cam_msk_dat_reg_dout[127:96] :
484 pio_32b_mode ? pio_wr_data[31:0] : pio_wr_data[63:32];
485
486assign cam_key_mask_reg3_en = cam_key_mask_reg3_pio_wen | cam_mask_reg_rd_en;
487assign cam_key_mask_reg3_in = cam_mask_reg_rd_en ? cam_msk_dat_reg_dout[31:0] : pio_wr_data[31:0];
488
489assign cam_key_mask_reg3_h_en = cam_key_mask_reg3_h_pio_wen | cam_mask_reg_rd_en;
490assign cam_key_mask_reg3_h_in = cam_mask_reg_rd_en ? cam_msk_dat_reg_dout[63:32] :
491 pio_32b_mode ? pio_wr_data[31:0] : pio_wr_data[63:32];
492
493assign cam_cmd_stat_reg_en = cam_cmd_stat_reg_pio_wen | cpu_req_done;
494assign cam_cmd_stat_reg_in = cpu_req_done ? cam_ram_stat_dout[20:0] : {pio_wr_data[20:16], 6'b0, pio_wr_data[9:0]};
495
496dffre #(8) cam_key_reg0 (cclk, reset, cam_key_reg0_en, cam_key_reg0_in, cam_key_reg0_dout[7:0]);
497dffre #(32) cam_key_reg1_l (cclk, reset, cam_key_reg1_en, cam_key_reg1_in, cam_key_reg1_dout[31:0]);
498dffre #(32) cam_key_reg2_l (cclk, reset, cam_key_reg2_en, cam_key_reg2_in, cam_key_reg2_dout[31:0]);
499dffre #(32) cam_key_reg3_l (cclk, reset, cam_key_reg3_en, cam_key_reg3_in, cam_key_reg3_dout[31:0]);
500dffre #(32) cam_key_reg1_h (cclk, reset, cam_key_reg1_h_en, cam_key_reg1_h_in, cam_key_reg1_dout[63:32]);
501dffre #(32) cam_key_reg2_h (cclk, reset, cam_key_reg2_h_en, cam_key_reg2_h_in, cam_key_reg2_dout[63:32]);
502dffre #(32) cam_key_reg3_h (cclk, reset, cam_key_reg3_h_en, cam_key_reg3_h_in, cam_key_reg3_dout[63:32]);
503
504dffre #(8) cam_key_mask_reg0 (cclk, reset, cam_key_mask_reg0_en, cam_key_mask_reg0_in, cam_key_mask_reg0_dout[7:0]);
505dffre #(32) cam_key_mask_reg1_l (cclk, reset, cam_key_mask_reg1_en, cam_key_mask_reg1_in, cam_key_mask_reg1_dout[31:0]);
506dffre #(32) cam_key_mask_reg2_l (cclk, reset, cam_key_mask_reg2_en, cam_key_mask_reg2_in, cam_key_mask_reg2_dout[31:0]);
507dffre #(32) cam_key_mask_reg3_l (cclk, reset, cam_key_mask_reg3_en, cam_key_mask_reg3_in, cam_key_mask_reg3_dout[31:0]);
508dffre #(32) cam_key_mask_reg1_h (cclk, reset, cam_key_mask_reg1_h_en, cam_key_mask_reg1_h_in, cam_key_mask_reg1_dout[63:32]);
509dffre #(32) cam_key_mask_reg2_h (cclk, reset, cam_key_mask_reg2_h_en, cam_key_mask_reg2_h_in, cam_key_mask_reg2_dout[63:32]);
510dffre #(32) cam_key_mask_reg3_h (cclk, reset, cam_key_mask_reg3_h_en, cam_key_mask_reg3_h_in, cam_key_mask_reg3_dout[63:32]);
511
512//dffre #(21) cam_cmd_stat_reg (cclk, reset, cam_cmd_stat_reg_en, cam_cmd_stat_reg_in, cam_cmd_stat_reg_dout);
513
514always @ (posedge cclk)
515if (reset)
516 cam_cmd_stat_reg_dout <= 21'b0_0010_0000_0000_0000_0000;
517else if (cam_cmd_stat_reg_en)
518 cam_cmd_stat_reg_dout <= cam_cmd_stat_reg_in;
519else
520 cam_cmd_stat_reg_dout <= cam_cmd_stat_reg_dout;
521
522/********************************************/
523//Search command decode
524/********************************************/
525dffr #(1) do_srch_cycle_reg (cclk, reset, fwd_sched, do_srch_cycle);
526dffr #(1) do_cpu_cycle_reg (cclk, reset, cpu_sched, do_cpu_cycle);
527
528/*********************************/
529//TCAM interface signals
530/*********************************/
531assign cam_pio_rd_in = (cpu_req_cam_rd_done | cpu_req_cam_rd_done_1 | cpu_req_cam_rd_done_2 | cpu_req_cam_rd_done_3);
532assign cam_pio_sel_in = (cam_pio_sel_sm | cam_pio_rd_sel);
533
534assign cam_key_mask_data = {cam_key_mask_reg0_dout[7:0], cam_key_mask_reg1_dout[63:0],
535 cam_key_mask_reg2_dout[63:0], cam_key_mask_reg3_dout[63:0]};
536
537assign cam_key_data = {cam_key_reg0_dout[7:0], cam_key_reg1_dout[63:0],
538 cam_key_reg2_dout[63:0], cam_key_reg3_dout[63:0]};
539
540assign cam_key_data_mux = data_inp_sel[0] ? cam_key_mask_data : cam_key_data;
541
542assign data_inp_in = data_inp_sel[1] ? cam_key_data_mux[199:0] : key_bus[199:0];
543
544dffre #(200) cam_data_inp_reg (cclk, reset, data_inp_en, data_inp_in, cam_data_inp);
545dffr #(1) cam_compare_reg (cclk, reset, cam_compare_sm, cam_compare);
546dffr #(1) cam_pio_wr_reg (cclk, reset, cam_pio_wr_sm, cam_pio_wr);
547dffr #(1) cam_pio_rd_reg (cclk, reset, cam_pio_rd_in, cam_pio_rd);
548dffr #(1) cam_pio_sel_reg (cclk, reset, cam_pio_sel_in, cam_pio_sel);
549
550dffre #(10) cam_haddr_reg1 (cclk, reset, cam_valid, cam_haddr[9:0], cam_haddr_reg1_dout);
551dffr #(200) cam_msk_dat_reg (cclk, reset, cam_msk_dat_out[199:0], cam_msk_dat_reg_dout);
552dffr #(1) pio_rd_vld_reg (cclk, reset, pio_rd_vld, pio_rd_vld_1);
553
554
555//instantiate state machine
556fflp_cam_srch_sm fflp_cam_srch_sm_inst
557 (
558 .cclk (cclk),
559 .reset (reset),
560 .cam_srch_latency (cam_srch_latency),
561 .do_srch_cycle (do_srch_cycle),
562 .do_cpu_cycle (do_cpu_cycle),
563 .cpu_cmd (cpu_cmd),
564
565 .cam_compare_sm (cam_compare_sm),
566 .cam_pio_wr_sm (cam_pio_wr_sm),
567 .cam_pio_sel_sm (cam_pio_sel_sm),
568 .data_inp_sel (data_inp_sel),
569 .data_inp_en (data_inp_en),
570 .srch_wait_done (srch_wait_done),
571 .cpu_cmd_done_sm (cpu_cmd_done_sm),
572 .kick_off_ram_srch_sm (kick_off_ram_srch_sm)
573 );
574
575`ifdef NEPTUNE
576wire [3:0] do_nad;
577wire [3:0] do_nor;
578wire [3:0] do_inv;
579wire [3:0] do_mux;
580wire [3:0] do_q;
581wire so;
582
583nep_spare_fflp spare_fflp_0 (
584 .di_nd3 ({1'h1, 1'h1, do_q[3]}),
585 .di_nd2 ({1'h1, 1'h1, do_q[2]}),
586 .di_nd1 ({1'h1, 1'h1, do_q[1]}),
587 .di_nd0 ({1'h1, 1'h1, do_q[0]}),
588 .di_nr3 ({1'h0, 1'h0}),
589 .di_nr2 ({1'h0, 1'h0}),
590 .di_nr1 ({1'h0, 1'h0}),
591 .di_nr0 ({1'h0, 1'h0}),
592 .di_inv (do_nad[3:0]),
593 .di_mx3 ({1'h0, 1'h0}),
594 .di_mx2 ({1'h0, 1'h0}),
595 .di_mx1 ({1'h0, 1'h0}),
596 .di_mx0 ({1'h0, 1'h0}),
597 .mx_sel (do_nor[3:0]),
598 .di_reg (do_inv[3:0]),
599 .wt_ena (do_mux[3:0]),
600 .rst ({reset,reset,reset,reset}),
601 .si (1'h0),
602 .se (1'h0),
603 .clk (cclk),
604 .do_nad (do_nad[3:0]),
605 .do_nor (do_nor[3:0]),
606 .do_inv (do_inv[3:0]),
607 .do_mux (do_mux[3:0]),
608 .do_q (do_q[3:0]),
609 .so (so)
610 );
611
612`endif
613
614
615endmodule