Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / verif / model / verilog / mem / fbdimm / design / nb_encode_crc.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: nb_encode_crc.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 ============================================
35module nb_encode_crc ( pn_shft_map_out , pn_bar_map_out ,
36 sn_in , sn_bar_in ,
37 rbuffer_rd_out , rbuffer_rd_data_in ,rbuffer_empty,
38 config_reg_rd,config_reg_data,
39 send_status_frm,sync_cmd,
40 chmon_pn_data,chmon_pn_status,
41 disable_state, frm_begin,frm_boundary,frm_boundary_sb,
42 nb_config, clk_int,
43 drc, fbds0,fbds1,fbds2,fbds3,fbdreg_mtr,
44 soft_channel_reset, send_alert_frame_in,
45 fbdreg_curr_cmd_to_data,fbdreg_curr_cmd_to_data_inc,
46 fbdreg_next_cmd_to_data,fbdreg_next_cmd_to_data_inc,
47 reset,dram_clk, ddrio_nbencode_rd,
48`ifdef AXIS_FBDIMM_NO_FSR
49`else
50 link_clk, link_clk_bar,
51`endif
52 init,dram_2x_clk,ref_clk,
53 pn0_out,pn1_out,pn2_out,pn3_out,pn4_out,pn5_out,pn6_out,
54 pn7_out,pn8_out,pn9_out,pn10_out,pn11_out,
55 serdes_data_rdy,sb_crc_error,electrical_idle);
56// Parameters
57parameter NB_LINK = 14;
58parameter DS = 0;
59
60
61// Inputs/Outputs
62output [NB_LINK-1:0] pn_shft_map_out,pn_bar_map_out; // primary southbound
63output [NB_LINK-1:0] pn0_out,pn1_out,pn2_out,pn3_out,pn4_out,pn5_out,pn6_out;
64output [NB_LINK-1:0] pn7_out,pn8_out,pn9_out,pn10_out,pn11_out;
65input [NB_LINK-1:0] sn_in,sn_bar_in; // secondary southbound
66input [71:0] rbuffer_rd_data_in;
67input [31:0] config_reg_data;
68input [23:0] sync_cmd;
69input [31:0] drc;
70input dram_2x_clk;
71input electrical_idle;
72output [7:0] fbds0,fbds1,fbds2,fbds3;
73input [7:0] fbdreg_mtr;
74input [3:0] nb_config;
75input [7:0] fbdreg_curr_cmd_to_data,fbdreg_curr_cmd_to_data_inc;
76input [7:0] fbdreg_next_cmd_to_data,fbdreg_next_cmd_to_data_inc;
77input soft_channel_reset;
78input frm_begin,frm_boundary,frm_boundary_sb;
79input ddrio_nbencode_rd;
80`ifdef AXIS_FBDIMM_NO_FSR
81`else
82input link_clk,link_clk_bar;
83`endif
84input dram_clk;
85
86output rbuffer_rd_out;
87output chmon_pn_data,chmon_pn_status;
88output serdes_data_rdy;
89input rbuffer_empty;
90input reset;
91input clk_int;
92input init; // =1 if initializing
93input config_reg_rd;
94input send_status_frm;
95input disable_state;
96input send_alert_frame_in;
97input ref_clk;
98input sb_crc_error;
99
100//internal registers
101wire [NB_LINK-1:0] pn0_idle_frame,pn1_idle_frame,pn2_idle_frame,pn3_idle_frame,pn4_idle_frame;
102wire [NB_LINK-1:0] pn5_idle_frame,pn6_idle_frame,pn7_idle_frame,pn9_idle_frame,pn8_idle_frame;
103wire [NB_LINK-1:0] pn10_idle_frame,pn11_idle_frame;
104wire [NB_LINK-1:0] pn_idle_frame,pn,pn_alert_frame;
105wire [NB_LINK-1:0] pn_shft_out;
106reg [NB_LINK-1:0] pn_data_reg;
107wire [NB_LINK-1:0] pn_read_data=pn_data_reg;
108wire [NB_LINK-1:0] pn_read_data_shft;
109reg [NB_LINK-1:0] pn0,pn1,pn2,pn3,pn4,pn5,pn6,pn7,pn8,pn9,pn10,pn11;
110reg [NB_LINK-1:0] pn_bus_read_data,pn_bus_status_data;
111wire [NB_LINK-1:0] pn_bus_alert_frame;
112wire [NB_LINK-1:0] pn_bus_alert_frame0,pn_bus_alert_frame1,pn_bus_alert_frame2,pn_bus_alert_frame3;
113wire [NB_LINK-1:0] pn_bus_alert_frame4,pn_bus_alert_frame5,pn_bus_alert_frame6,pn_bus_alert_frame7;
114wire [NB_LINK-1:0] pn_bus_alert_frame8,pn_bus_alert_frame9,pn_bus_alert_frame10,pn_bus_alert_frame11;
115reg [71:0] data_package [3:0];
116reg [71:0] Data1,Data2;
117reg [11:0] DataCRC1,DataCRC2;
118wire [71:0] B,B1;
119wire [11:0] E,E1;
120reg [11:0] E_d,E1_d;
121reg [71:0] CD,D;
122reg [13:0] pn0_reg,pn1_reg,pn2_reg,pn3_reg,pn4_reg,pn5_reg;
123reg [13:0] pn6_reg,pn7_reg,pn8_reg,pn9_reg,pn10_reg,pn11_reg;
124reg [13:0] pn0_reg_l,pn1_reg_l,pn2_reg_l,pn3_reg_l,pn4_reg_l,pn5_reg_l;
125reg [13:0] pn6_reg_l,pn7_reg_l,pn8_reg_l,pn9_reg_l,pn10_reg_l,pn11_reg_l;
126
127reg [13:0] pn0_reg_l_b,pn1_reg_l_b,pn2_reg_l_b,pn3_reg_l_b,pn4_reg_l_b,pn5_reg_l_b;
128reg [13:0] pn6_reg_l_b,pn7_reg_l_b,pn8_reg_l_b,pn9_reg_l_b,pn10_reg_l_b,pn11_reg_l_b;
129
130reg [13:0] pn0_dreg,pn1_dreg,pn2_dreg,pn3_dreg,pn4_dreg,pn5_dreg;
131reg [13:0] pn6_dreg,pn7_dreg,pn8_dreg,pn9_dreg,pn10_dreg,pn11_dreg;
132
133reg [13:0] pn0_d2reg,pn1_d2reg,pn2_d2reg,pn3_d2reg,pn4_d2reg,pn5_d2reg;
134reg [13:0] pn6_d2reg,pn7_d2reg,pn8_d2reg,pn9_d2reg,pn10_d2reg,pn11_d2reg;
135
136reg [13:0] pn0_dreg_d,pn1_dreg_d,pn2_dreg_d,pn3_dreg_d,pn4_dreg_d,pn5_dreg_d;
137reg [13:0] pn6_dreg_d,pn7_dreg_d,pn8_dreg_d,pn9_dreg_d,pn10_dreg_d,pn11_dreg_d;
138reg [4:0] status_reg0;
139reg [4:0] status_reg1;
140reg [4:0] status_reg2;
141reg [4:0] status_reg3;
142reg [4:0] status_reg4;
143reg [4:0] status_reg5;
144reg [4:0] status_reg6;
145reg [4:0] status_reg7;
146reg [7:0] fbds0_reg,fbds1_reg,fbds2_reg,fbds3_reg;
147reg [1:0] rbuffer_rd_cnt;
148reg [1:0] curr_state;
149reg [3:0] pn_curr_state,pn_next_state;
150wire config_reg_rd_shft_data;
151wire send_status_frm_shft;
152reg rbuffer_rd_reg;
153reg get_rfifo_data;
154reg send_reg_data;
155wire config_reg_rd_shft;
156reg send_status_frm_reg;
157reg data1_rdy, data2_rdy, data3_rdy;
158reg fbdimm0_set_status_alert_bit_always;
159reg fbdimm0_set_status_parity_bit_always;
160reg fbdimm1_set_status_alert_bit_always;
161reg fbdimm1_set_status_parity_bit_always;
162reg fbdimm2_set_status_alert_bit_always;
163reg fbdimm2_set_status_parity_bit_always;
164reg fbdimm3_set_status_alert_bit_always;
165reg fbdimm3_set_status_parity_bit_always;
166reg fbdimm4_set_status_alert_bit_always;
167reg fbdimm4_set_status_parity_bit_always;
168reg fbdimm5_set_status_alert_bit_always;
169reg fbdimm5_set_status_parity_bit_always;
170reg fbdimm6_set_status_alert_bit_always;
171reg fbdimm6_set_status_parity_bit_always;
172reg fbdimm7_set_status_alert_bit_always;
173reg fbdimm7_set_status_parity_bit_always;
174reg [1:0] fbdimm0_set_thermal_trip;
175reg [1:0] fbdimm1_set_thermal_trip;
176reg [1:0] fbdimm2_set_thermal_trip;
177reg [1:0] fbdimm3_set_thermal_trip;
178reg [1:0] fbdimm4_set_thermal_trip;
179reg [1:0] fbdimm5_set_thermal_trip;
180reg [1:0] fbdimm6_set_thermal_trip;
181reg [1:0] fbdimm7_set_thermal_trip;
182reg [9:0] fbdimm0_set_status_alert_bit,fbdimm0_set_status_parity_bit;
183reg [9:0] fbdimm1_set_status_alert_bit,fbdimm1_set_status_parity_bit;
184reg [9:0] fbdimm2_set_status_alert_bit,fbdimm2_set_status_parity_bit;
185reg [9:0] fbdimm3_set_status_alert_bit,fbdimm3_set_status_parity_bit;
186reg [9:0] fbdimm4_set_status_alert_bit,fbdimm4_set_status_parity_bit;
187reg [9:0] fbdimm5_set_status_alert_bit,fbdimm5_set_status_parity_bit;
188reg [9:0] fbdimm6_set_status_alert_bit,fbdimm6_set_status_parity_bit;
189reg [9:0] fbdimm7_set_status_alert_bit,fbdimm7_set_status_parity_bit;
190reg nb_12, failover_nb_13, failover_nb_14; //, nb_data_rdy;
191reg send_alert_frame_in_d,dummy;
192wire nb_data_rdy;
193reg pn_bus_alert, pn_bus_reg, pn_bus_read, pn_bus_status;
194wire [13:0] send_status_frm_d;
195reg status1_rdy,status2_rdy;
196wire fbdimm_fast_nb;
197wire nb_status_rdy = status1_rdy; // | status2_rdy ;
198
199
200`ifdef AXIS_FBDIMM_HW
201reg [7:0] LastAMB_ID;
202wire [7:0] Last_FBDimm_ID_REG = LastAMB_ID;
203`else
204reg [7:0] config_mem[0:24];
205wire [7:0] Last_FBDimm_ID_REG = config_mem[0];
206`endif
207
208
209
210// Assignments
211assign nb_data_rdy = data1_rdy | data2_rdy;
212assign chmon_pn_status = send_status_frm_reg;
213assign chmon_pn_data = rbuffer_rd_reg;
214assign fbds0 = fbds0_reg;
215assign fbds1 = fbds1_reg;
216assign fbds2 = fbds2_reg;
217assign fbds3 = fbds3_reg;
218assign serdes_data_rdy = nb_data_rdy | nb_status_rdy ;
219assign pn_bar_map_out = disable_state ? pn_shft_map_out : ~pn_shft_map_out;
220assign pn_shft_map_out = (( nb_config == 4'b1111 ) & ( DS==0)) ? pn_shft_out : // All lanes are good
221 (( nb_config == 4'b1101 ) & ( DS==0)) ? {1'b0,pn_shft_out[12:0]} : // map nb13
222 (( nb_config == 4'b1100 ) & ( DS==0)) ? {pn_shft_out[12] ,1'b0,pn_shft_out[11:0]} : // map nb12
223 (( nb_config == 4'b1011 ) & ( DS==0)) ? {pn_shft_out[12:11],1'b0,pn_shft_out[10:0]} : // map nb11
224 (( nb_config == 4'b1010 ) & ( DS==0)) ? {pn_shft_out[12:10],1'b0,pn_shft_out[09:0]} : // map nb10
225 (( nb_config == 4'b1001 ) & ( DS==0)) ? {pn_shft_out[12:09],1'b0,pn_shft_out[08:0]} : // map nb9
226 (( nb_config == 4'b1000 ) & ( DS==0)) ? {pn_shft_out[12:08],1'b0,pn_shft_out[07:0]} : // map nb8
227 (( nb_config == 4'b0111 ) & ( DS==0)) ? {pn_shft_out[12:07],1'b0,pn_shft_out[06:0]} : // map nb7
228 (( nb_config == 4'b0110 ) & ( DS==0)) ? {pn_shft_out[12:06],1'b0,pn_shft_out[05:0]} : // map nb6
229 (( nb_config == 4'b0101 ) & ( DS==0)) ? {pn_shft_out[12:05],1'b0,pn_shft_out[04:0]} : // map nb5
230 (( nb_config == 4'b0100 ) & ( DS==0)) ? {pn_shft_out[12:04],1'b0,pn_shft_out[03:0]} : // map nb4
231 (( nb_config == 4'b0011 ) & ( DS==0)) ? {pn_shft_out[12:03],1'b0,pn_shft_out[02:0]} : // map nb3
232 (( nb_config == 4'b0010 ) & ( DS==0)) ? {pn_shft_out[12:02],1'b0,pn_shft_out[01:0]} : // map nb2
233 (( nb_config == 4'b0001 ) & ( DS==0)) ? {pn_shft_out[12:01],1'b0,pn_shft_out[0] } : // map nb1
234 (( nb_config == 4'b0000 ) & ( DS==0)) ? {pn_shft_out[12:00],1'b0} : pn_shft_out; // map nb0
235
236
237
238assign pn[13] = ( pn_bus_alert ) ? pn_bus_alert_frame[13]:
239 ( pn_bus_read | pn_bus_reg ) ? pn_bus_read_data[13]:
240 ( pn_bus_status & ( DS == 0 ) & ( Last_FBDimm_ID_REG == 0 ) ) ? pn_bus_status_data[13]:
241 ( pn_bus_status & ( DS==Last_FBDimm_ID_REG) & (DS != 13)) ? 1'b0:
242 ( pn_bus_status ) ? pn_bus_status_data[13] :
243 ( DS==Last_FBDimm_ID_REG) ? pn_idle_frame[13]:
244 sn_in[13];
245
246assign pn[12] = ( pn_bus_alert ) ? pn_bus_alert_frame[12]:
247 ( pn_bus_read | pn_bus_reg ) ? pn_bus_read_data[12]:
248 ( pn_bus_status & ( DS == 0 ) & ( Last_FBDimm_ID_REG == 0 ) ) ? pn_bus_status_data[12]:
249 ( pn_bus_status & ( DS==Last_FBDimm_ID_REG) & (DS != 12)) ? 1'b0:
250 ( pn_bus_status ) ? pn_bus_status_data[12] :
251 ( DS==Last_FBDimm_ID_REG) ? pn_idle_frame[12]:
252 sn_in[12];
253
254assign pn[11] = ( pn_bus_alert ) ? pn_bus_alert_frame[11]:
255 ( pn_bus_read | pn_bus_reg ) ? pn_bus_read_data[11]:
256 ( pn_bus_status & ( DS == 0 ) & ( Last_FBDimm_ID_REG == 0 ) ) ? pn_bus_status_data[11]:
257 ( pn_bus_status & ( DS==Last_FBDimm_ID_REG) & (DS != 11)) ? 1'b0:
258 ( pn_bus_status ) ? pn_bus_status_data[11]:
259 ( DS==Last_FBDimm_ID_REG) ? pn_idle_frame[11]:
260 sn_in[11];
261
262assign pn[10] = ( pn_bus_alert ) ? pn_bus_alert_frame[10]:
263 ( pn_bus_read | pn_bus_reg ) ? pn_bus_read_data[10]:
264 ( pn_bus_status & ( DS == 0 ) & ( Last_FBDimm_ID_REG == 0 ) ) ? pn_bus_status_data[10]:
265 ( pn_bus_status & ( DS==Last_FBDimm_ID_REG) & (DS != 10)) ? 1'b0:
266 ( pn_bus_status ) ? pn_bus_status_data[10]:
267 ( DS==Last_FBDimm_ID_REG) ? pn_idle_frame[10]:
268 sn_in[10];
269
270assign pn[09] = ( pn_bus_alert ) ? pn_bus_alert_frame[09]:
271 ( pn_bus_read | pn_bus_reg ) ? pn_bus_read_data[09]:
272 ( pn_bus_status & ( DS == 0 ) & ( Last_FBDimm_ID_REG == 0 ) ) ? pn_bus_status_data[09]:
273 ( pn_bus_status & ( DS==Last_FBDimm_ID_REG) & (DS != 9)) ? 1'b0:
274 ( pn_bus_status ) ? pn_bus_status_data[09]:
275 ( DS==Last_FBDimm_ID_REG) ? pn_idle_frame[09]:
276 sn_in[09];
277
278assign pn[08] = ( pn_bus_alert ) ? pn_bus_alert_frame[08]:
279 ( pn_bus_read | pn_bus_reg ) ? pn_bus_read_data[08]:
280 ( pn_bus_status & ( DS == 0 ) & ( Last_FBDimm_ID_REG == 0 ) ) ? pn_bus_status_data[08]:
281 ( pn_bus_status & ( DS==Last_FBDimm_ID_REG) & (DS != 8)) ? 1'b0:
282 ( pn_bus_status ) ? pn_bus_status_data[08]:
283 ( DS==Last_FBDimm_ID_REG) ? pn_idle_frame[08]:
284 sn_in[08];
285
286assign pn[07] = ( pn_bus_alert ) ? pn_bus_alert_frame[07]:
287 ( pn_bus_read | pn_bus_reg ) ? pn_bus_read_data[07]:
288 ( pn_bus_status & ( DS == 0 ) & ( Last_FBDimm_ID_REG == 0 ) ) ? pn_bus_status_data[07]:
289 ( pn_bus_status & ( DS==Last_FBDimm_ID_REG) & (DS != 7)) ? 1'b0:
290 ( pn_bus_status ) ? pn_bus_status_data[07]:
291 ( DS==Last_FBDimm_ID_REG) ? pn_idle_frame[07]:
292 sn_in[07];
293
294assign pn[06] = ( pn_bus_alert ) ? pn_bus_alert_frame[06]:
295 ( pn_bus_read | pn_bus_reg ) ? pn_bus_read_data[06]:
296 ( pn_bus_status & ( DS == 0 ) & ( Last_FBDimm_ID_REG == 0 ) ) ? pn_bus_status_data[06]:
297 ( pn_bus_status & ( DS==Last_FBDimm_ID_REG) & (DS != 6)) ? 1'b0:
298 ( pn_bus_status ) ? pn_bus_status_data[06] :
299 ( DS==Last_FBDimm_ID_REG) ? pn_idle_frame[06]:
300 sn_in[06];
301
302assign pn[05] = ( pn_bus_alert ) ? pn_bus_alert_frame[05]:
303 ( pn_bus_read | pn_bus_reg ) ? pn_bus_read_data[05]:
304 ( pn_bus_status & ( DS == 0 ) & ( Last_FBDimm_ID_REG == 0 ) ) ? pn_bus_status_data[05]:
305 ( pn_bus_status & ( DS==Last_FBDimm_ID_REG) & (DS != 5)) ? 1'b0:
306 ( pn_bus_status ) ? pn_bus_status_data[05] :
307 ( DS==Last_FBDimm_ID_REG) ? pn_idle_frame[05]:
308 sn_in[05];
309
310
311assign pn[04] = ( pn_bus_alert ) ? pn_bus_alert_frame[04]:
312 ( pn_bus_read | pn_bus_reg ) ? pn_bus_read_data[04]:
313 ( pn_bus_status & ( DS == 0 ) & ( Last_FBDimm_ID_REG == 0 ) ) ? pn_bus_status_data[04]:
314 ( pn_bus_status & ( DS==Last_FBDimm_ID_REG) & (DS != 4)) ? 1'b0:
315 ( pn_bus_status ) ? pn_bus_status_data[04] :
316 ( DS==Last_FBDimm_ID_REG) ? pn_idle_frame[04]:
317 sn_in[04];
318
319
320assign pn[03] = ( pn_bus_alert ) ? pn_bus_alert_frame[03]:
321 ( pn_bus_read | pn_bus_reg ) ? pn_bus_read_data[03]:
322 ( pn_bus_status & ( DS == 0 ) & ( Last_FBDimm_ID_REG == 0 ) ) ? pn_bus_status_data[03]:
323 ( pn_bus_status & ( DS==Last_FBDimm_ID_REG) & (DS != 3)) ? 1'b0:
324 ( pn_bus_status ) ? pn_bus_status_data[03] :
325 ( DS==Last_FBDimm_ID_REG) ? pn_idle_frame[03]:
326 sn_in[03];
327
328
329assign pn[02] = ( pn_bus_alert ) ? pn_bus_alert_frame[02]:
330 ( pn_bus_read | pn_bus_reg ) ? pn_bus_read_data[02]:
331 ( pn_bus_status & ( DS == 0 ) & ( Last_FBDimm_ID_REG == 0 ) ) ? pn_bus_status_data[02]:
332 ( pn_bus_status & ( DS==Last_FBDimm_ID_REG) & (DS != 2)) ? 1'b0:
333 ( pn_bus_status ) ? pn_bus_status_data[02] :
334 ( DS==Last_FBDimm_ID_REG) ? pn_idle_frame[02]:
335 sn_in[02];
336
337assign pn[01] = ( pn_bus_alert ) ? pn_bus_alert_frame[01]:
338 ( pn_bus_read | pn_bus_reg ) ? pn_bus_read_data[01]:
339 ( pn_bus_status & ( DS == 0 ) & ( Last_FBDimm_ID_REG == 0 ) ) ? pn_bus_status_data[01]:
340 ( pn_bus_status & ( DS==Last_FBDimm_ID_REG) & (DS != 1)) ? 1'b0:
341 ( pn_bus_status ) ? pn_bus_status_data[01] :
342 ( DS==Last_FBDimm_ID_REG) ? pn_idle_frame[01]:
343 sn_in[01];
344
345
346assign pn[00] = ( pn_bus_alert ) ? pn_bus_alert_frame[00]:
347 ( pn_bus_read | pn_bus_reg ) ? pn_bus_read_data[00]:
348 ( pn_bus_status & ( DS == 0 ) & ( Last_FBDimm_ID_REG == 0 ) ) ? pn_bus_status_data[00]:
349 ( pn_bus_status & ( DS==Last_FBDimm_ID_REG) & (DS != 0)) ? 1'b0:
350 ( pn_bus_status ) ? pn_bus_status_data[00] :
351 ( DS==Last_FBDimm_ID_REG) ? pn_idle_frame[00]:
352 sn_in[00];
353
354
355
356
357
358
359
360
361
362assign rbuffer_rd_out = get_rfifo_data;
363
364`ifdef FBDIMM_FAST_NB
365// cem
366assign B1[11:0] = {rbuffer_rd_data_in[66],rbuffer_rd_data_in[60],rbuffer_rd_data_in[54],rbuffer_rd_data_in[48],rbuffer_rd_data_in[42],rbuffer_rd_data_in[36],rbuffer_rd_data_in[30],rbuffer_rd_data_in[24],rbuffer_rd_data_in[18],rbuffer_rd_data_in[12],rbuffer_rd_data_in[06],rbuffer_rd_data_in[00]};
367assign B1[23:12] = {rbuffer_rd_data_in[01],rbuffer_rd_data_in[07],rbuffer_rd_data_in[13],rbuffer_rd_data_in[19],rbuffer_rd_data_in[25],rbuffer_rd_data_in[31],rbuffer_rd_data_in[37],rbuffer_rd_data_in[43],rbuffer_rd_data_in[49],rbuffer_rd_data_in[55],rbuffer_rd_data_in[61],rbuffer_rd_data_in[67]};
368assign B1[35:24] = {rbuffer_rd_data_in[68],rbuffer_rd_data_in[62],rbuffer_rd_data_in[56],rbuffer_rd_data_in[50],rbuffer_rd_data_in[44],rbuffer_rd_data_in[38],rbuffer_rd_data_in[32],rbuffer_rd_data_in[26],rbuffer_rd_data_in[20],rbuffer_rd_data_in[14],rbuffer_rd_data_in[08],rbuffer_rd_data_in[02]};
369assign B1[47:36] = {rbuffer_rd_data_in[03],rbuffer_rd_data_in[09],rbuffer_rd_data_in[15],rbuffer_rd_data_in[21],rbuffer_rd_data_in[27],rbuffer_rd_data_in[33],rbuffer_rd_data_in[39],rbuffer_rd_data_in[45],rbuffer_rd_data_in[51],rbuffer_rd_data_in[57],rbuffer_rd_data_in[63],rbuffer_rd_data_in[69]};
370assign B1[59:48] = {rbuffer_rd_data_in[70],rbuffer_rd_data_in[64],rbuffer_rd_data_in[58],rbuffer_rd_data_in[52],rbuffer_rd_data_in[46],rbuffer_rd_data_in[40],rbuffer_rd_data_in[34],rbuffer_rd_data_in[28],rbuffer_rd_data_in[22],rbuffer_rd_data_in[16],rbuffer_rd_data_in[10],rbuffer_rd_data_in[04]};
371assign B1[71:60] = {rbuffer_rd_data_in[05],rbuffer_rd_data_in[11],rbuffer_rd_data_in[17],rbuffer_rd_data_in[23],rbuffer_rd_data_in[29],rbuffer_rd_data_in[35],rbuffer_rd_data_in[41],rbuffer_rd_data_in[47],rbuffer_rd_data_in[53],rbuffer_rd_data_in[59],rbuffer_rd_data_in[65],rbuffer_rd_data_in[71]};
372
373`endif
374
375assign B[11:0] = {D[66],D[60],D[54],D[48],D[42],D[36],D[30],D[24],D[18],D[12],D[06],D[00]};
376assign B[23:12] = {D[01],D[07],D[13],D[19],D[25],D[31],D[37],D[43],D[49],D[55],D[61],D[67]};
377assign B[35:24] = {D[68],D[62],D[56],D[50],D[44],D[38],D[32],D[26],D[20],D[14],D[08],D[02]};
378assign B[47:36] = {D[03],D[09],D[15],D[21],D[27],D[33],D[39],D[45],D[51],D[57],D[63],D[69]};
379assign B[59:48] = {D[70],D[64],D[58],D[52],D[46],D[40],D[34],D[28],D[22],D[16],D[10],D[04]};
380assign B[71:60] = {D[05],D[11],D[17],D[23],D[29],D[35],D[41],D[47],D[53],D[59],D[65],D[71]};
381
382
383
384always@(posedge frm_boundary_sb)
385 send_alert_frame_in_d<=send_alert_frame_in;
386
387`ifdef AXIS_FBDIMM_NO_FSR
388
389initial begin
390 pn_bus_alert = 0;
391 pn_bus_status_data = 0;
392 pn_bus_reg = 0;
393end
394
395`else
396always@(posedge link_clk)
397begin
398
399 pn_bus_read <= rbuffer_rd_reg;
400 pn_bus_read_data <= pn_read_data;
401 pn_bus_status <= send_status_frm_reg;
402 pn_bus_alert <= send_alert_frame_in_d;
403 pn_bus_status_data <= pn_read_data;
404 pn_bus_reg <= send_reg_data;
405
406end
407`endif
408
409
410// Initialization
411initial begin
412`ifdef AXIS_FBDIMM_HW
413 if ($test$plusargs("1_FBDIMM"))
414 LastAMB_ID=0;
415 else if ($test$plusargs("2_FBDIMMS"))
416 LastAMB_ID=1;
417 else if ($test$plusargs("3_FBDIMMS"))
418 LastAMB_ID=2;
419 else if ($test$plusargs("4_FBDIMMS"))
420 LastAMB_ID=3;
421 else if ($test$plusargs("5_FBDIMMS"))
422 LastAMB_ID=4;
423 else if ($test$plusargs("6_FBDIMMS"))
424 LastAMB_ID=5;
425 else if ($test$plusargs("7_FBDIMMS"))
426 LastAMB_ID=6;
427 else if ($test$plusargs("8_FBDIMMS"))
428 LastAMB_ID=7;
429 else
430 LastAMB_ID=0;
431
432`endif
433
434`ifdef AXIS_FBDIMM_HW
435`else
436 if ( $test$plusargs("fbdimm_dbg"))
437 $ch_dispmon("nb_enc",`DBG_0,1);
438
439 if ( $test$plusargs("fbdimm_dbg_1"))
440 $ch_dispmon("nb_enc",`DBG_1,1);
441
442 if ( $test$plusargs("fbdimm_dbg_2"))
443 $ch_dispmon("nb_enc",`DBG_2,1);
444
445 if ( $test$plusargs("fbdimm_dbg_3"))
446 $ch_dispmon("nb_enc",`DBG_3,1);
447
448 if ( $test$plusargs("fbdimm_dbg_4"))
449 $ch_dispmon("nb_enc",`DBG_4,1);
450
451`endif
452 curr_state = `NB_ST_1;
453 pn_next_state = `NB_ST_1;
454 pn_data_reg=0;
455 CD=0;
456 get_rfifo_data=0;
457
458// thermal trip arguments
459fbdimm0_set_thermal_trip = 2'h0;
460fbdimm1_set_thermal_trip = 2'h0;
461fbdimm2_set_thermal_trip = 2'h0;
462fbdimm3_set_thermal_trip = 2'h0;
463fbdimm4_set_thermal_trip = 2'h0;
464fbdimm5_set_thermal_trip = 2'h0;
465fbdimm6_set_thermal_trip = 2'h0;
466fbdimm7_set_thermal_trip = 2'h0;
467
468// Plusargs for AMB0
469fbdimm0_set_status_alert_bit = 0;
470fbdimm0_set_status_parity_bit = 0;
471fbdimm1_set_status_alert_bit = 0;
472fbdimm1_set_status_parity_bit = 0;
473fbdimm2_set_status_alert_bit = 0;
474fbdimm2_set_status_parity_bit = 0;
475fbdimm3_set_status_alert_bit = 0;
476fbdimm3_set_status_parity_bit = 0;
477fbdimm4_set_status_alert_bit = 0;
478fbdimm4_set_status_parity_bit = 0;
479fbdimm5_set_status_alert_bit = 0;
480fbdimm5_set_status_parity_bit = 0;
481fbdimm6_set_status_alert_bit = 0;
482fbdimm6_set_status_parity_bit = 0;
483fbdimm7_set_status_alert_bit = 0;
484fbdimm7_set_status_parity_bit = 0;
485
486`ifdef AXIS_FBDIMM_HW
487`else
488
489 // default is 1 AMB device
490 config_mem[0]=0;
491
492
493if ($test$plusargs("1_FBDIMM"))
494 config_mem[0]=0;
495else if ($test$plusargs("2_FBDIMMS"))
496 config_mem[0]=1;
497else if ($test$plusargs("3_FBDIMMS"))
498 config_mem[0]=2;
499else if ($test$plusargs("4_FBDIMMS"))
500 config_mem[0]=3;
501else if ($test$plusargs("5_FBDIMMS"))
502 config_mem[0]=4;
503else if ($test$plusargs("6_FBDIMMS"))
504 config_mem[0]=5;
505else if ($test$plusargs("7_FBDIMMS"))
506 config_mem[0]=6;
507else if ($test$plusargs("8_FBDIMMS"))
508 config_mem[0]=7;
509else
510 config_mem[0]=0;
511
512
513dummy=$value$plusargs("fbdimm0_set_thermal_trip=%h",fbdimm0_set_thermal_trip);
514dummy=$value$plusargs("fbdimm1_set_thermal_trip=%h",fbdimm1_set_thermal_trip);
515dummy=$value$plusargs("fbdimm2_set_thermal_trip=%h",fbdimm2_set_thermal_trip);
516dummy=$value$plusargs("fbdimm3_set_thermal_trip=%h",fbdimm3_set_thermal_trip);
517dummy=$value$plusargs("fbdimm4_set_thermal_trip=%h",fbdimm4_set_thermal_trip);
518dummy=$value$plusargs("fbdimm5_set_thermal_trip=%h",fbdimm5_set_thermal_trip);
519dummy=$value$plusargs("fbdimm6_set_thermal_trip=%h",fbdimm6_set_thermal_trip);
520dummy=$value$plusargs("fbdimm7_set_thermal_trip=%h",fbdimm7_set_thermal_trip);
521
522
523dummy=$value$plusargs("fbdimm0_set_status_alert_bit=%h",fbdimm0_set_status_alert_bit);
524dummy=$value$plusargs("fbdimm0_set_status_parity_bit=%h",fbdimm0_set_status_parity_bit);
525dummy=$value$plusargs("fbdimm1_set_status_alert_bit=%h",fbdimm1_set_status_alert_bit);
526dummy=$value$plusargs("fbdimm1_set_status_parity_bit=%h",fbdimm1_set_status_parity_bit);
527dummy=$value$plusargs("fbdimm2_set_status_alert_bit=%h",fbdimm2_set_status_alert_bit);
528dummy=$value$plusargs("fbdimm2_set_status_parity_bit=%h",fbdimm2_set_status_parity_bit);
529dummy=$value$plusargs("fbdimm3_set_status_alert_bit=%h",fbdimm3_set_status_alert_bit);
530dummy=$value$plusargs("fbdimm3_set_status_parity_bit=%h",fbdimm3_set_status_parity_bit);
531dummy=$value$plusargs("fbdimm4_set_status_alert_bit=%h",fbdimm4_set_status_alert_bit);
532dummy=$value$plusargs("fbdimm4_set_status_parity_bit=%h",fbdimm4_set_status_parity_bit);
533dummy=$value$plusargs("fbdimm5_set_status_alert_bit=%h",fbdimm5_set_status_alert_bit);
534dummy=$value$plusargs("fbdimm5_set_status_parity_bit=%h",fbdimm5_set_status_parity_bit);
535dummy=$value$plusargs("fbdimm6_set_status_alert_bit=%h",fbdimm6_set_status_alert_bit);
536dummy=$value$plusargs("fbdimm6_set_status_parity_bit=%h",fbdimm6_set_status_parity_bit);
537dummy=$value$plusargs("fbdimm7_set_status_alert_bit=%h",fbdimm7_set_status_alert_bit);
538dummy=$value$plusargs("fbdimm7_set_status_parity_bit=%h",fbdimm7_set_status_parity_bit);
539
540// amb0
541if ($test$plusargs("fbdimm0_set_status_alert_bit_always"))
542 fbdimm0_set_status_alert_bit_always = 1'b1;
543else
544 fbdimm0_set_status_alert_bit_always = 1'b0;
545
546if ($test$plusargs("fbdimm0_set_status_parity_bit_always"))
547 fbdimm0_set_status_parity_bit_always = 1'b1;
548else
549 fbdimm0_set_status_parity_bit_always = 1'b0;
550
551//amb1
552if ($test$plusargs("fbdimm1_set_status_alert_bit_always"))
553 fbdimm1_set_status_alert_bit_always = 1'b1;
554else
555 fbdimm1_set_status_alert_bit_always = 1'b0;
556
557if ($test$plusargs("fbdimm1_set_status_parity_bit_always"))
558 fbdimm1_set_status_parity_bit_always = 1'b1;
559else
560 fbdimm1_set_status_parity_bit_always = 1'b0;
561
562//amb2
563if ($test$plusargs("fbdimm2_set_status_alert_bit_always"))
564 fbdimm2_set_status_alert_bit_always = 1'b1;
565else
566 fbdimm2_set_status_alert_bit_always = 1'b0;
567
568if ($test$plusargs("fbdimm2_set_status_parity_bit_always"))
569 fbdimm2_set_status_parity_bit_always = 1'b1;
570else
571 fbdimm2_set_status_parity_bit_always = 1'b0;
572
573//amb3
574if ($test$plusargs("fbdimm3_set_status_alert_bit_always"))
575 fbdimm3_set_status_alert_bit_always = 1'b1;
576else
577 fbdimm3_set_status_alert_bit_always = 1'b0;
578
579if ($test$plusargs("fbdimm3_set_status_parity_bit_always"))
580 fbdimm3_set_status_parity_bit_always = 1'b1;
581else
582 fbdimm3_set_status_parity_bit_always = 1'b0;
583
584//amb4
585if ($test$plusargs("fbdimm4_set_status_alert_bit_always"))
586 fbdimm4_set_status_alert_bit_always = 1'b1;
587else
588 fbdimm4_set_status_alert_bit_always = 1'b0;
589
590if ($test$plusargs("fbdimm4_set_status_parity_bit_always"))
591 fbdimm4_set_status_parity_bit_always = 1'b1;
592else
593 fbdimm4_set_status_parity_bit_always = 1'b0;
594
595//amb5
596if ($test$plusargs("fbdimm5_set_status_alert_bit_always"))
597 fbdimm5_set_status_alert_bit_always = 1'b1;
598else
599 fbdimm5_set_status_alert_bit_always = 1'b0;
600
601if ($test$plusargs("fbdimm5_set_status_parity_bit_always"))
602 fbdimm5_set_status_parity_bit_always = 1'b1;
603else
604 fbdimm5_set_status_parity_bit_always = 1'b0;
605
606//amb6
607if ($test$plusargs("fbdimm6_set_status_alert_bit_always"))
608 fbdimm6_set_status_alert_bit_always = 1'b1;
609else
610 fbdimm6_set_status_alert_bit_always = 1'b0;
611
612if ($test$plusargs("fbdimm6_set_status_parity_bit_always"))
613 fbdimm6_set_status_parity_bit_always = 1'b1;
614else
615 fbdimm6_set_status_parity_bit_always = 1'b0;
616
617//amb7
618if ($test$plusargs("fbdimm7_set_status_alert_bit_always"))
619 fbdimm7_set_status_alert_bit_always = 1'b1;
620else
621 fbdimm7_set_status_alert_bit_always = 1'b0;
622
623if ($test$plusargs("fbdimm7_set_status_parity_bit_always"))
624 fbdimm7_set_status_parity_bit_always = 1'b1;
625else
626 fbdimm7_set_status_parity_bit_always = 1'b0;
627
628
629
630`endif
631
632// dont read the file any more $readmemb("fbdimm.config",config_mem);
633
634if($test$plusargs("fbdimm_nb_failover_14bit"))
635 failover_nb_14=1;
636else
637 failover_nb_14=0;
638
639if($test$plusargs("fbdimm_nb_failover_13bit"))
640 failover_nb_13=1;
641else
642 failover_nb_13=0;
643
644
645if($test$plusargs("fbdimm_nb_12bit"))
646 nb_12=1;
647else
648 nb_12=0;
649
650pn_bus_read = 0;
651pn_bus_read_data = 0;
652pn_bus_status=0;
653send_status_frm_reg=0;
654pn0_reg=0;
655pn1_reg=0;
656pn2_reg=0;
657pn3_reg=0;
658pn4_reg=0;
659pn5_reg=0;
660pn6_reg=0;
661pn7_reg=0;
662pn8_reg=0;
663pn9_reg=0;
664pn10_reg=0;
665pn11_reg=0;
666
667end
668
669// nb bus display
670`ifdef AXIS_FBDIMM_NO_FSR
671always@(posedge clk_int)
672`else
673always@(posedge link_clk)
674`endif
675begin
676`ifdef AXIS_FBDIMM_HW
677`else
678 if ( rbuffer_rd_reg )
679 `PR_ALWAYS ("nb_enc",`DBG_0,"%d: FBDIMM: NB_BUS DATA %h nb_bus %h -> E=%h\n",$time,CD, pn_read_data,E);
680`endif
681
682if ( send_status_frm) begin
683`ifdef AXIS_FBDIMM_HW
684`else
685 `PR_ALWAYS ("nb_enc",`DBG_0,"%d: FBDIMM: NB_BUS SYNC %h\n",$time,sync_cmd);
686`endif
687 case (sync_cmd[1:0])
688 2'b00: fbds0_reg=status_reg0;
689 2'b01: fbds1_reg=status_reg0;
690 2'b10: fbds2_reg=status_reg0;
691 2'b11: fbds3_reg=status_reg0;
692 endcase
693
694 end
695`ifdef AXIS_FBDIMM_HW
696`else
697if ( send_status_frm_reg )
698 `PR_ALWAYS ("nb_enc",`DBG_0,"%d: FBDIMM: NB_BUS STATUS FRAME %h\n",$time,pn);
699`endif
700
701end
702
703
704wire capture_data = frm_begin; //~(rbuffer_rd_out | rbuffer_empty ) | ;
705
706
707initial begin
708data1_rdy=0;
709data2_rdy=0;
710status1_rdy=0;
711status2_rdy=0;
712end
713
714
715`ifdef FBDIMM_FAST_NB
716
717reg ddrio_nbencode_rd_d1;
718reg ddrio_nbencode_rd_d2;
719reg ddrio_nbencode_rd_d3;
720reg ddrio_nbencode_rd_d4;
721reg ddrio_nbencode_rd_d5;
722reg ddrio_nbencode_rd_d6;
723reg ddrio_nbencode_rd_d7;
724reg ddrio_nbencode_rd_d8;
725reg ddrio_nbencode_rd_d9;
726reg ddrio_nbencode_rd_d10;
727reg ddrio_nbencode_rd_d11;
728reg ddrio_nbencode_rd_d12;
729reg ddrio_nbencode_rd_d13;
730wire ddrio_nbencode_rd_d18;
731reg ddrio_nbencode_rd_d19;
732reg ddrio_nbencode_rd_d20;
733reg ddrio_nbencode_rd_d21;
734reg ddrio_nbencode_rd_d22;
735
736shifter_p #(1) delay_ddrio ( .signal_in ( ddrio_nbencode_rd ),
737 .signal_out ( ddrio_nbencode_rd_d18 ),
738 .delay_cycles ( 10'd18 ),
739 .clk ( dram_2x_clk));
740
741
742always@(posedge dram_2x_clk )
743begin
744 ddrio_nbencode_rd_d19 <= ddrio_nbencode_rd_d18;
745 ddrio_nbencode_rd_d20 <= ddrio_nbencode_rd_d19;
746 ddrio_nbencode_rd_d21 <= ddrio_nbencode_rd_d20;
747 ddrio_nbencode_rd_d22 <= ddrio_nbencode_rd_d21;
748
749end
750
751reg ddrio_nbencode_rd_a;
752
753always@(posedge frm_boundary_sb )
754begin
755
756 ddrio_nbencode_rd_d1 <= ddrio_nbencode_rd;
757
758 ddrio_nbencode_rd_a <= ddrio_nbencode_rd_d1;
759 ddrio_nbencode_rd_d2 <= ddrio_nbencode_rd_a;
760
761 ddrio_nbencode_rd_d3 <= ddrio_nbencode_rd_d2;
762 ddrio_nbencode_rd_d4 <= ddrio_nbencode_rd_d3;
763 ddrio_nbencode_rd_d5 <= ddrio_nbencode_rd_d4;
764 ddrio_nbencode_rd_d6 <= ddrio_nbencode_rd_d5;
765 ddrio_nbencode_rd_d7 <= ddrio_nbencode_rd_d6;
766 ddrio_nbencode_rd_d8 <= ddrio_nbencode_rd_d7;
767 ddrio_nbencode_rd_d9 <= ddrio_nbencode_rd_d8;
768 ddrio_nbencode_rd_d10 <= ddrio_nbencode_rd_d9;
769 ddrio_nbencode_rd_d11 <= ddrio_nbencode_rd_d10;
770 ddrio_nbencode_rd_d12 <= ddrio_nbencode_rd_d11;
771 ddrio_nbencode_rd_d13 <= ddrio_nbencode_rd_d12;
772
773end
774
775always@(negedge capture_data)
776 if ( nb_12 ) // we need to get rid off, ECC from DRAMs
777 D <= { 8'h0, rbuffer_rd_data_in[63:0] };
778 else if ( config_reg_rd_shft_data )
779 D <= config_reg_data;
780 else
781 D <= rbuffer_rd_data_in;
782
783
784/*
785always@(posedge frm_boundary )
786begin
787end
788*/
789
790always@(negedge frm_begin )
791begin
792 E1_d <= E1;
793 E_d <= E;
794end
795
796//assign DataCRC1 = E1;
797//assign DataCRC2 = E1;
798
799initial pn_curr_state=1;
800
801always@(negedge dram_2x_clk )
802begin
803
804 case( pn_curr_state )
805 `NB_ST_1: begin
806
807 pn0_reg[13:0] <= 6'h0;
808
809 // Set ALERT bit all the time
810 pn1_reg[13:0] <= {6'h0,fbdimm7_set_thermal_trip[0],fbdimm6_set_thermal_trip[0],fbdimm5_set_thermal_trip[0],fbdimm4_set_thermal_trip[0],fbdimm3_set_thermal_trip[0],fbdimm2_set_thermal_trip[0],fbdimm1_set_thermal_trip[0],fbdimm0_set_thermal_trip[0]};
811 pn2_reg[13:0] <= {6'h0,fbdimm7_set_thermal_trip[1],fbdimm6_set_thermal_trip[1],fbdimm5_set_thermal_trip[1],fbdimm4_set_thermal_trip[1],fbdimm3_set_thermal_trip[1],fbdimm2_set_thermal_trip[1],fbdimm1_set_thermal_trip[1],fbdimm0_set_thermal_trip[1]};
812 pn3_reg[13:0] <= 14'h0;
813 pn4_reg[13:0] <= 14'h3fff;
814
815
816 // Set STATUS bit all the time
817 pn5_reg[13:0] <= 14'h1555;
818 pn6_reg[13:0] <= 14'h2aaa;
819 pn7_reg[13:0] <= 14'h1555;
820 pn8_reg[13:0] <= 14'h2aaa;
821 pn9_reg[13:0] <= 14'h1555;
822 pn10_reg[13:0] <= 14'h2aaa;
823 pn11_reg[13:0] <= 14'h1555;
824
825
826 if ( ~rbuffer_empty ) begin
827 get_rfifo_data <=1'b1;
828 Data1 <= rbuffer_rd_data_in;
829 DataCRC1 <= E1;
830 pn_curr_state <= `NB_ST_2;
831 end else begin
832 data1_rdy <= 0;
833 data2_rdy <= 0;
834 end
835
836 end
837 `NB_ST_2: begin
838 pn0_reg[13:0] <= {DataCRC1[0],DataCRC1[11],Data1[66],Data1[60],Data1[54],Data1[48],Data1[42],Data1[36],Data1[30],Data1[24],Data1[18],Data1[12],Data1[6],Data1[0]};
839 pn1_reg[13:0] <= {DataCRC1[1],DataCRC1[10],Data1[67],Data1[61],Data1[55],Data1[49],Data1[43],Data1[37],Data1[31],Data1[25],Data1[19],Data1[13],Data1[7],Data1[1]};
840 pn2_reg[13:0] <= {DataCRC1[2],DataCRC1[9],Data1[68],Data1[62],Data1[56],Data1[50],Data1[44],Data1[38],Data1[32],Data1[26],Data1[20],Data1[14],Data1[8],Data1[2]};
841 pn3_reg[13:0] <= {DataCRC1[3],DataCRC1[8],Data1[69],Data1[63],Data1[57],Data1[51],Data1[45],Data1[39],Data1[33],Data1[27],Data1[21],Data1[15],Data1[9],Data1[3]};
842 pn4_reg[13:0] <= {DataCRC1[4],DataCRC1[7],Data1[70],Data1[64],Data1[58],Data1[52],Data1[46],Data1[40],Data1[34],Data1[28],Data1[22],Data1[16],Data1[10],Data1[4]};
843 pn5_reg[13:0] <= {DataCRC1[5],DataCRC1[6],Data1[71],Data1[65],Data1[59],Data1[53],Data1[47],Data1[41],Data1[35],Data1[29],Data1[23],Data1[17],Data1[11],Data1[5]};
844 //data1_rdy <= 1;
845 Data2 <= rbuffer_rd_data_in;
846 DataCRC2 <= E1;
847 pn_curr_state <= `NB_ST_3;
848 end
849 `NB_ST_3: begin
850 pn6_reg[13:0] <= {DataCRC2[0],DataCRC2[11],Data2[66],Data2[60],Data2[54],Data2[48],Data2[42],Data2[36],Data2[30],Data2[24],Data2[18],Data2[12],Data2[6],Data2[0]};
851 pn7_reg[13:0] <= {DataCRC2[1],DataCRC2[10],Data2[67],Data2[61],Data2[55],Data2[49],Data2[43],Data2[37],Data2[31],Data2[25],Data2[19],Data2[13],Data2[7],Data2[1]};
852 pn8_reg[13:0] <= {DataCRC2[2],DataCRC2[9],Data2[68],Data2[62],Data2[56],Data2[50],Data2[44],Data2[38],Data2[32],Data2[26],Data2[20],Data2[14],Data2[8],Data2[2]};
853 pn9_reg[13:0] <= {DataCRC2[3],DataCRC2[8],Data2[69],Data2[63],Data2[57],Data2[51],Data2[45],Data2[39],Data2[33],Data2[27],Data2[21],Data2[15],Data2[9],Data2[3]};
854 pn10_reg[13:0] <= {DataCRC2[4],DataCRC2[7],Data2[70],Data2[64],Data2[58],Data2[52],Data2[46],Data2[40],Data2[34],Data2[28],Data2[22],Data2[16],Data2[10],Data2[4]};
855 pn11_reg[13:0] <= {DataCRC2[5],DataCRC2[6],Data2[71],Data2[65],Data2[59],Data2[53],Data2[47],Data2[41],Data2[35],Data2[29],Data2[23],Data2[17],Data2[11],Data2[5]};
856
857
858 if ( ~rbuffer_empty ) begin
859 get_rfifo_data <=1'b1;
860 Data1 <= rbuffer_rd_data_in;
861 DataCRC1 <= E1;
862 pn_curr_state <= `NB_ST_2;
863 data1_rdy <= 1;
864 end else begin
865 pn_curr_state <= `NB_ST_4;
866 data1_rdy <= 1;
867 get_rfifo_data <=1'b0;
868 end
869
870 end
871 `NB_ST_4: begin
872
873 pn_curr_state <= `NB_ST_1;
874 data1_rdy <= 0;
875
876 end
877
878
879 endcase
880
881end
882
883
884
885
886always@(posedge frm_boundary_sb )
887begin
888 if ( (send_status_frm_shft & (DS==0)) & !status1_rdy )
889 begin
890 status1_rdy <= 1;
891 status2_rdy <= 0;
892 end
893 else if ( status1_rdy )
894 begin
895 status1_rdy <= 0;
896 status2_rdy <= 1;
897 end
898 else begin
899 status1_rdy <= 0;
900 status2_rdy <= 0;
901 end
902
903
904end
905
906
907reg data_rdy;
908reg nb_data_rdy_d ;
909
910
911always@(posedge frm_boundary_sb )
912begin
913 nb_data_rdy_d <= data1_rdy;
914 pn0_reg_l <= pn0_reg;
915 pn1_reg_l <= pn1_reg;
916 pn2_reg_l <= pn2_reg;
917 pn3_reg_l <= pn3_reg;
918 pn4_reg_l <= pn4_reg;
919 pn5_reg_l <= pn5_reg;
920 pn6_reg_l <= pn6_reg;
921 pn7_reg_l <= pn7_reg;
922 pn8_reg_l <= pn8_reg;
923 pn9_reg_l <= pn9_reg;
924 pn10_reg_l <= pn10_reg;
925 pn11_reg_l <= pn11_reg;
926
927end
928
929
930
931
932//wire nb_status_rdy_d = nb_status_rdy;
933reg nb_status_rdy_d;
934
935always@(posedge frm_boundary_sb)
936 nb_status_rdy_d<= nb_status_rdy;
937
938assign pn0_out = ( nb_data_rdy_d | nb_status_rdy_d ) ? pn0_reg_l :
939 ( pn_bus_alert ) ? ~pn0_idle_frame:
940 //( DS==Last_FBDimm_ID_REG ) ? pn0_idle_frame :
941 ( DS==0 ) ? pn0_idle_frame :
942 sn_in;
943assign pn1_out =
944 ( nb_data_rdy_d | nb_status_rdy_d ) ? pn1_reg_l :
945 ( pn_bus_alert ) ? ~pn1_idle_frame:
946 //( DS==Last_FBDimm_ID_REG ) ? pn1_idle_frame :
947 ( DS==0 ) ? pn1_idle_frame :
948 sn_in;
949assign pn2_out =
950 ( nb_data_rdy_d | nb_status_rdy_d ) ? pn2_reg_l :
951 ( pn_bus_alert ) ? ~pn2_idle_frame:
952 //( DS==Last_FBDimm_ID_REG ) ? pn2_idle_frame :
953 ( DS==0 ) ? pn2_idle_frame :
954 sn_in;
955assign pn3_out =
956 ( nb_data_rdy_d | nb_status_rdy_d ) ? pn3_reg_l :
957 ( pn_bus_alert ) ? ~pn3_idle_frame:
958 //( DS==Last_FBDimm_ID_REG ) ? pn3_idle_frame :
959 ( DS==0 ) ? pn3_idle_frame :
960 sn_in;
961assign pn4_out =
962 ( nb_data_rdy_d | nb_status_rdy_d ) ? pn4_reg_l :
963 ( pn_bus_alert ) ? ~pn4_idle_frame:
964 //( DS==Last_FBDimm_ID_REG ) ? pn4_idle_frame :
965 ( DS==0 ) ? pn4_idle_frame :
966 sn_in;
967assign pn5_out =
968 ( nb_data_rdy_d | nb_status_rdy_d ) ? pn5_reg_l :
969 ( pn_bus_alert ) ? ~pn5_idle_frame:
970 //( DS==Last_FBDimm_ID_REG) ? pn5_idle_frame :
971 ( DS==0) ? pn5_idle_frame :
972 sn_in;
973assign pn6_out =
974 ( nb_data_rdy_d | nb_status_rdy_d ) ? pn6_reg_l :
975 ( pn_bus_alert ) ? ~pn6_idle_frame:
976 //( DS==Last_FBDimm_ID_REG) ? pn6_idle_frame :
977 ( DS==0) ? pn6_idle_frame :
978 sn_in;
979assign pn7_out =
980 ( nb_data_rdy_d | nb_status_rdy_d ) ? pn7_reg_l :
981 ( pn_bus_alert ) ? ~pn7_idle_frame:
982 //( DS==Last_FBDimm_ID_REG ) ? pn7_idle_frame :
983 ( DS==0 ) ? pn7_idle_frame :
984 sn_in;
985assign pn8_out =
986 ( nb_data_rdy_d | nb_status_rdy_d ) ? pn8_reg_l :
987 ( pn_bus_alert ) ? ~pn8_idle_frame:
988 //( DS==Last_FBDimm_ID_REG) ? pn8_idle_frame :
989 ( DS==0) ? pn8_idle_frame :
990 sn_in;
991assign pn9_out =
992 ( nb_data_rdy_d | nb_status_rdy_d )? pn9_reg_l :
993 ( pn_bus_alert ) ? ~pn9_idle_frame:
994 //( DS==Last_FBDimm_ID_REG) ? pn9_idle_frame :
995 ( DS==0) ? pn9_idle_frame :
996 sn_in;
997assign pn10_out =
998 ( nb_data_rdy_d | nb_status_rdy_d ) ? pn10_reg_l :
999 ( pn_bus_alert ) ? ~pn10_idle_frame:
1000 //( DS==Last_FBDimm_ID_REG) ? pn10_idle_frame :
1001 ( DS==0) ? pn10_idle_frame :
1002 sn_in;
1003assign pn11_out =
1004 ( nb_data_rdy_d | nb_status_rdy_d ) ? pn11_reg_l :
1005 ( pn_bus_alert ) ? ~pn11_idle_frame:
1006 //( DS==Last_FBDimm_ID_REG) ? pn11_idle_frame :
1007 ( DS==0) ? pn11_idle_frame :
1008 sn_in;
1009
1010`else
1011
1012assign pn0_out = 14'h0;
1013assign pn1_out = 14'h0;
1014assign pn2_out = 14'h0;
1015assign pn3_out = 14'h0;
1016assign pn4_out = 14'h0;
1017assign pn5_out = 14'h0;
1018assign pn6_out = 14'h0;
1019assign pn7_out = 14'h0;
1020assign pn8_out = 14'h0;
1021assign pn9_out = 14'h0;
1022assign pn10_out = 14'h0;
1023assign pn11_out = 14'h0;
1024
1025always@(posedge link_clk)
1026 pn_curr_state <= pn_next_state;
1027
1028always@(posedge capture_data)
1029 if ( nb_12 ) // we need to get rid off, ECC from DRAMs
1030 D <= { 8'h0, rbuffer_rd_data_in[63:0] };
1031 else if ( config_reg_rd_shft_data )
1032 D <= config_reg_data;
1033 else
1034 D <= rbuffer_rd_data_in;
1035
1036
1037// Main FSM
1038always@(negedge link_clk) // pn_curr_state or send_status_frm_shft or config_reg_rd or rbuffer_empty
1039begin
1040 case(pn_curr_state)
1041 `NB_ST_1: begin
1042 if ( frm_begin ) begin
1043 if ( send_status_frm_shft ) begin
1044 CD = 0; // for now
1045 pn_data_reg = 0;
1046
1047 status_reg0[3:0]=4'h0;
1048 status_reg1[3:0]=4'h0;
1049 status_reg2[3:0]=4'h0;
1050 status_reg3[3:0]=4'h0;
1051 status_reg4[3:0]=4'h0;
1052 status_reg5[3:0]=4'h0;
1053 status_reg6[3:0]=4'h0;
1054 status_reg7[3:0]=4'h0;
1055
1056
1057 if ( fbdimm0_set_status_alert_bit_always ) begin
1058 status_reg0[0]=4'h1;
1059 end
1060 else if ( fbdimm0_set_status_alert_bit > 0) begin
1061 status_reg0[0]=4'h1;
1062 fbdimm0_set_status_alert_bit = fbdimm0_set_status_alert_bit - 1;
1063 end
1064
1065 if( fbdimm1_set_status_alert_bit_always ) begin
1066 status_reg1[0] = 4'h1;
1067 end
1068 else if(fbdimm1_set_status_alert_bit > 0) begin
1069 status_reg1[0] = 4'h1;
1070 fbdimm1_set_status_alert_bit = fbdimm1_set_status_alert_bit - 1;
1071 end
1072
1073 if( fbdimm2_set_status_alert_bit_always ) begin
1074 status_reg2[0] = 4'h1;
1075 end
1076 else if(fbdimm2_set_status_alert_bit > 0) begin
1077 status_reg2[0] = 4'h1;
1078 fbdimm2_set_status_alert_bit = fbdimm2_set_status_alert_bit - 1;
1079 end
1080
1081 if( fbdimm3_set_status_alert_bit_always ) begin
1082 status_reg3[0] = 4'h1;
1083 end
1084 else if(fbdimm3_set_status_alert_bit > 0) begin
1085 status_reg3[0] = 4'h1;
1086 fbdimm3_set_status_alert_bit = fbdimm3_set_status_alert_bit - 1;
1087 end
1088
1089 if( fbdimm4_set_status_alert_bit_always ) begin
1090 status_reg4[0] = 4'h1;
1091 end
1092 else if(fbdimm4_set_status_alert_bit > 0) begin
1093 status_reg4[0] = 4'h1;
1094 fbdimm4_set_status_alert_bit = fbdimm4_set_status_alert_bit - 1;
1095 end
1096
1097 if( fbdimm5_set_status_alert_bit_always ) begin
1098 status_reg5[0] = 4'h1;
1099 end
1100 else if(fbdimm5_set_status_alert_bit > 0) begin
1101 status_reg5[0] = 4'h1;
1102 fbdimm5_set_status_alert_bit = fbdimm5_set_status_alert_bit - 1;
1103 end
1104
1105 if( fbdimm6_set_status_alert_bit_always ) begin
1106 status_reg6[0] = 4'h1;
1107 end
1108 else if(fbdimm6_set_status_alert_bit > 0) begin
1109 status_reg6[0] = 4'h1;
1110 fbdimm6_set_status_alert_bit = fbdimm6_set_status_alert_bit - 1;
1111 end
1112
1113 if( fbdimm7_set_status_alert_bit_always ) begin
1114 status_reg7[0] = 4'h1;
1115 end
1116 else if(fbdimm7_set_status_alert_bit > 0) begin
1117 status_reg7[0] = 4'h1;
1118 fbdimm7_set_status_alert_bit = fbdimm7_set_status_alert_bit - 1;
1119 end
1120
1121 status_reg0[1] = fbdimm0_set_thermal_trip[0];
1122 status_reg1[1] = fbdimm1_set_thermal_trip[0];
1123 status_reg2[1] = fbdimm2_set_thermal_trip[0];
1124 status_reg3[1] = fbdimm3_set_thermal_trip[0];
1125 status_reg4[1] = fbdimm4_set_thermal_trip[0];
1126 status_reg5[1] = fbdimm5_set_thermal_trip[0];
1127 status_reg6[1] = fbdimm6_set_thermal_trip[0];
1128 status_reg7[1] = fbdimm7_set_thermal_trip[0];
1129
1130 status_reg0[2] = fbdimm0_set_thermal_trip[1];
1131 status_reg1[2] = fbdimm1_set_thermal_trip[1];
1132 status_reg2[2] = fbdimm2_set_thermal_trip[1];
1133 status_reg3[2] = fbdimm3_set_thermal_trip[1];
1134 status_reg4[2] = fbdimm4_set_thermal_trip[1];
1135 status_reg5[2] = fbdimm5_set_thermal_trip[1];
1136 status_reg6[2] = fbdimm6_set_thermal_trip[1];
1137 status_reg7[2] = fbdimm7_set_thermal_trip[1];
1138
1139 if ( fbdimm0_set_status_parity_bit_always )
1140 status_reg0[4]=(status_reg0[3] ^ status_reg0[2] ^ status_reg0[1] ^ status_reg0[0]); // even parity
1141 else if ( fbdimm0_set_status_parity_bit > 0) begin
1142 status_reg0[4]=(status_reg0[3] ^ status_reg0[2] ^ status_reg0[1] ^ status_reg0[0]); // even parity
1143 fbdimm0_set_status_parity_bit = fbdimm0_set_status_parity_bit - 1;
1144 end
1145 else
1146 status_reg0[4]=~(status_reg0[3] ^ status_reg0[2] ^ status_reg0[1] ^ status_reg0[0]); // odd parity
1147
1148 if ( fbdimm1_set_status_parity_bit_always )
1149 status_reg1[4]=(status_reg1[3] ^ status_reg1[2] ^ status_reg1[1] ^ status_reg1[0]); // even parity
1150 else if ( fbdimm1_set_status_parity_bit > 0) begin
1151 status_reg1[4]=(status_reg1[3] ^ status_reg1[2] ^ status_reg1[1] ^ status_reg1[0]); // even parity
1152 fbdimm1_set_status_parity_bit = fbdimm1_set_status_parity_bit - 1;
1153 end
1154 else
1155 status_reg1[4]=~(status_reg1[3] ^ status_reg1[2] ^ status_reg1[1] ^ status_reg1[0]); // odd parity
1156
1157 if ( fbdimm2_set_status_parity_bit_always )
1158 status_reg2[4]=(status_reg2[3] ^ status_reg2[2] ^ status_reg2[1] ^ status_reg2[0]); // even parity
1159 else if ( fbdimm2_set_status_parity_bit > 0) begin
1160 status_reg2[4]=(status_reg2[3] ^ status_reg2[2] ^ status_reg2[1] ^ status_reg2[0]); // even parity
1161 fbdimm2_set_status_parity_bit = fbdimm2_set_status_parity_bit - 1;
1162 end
1163 else
1164 status_reg2[4]=~(status_reg2[3] ^ status_reg2[2] ^ status_reg2[1] ^ status_reg2[0]); // odd parity
1165
1166 if ( fbdimm3_set_status_parity_bit_always )
1167 status_reg3[4]=(status_reg3[3] ^ status_reg3[2] ^ status_reg3[1] ^ status_reg3[0]); // even parity
1168 else if ( fbdimm3_set_status_parity_bit > 0) begin
1169 status_reg3[4]=(status_reg3[3] ^ status_reg3[2] ^ status_reg3[1] ^ status_reg3[0]); // even parity
1170 fbdimm3_set_status_parity_bit = fbdimm3_set_status_parity_bit - 1;
1171 end
1172 else
1173 status_reg3[4]=~(status_reg3[3] ^ status_reg3[2] ^ status_reg3[1] ^ status_reg3[0]); // odd parity
1174
1175 if ( fbdimm4_set_status_parity_bit_always )
1176 status_reg4[4]=(status_reg4[3] ^ status_reg4[2] ^ status_reg4[1] ^ status_reg4[0]); // even parity
1177 else if ( fbdimm4_set_status_parity_bit > 0) begin
1178 status_reg4[4]=(status_reg4[3] ^ status_reg4[2] ^ status_reg4[1] ^ status_reg4[0]); // even parity
1179 fbdimm4_set_status_parity_bit = fbdimm4_set_status_parity_bit - 1;
1180 end
1181 else
1182 status_reg4[4]=~(status_reg4[3] ^ status_reg4[2] ^ status_reg4[1] ^ status_reg4[0]); // odd parity
1183
1184 if ( fbdimm5_set_status_parity_bit_always )
1185 status_reg5[4]=(status_reg5[3] ^ status_reg5[2] ^ status_reg5[1] ^ status_reg5[0]); // even parity
1186 else if ( fbdimm5_set_status_parity_bit > 0) begin
1187 status_reg5[4]=(status_reg5[3] ^ status_reg5[2] ^ status_reg5[1] ^ status_reg5[0]); // even parity
1188 fbdimm5_set_status_parity_bit = fbdimm5_set_status_parity_bit - 1;
1189 end
1190 else
1191 status_reg5[4]=~(status_reg5[3] ^ status_reg5[2] ^ status_reg5[1] ^ status_reg5[0]); // odd parity
1192
1193 if ( fbdimm6_set_status_parity_bit_always )
1194 status_reg6[4]=(status_reg6[3] ^ status_reg6[2] ^ status_reg6[1] ^ status_reg6[0]); // even parity
1195 else if ( fbdimm6_set_status_parity_bit > 0) begin
1196 status_reg6[4]=(status_reg6[3] ^ status_reg6[2] ^ status_reg6[1] ^ status_reg6[0]); // even parity
1197 fbdimm6_set_status_parity_bit = fbdimm6_set_status_parity_bit - 1;
1198 end
1199 else
1200 status_reg6[4]=~(status_reg6[3] ^ status_reg6[2] ^ status_reg6[1] ^ status_reg6[0]); // odd parity
1201
1202 if ( fbdimm7_set_status_parity_bit_always )
1203 status_reg7[4]=(status_reg7[3] ^ status_reg7[2] ^ status_reg7[1] ^ status_reg7[0]); // even parity
1204 else if ( fbdimm7_set_status_parity_bit ) begin
1205 status_reg7[4]=(status_reg7[3] ^ status_reg7[2] ^ status_reg7[1] ^ status_reg7[0]); // even parity
1206 fbdimm7_set_status_parity_bit = fbdimm7_set_status_parity_bit - 1;
1207 end
1208 else
1209 status_reg7[4]=~(status_reg7[3] ^ status_reg7[2] ^ status_reg7[1] ^ status_reg7[0]); // odd parity
1210
1211//`ifdef STINGRAY_FBDIMM_STATUS
1212 if (Last_FBDimm_ID_REG == 0 ) // 1 fbdimm
1213 begin
1214 status_reg7[4]=0;
1215 status_reg6[4]=0;
1216 status_reg5[4]=0;
1217 status_reg4[4]=0;
1218 status_reg3[4]=0;
1219 status_reg2[4]=0;
1220 status_reg1[4]=0;
1221 end
1222 if (Last_FBDimm_ID_REG == 1 ) // 2 fbdimm
1223 begin
1224 status_reg7[4]=0; status_reg6[4]=0; status_reg5[4]=0; status_reg4[4]=0; status_reg3[4]=0; status_reg2[4]=0;
1225 end
1226 if (Last_FBDimm_ID_REG == 2 ) // 3 fbdimm
1227 begin
1228 status_reg7[4]=0; status_reg6[4]=0; status_reg5[4]=0; status_reg4[4]=0; status_reg3[4]=0;
1229 end
1230 if (Last_FBDimm_ID_REG == 3 ) // 4 fbdimm
1231 begin
1232 status_reg7[4]=0; status_reg6[4]=0; status_reg5[4]=0; status_reg4[4]=0;
1233 end
1234 if (Last_FBDimm_ID_REG == 4 ) // 5 fbdimm
1235 begin
1236 status_reg7[4]=0; status_reg6[4]=0; status_reg5[4]=0;
1237 end
1238 if (Last_FBDimm_ID_REG == 5 ) // 6 fbdimm
1239 begin
1240 status_reg7[4]=0; status_reg6[4]=0;
1241 end
1242 if (Last_FBDimm_ID_REG == 6 ) // 7 fbdimm
1243 begin
1244 status_reg7[4]=0;
1245 end
1246//`endif
1247
1248 send_status_frm_reg = 1;
1249 rbuffer_rd_reg =1'b0;
1250 pn_next_state= `NB_ST_2;
1251 pn_data_reg = {6'h0,status_reg7[0],status_reg6[0],status_reg5[0],status_reg4[0],status_reg3[0],status_reg2[0],status_reg1[0],status_reg0[0]};
1252
1253 end
1254 else if ( ~rbuffer_empty )
1255 begin
1256 get_rfifo_data =1'b1;
1257 CD = rbuffer_rd_data_in;
1258 pn_next_state= `NB_ST_2;
1259 rbuffer_rd_reg =1'b1;
1260 send_status_frm_reg = 0;
1261 //if ( fbdreg_mtr[6] == 0 ) begin
1262 if ( failover_nb_14)
1263 pn_data_reg[13:0] = {1'b0,E[0],CD[66],CD[60],CD[54],CD[48],CD[42],CD[36],CD[30],CD[24],CD[18],CD[12],CD[6],CD[0]};
1264 else if (failover_nb_13)
1265 pn_data_reg[13:0] = {1'b0,1'b0,CD[66],CD[60],CD[54],CD[48],CD[42],CD[36],CD[30],CD[24],CD[18],CD[12],CD[6],CD[0]};
1266 else if (nb_12)
1267 pn_data_reg[13:0] = {1'b0,1'b0,E[0],CD[60],CD[54],CD[48],CD[42],CD[36],CD[30],CD[24],CD[18],CD[12],CD[6],CD[0]};
1268 else
1269 pn_data_reg[13:0] = {E[0],E[11],CD[66],CD[60],CD[54],CD[48],CD[42],CD[36],CD[30],CD[24],CD[18],CD[12],CD[6],CD[0]};
1270 // end else begin
1271 // if ( failover_nb_14)
1272 // pn_data_reg[13:0] = {1'b0,E[0],CD[26],CD[43],CD[60],CD[6],CD[23],CD[40],CD[57],CD[3],CD[20],CD[37],CD[54],CD[0]};
1273 // else if ( failover_nb_13)
1274 // pn_data_reg[13:0] = {1'b0,1'b0,CD[26],CD[43],CD[60],CD[6],CD[23],CD[40],CD[57],CD[3],CD[20],CD[37],CD[54],CD[0]};
1275 // else if ( nb_12)
1276 // pn_data_reg[13:0] = {1'b0,1'b0,E[0],CD[43],CD[60],CD[6],CD[23],CD[40],CD[57],CD[3],CD[20],CD[37],CD[54],CD[0]};
1277 // else
1278 // pn_data_reg[13:0] = {E[0],E[11],CD[26],CD[43],CD[60],CD[6],CD[23],CD[40],CD[57],CD[3],CD[20],CD[37],CD[54],CD[0]};
1279 // end
1280 end
1281 else if ( config_reg_rd_shft ) begin
1282 CD = config_reg_data;
1283 send_reg_data=1;
1284 send_status_frm_reg = 0;
1285 pn_next_state= `NB_ST_2;
1286 if (failover_nb_14)
1287 pn_data_reg[13:0] = {1'b0,E[0],1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[30],CD[24],CD[18],CD[12],CD[6],CD[0]};
1288 else if (failover_nb_13)
1289 pn_data_reg[13:0] = {1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[30],CD[24],CD[18],CD[12],CD[6],CD[0]};
1290 else if (nb_12)
1291 pn_data_reg[13:0] = {1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[30],CD[24],CD[18],CD[12],CD[6],CD[0]};
1292 else
1293 pn_data_reg[13:0] = {E[0],E[11],1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[30],CD[24],CD[18],CD[12],CD[6],CD[0]};
1294
1295 end
1296 else begin
1297 rbuffer_rd_reg =1'b0;
1298 send_reg_data=0;
1299 send_status_frm_reg=0;
1300 end
1301 end // if frm_begin
1302
1303 pn0 = pn_data_reg;
1304 end
1305 `NB_ST_2: begin
1306 // rbuffer_rd_reg =1'b1;
1307 get_rfifo_data =1'b0;
1308 pn_next_state= `NB_ST_3;
1309 if ( rbuffer_rd_reg )
1310 if (failover_nb_14)
1311 pn_data_reg[13:0] = {1'b0,E[1],CD[67],CD[61],CD[55],CD[49],CD[43],CD[37],CD[31],CD[25],CD[19],CD[13],CD[7],CD[1]};
1312 else if (failover_nb_13)
1313 pn_data_reg[13:0] = {1'b0,1'b0,CD[67],CD[61],CD[55],CD[49],CD[43],CD[37],CD[31],CD[25],CD[19],CD[13],CD[7],CD[1]};
1314 else if (nb_12)
1315 pn_data_reg[13:0] = {1'b0,1'b0,E[1],CD[61],CD[55],CD[49],CD[43],CD[37],CD[31],CD[25],CD[19],CD[13],CD[7],CD[1]};
1316 else
1317 pn_data_reg[13:0] = {E[1],E[10],CD[67],CD[61],CD[55],CD[49],CD[43],CD[37],CD[31],CD[25],CD[19],CD[13],CD[7],CD[1]};
1318 else if ( send_reg_data )begin
1319 if ( failover_nb_14 )
1320 pn_data_reg[13:0] = {1'b0,E[1],1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[31],CD[25],CD[19],CD[13],CD[7],CD[1]};
1321 else if ( failover_nb_13 )
1322 pn_data_reg[13:0] = {1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[31],CD[25],CD[19],CD[13],CD[7],CD[1]};
1323 else if ( nb_12 )
1324 pn_data_reg[13:0] = {1'b0,1'b0,E[0],1'b0,1'b0,1'b0,1'b0,1'b0,CD[31],CD[25],CD[19],CD[13],CD[7],CD[1]};
1325 else
1326 pn_data_reg[13:0] = {E[1],E[10],1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[31],CD[25],CD[19],CD[13],CD[7],CD[1]};
1327
1328 end
1329 else if ( send_status_frm_reg )
1330 begin
1331 pn_data_reg = {6'h0,status_reg7[1],status_reg6[1],status_reg5[1],status_reg4[1],status_reg3[1],status_reg2[1],status_reg1[1],status_reg0[1]};
1332 end
1333
1334 pn1 = pn_data_reg;
1335
1336 end
1337 `NB_ST_3: begin
1338 if ( rbuffer_rd_reg )
1339 if (failover_nb_14 )
1340 pn_data_reg[13:0] = {1'b0,E[2],CD[68],CD[62],CD[56],CD[50],CD[44],CD[38],CD[32],CD[26],CD[20],CD[14],CD[8],CD[2]};
1341 else if (failover_nb_13 )
1342 pn_data_reg[13:0] = {1'b0,1'b0,CD[68],CD[62],CD[56],CD[50],CD[44],CD[38],CD[32],CD[26],CD[20],CD[14],CD[8],CD[2]};
1343 else if (nb_12 )
1344 pn_data_reg[13:0] = {1'b0,1'b0,E[2],CD[62],CD[56],CD[50],CD[44],CD[38],CD[32],CD[26],CD[20],CD[14],CD[8],CD[2]};
1345 else
1346 pn_data_reg[13:0] = {E[2],E[9],CD[68],CD[62],CD[56],CD[50],CD[44],CD[38],CD[32],CD[26],CD[20],CD[14],CD[8],CD[2]};
1347 else if ( send_reg_data ) begin
1348 if(failover_nb_14)
1349 pn_data_reg[13:0] = {1'b0,E[2],1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[26],CD[20],CD[14],CD[8],CD[2]};
1350 else if(failover_nb_13)
1351 pn_data_reg[13:0] = {1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[26],CD[20],CD[14],CD[8],CD[2]};
1352 else if(nb_12)
1353 pn_data_reg[13:0] = {1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[26],CD[20],CD[14],CD[8],CD[2]};
1354 else
1355 pn_data_reg[13:0] = {E[2],E[9],1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[26],CD[20],CD[14],CD[8],CD[2]};
1356
1357 end
1358 else if ( send_status_frm_reg )
1359 begin
1360 pn_data_reg = {6'h0,status_reg7[2],status_reg6[2],status_reg5[2],status_reg4[2],status_reg3[2],status_reg2[2],status_reg1[2],status_reg0[2]};
1361 end
1362
1363
1364 pn_next_state= `NB_ST_4;
1365 pn2 = pn_data_reg;
1366 end
1367 `NB_ST_4: begin
1368 pn_next_state=`NB_ST_5;
1369
1370 if (rbuffer_rd_reg )
1371 if (failover_nb_14 )
1372 pn_data_reg[13:0] = {1'b0,E[3],CD[69],CD[63],CD[57],CD[51],CD[45],CD[39],CD[33],CD[27],CD[21],CD[15],CD[9],CD[3]};
1373 else if (failover_nb_13 )
1374 pn_data_reg[13:0] = {1'b0,1'b0,CD[69],CD[63],CD[57],CD[51],CD[45],CD[39],CD[33],CD[27],CD[21],CD[15],CD[9],CD[3]};
1375 else if (nb_12 )
1376 pn_data_reg[13:0] = {1'b0,1'b0,E[3],CD[63],CD[57],CD[51],CD[45],CD[39],CD[33],CD[27],CD[21],CD[15],CD[9],CD[3]};
1377 else
1378 pn_data_reg[13:0] = {E[3],E[8],CD[69],CD[63],CD[57],CD[51],CD[45],CD[39],CD[33],CD[27],CD[21],CD[15],CD[9],CD[3]};
1379 else if ( send_reg_data ) begin
1380 if(failover_nb_14)
1381 pn_data_reg[13:0] = {1'b0,E[3],1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[27],CD[21],CD[15],CD[9],CD[3]};
1382 else if(failover_nb_13)
1383 pn_data_reg[13:0] = {1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[27],CD[21],CD[15],CD[9],CD[3]};
1384 else if(nb_12)
1385 pn_data_reg[13:0] = {1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[27],CD[21],CD[15],CD[9],CD[3]};
1386 else
1387 pn_data_reg[13:0] = {E[3],E[8],1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[27],CD[21],CD[15],CD[9],CD[3]};
1388
1389 end
1390 else if ( send_status_frm_reg )
1391 begin
1392 pn_data_reg = {6'h0,status_reg7[3],status_reg6[3],status_reg5[3],status_reg4[3],status_reg3[3],status_reg2[3],status_reg1[3],status_reg0[3]};
1393
1394 end
1395
1396 pn3 = pn_data_reg;
1397 end
1398 `NB_ST_5: begin
1399 pn_next_state= `NB_ST_6;
1400 if ( rbuffer_rd_reg )
1401 if(failover_nb_14)
1402 pn_data_reg[13:0] = {1'b0,E[4],CD[70],CD[64],CD[58],CD[52],CD[46],CD[40],CD[34],CD[28],CD[22],CD[16],CD[10],CD[4]};
1403 else if(failover_nb_13)
1404 pn_data_reg[13:0] = {1'b0,1'b0,CD[70],CD[64],CD[58],CD[52],CD[46],CD[40],CD[34],CD[28],CD[22],CD[16],CD[10],CD[4]};
1405 else if(nb_12)
1406 pn_data_reg[13:0] = {1'b0,1'b0,E[4],1'b0,CD[58],CD[52],CD[46],CD[40],CD[34],CD[28],CD[22],CD[16],CD[10],CD[4]};
1407 else
1408 pn_data_reg[13:0] = {E[4],E[7],CD[70],CD[64],CD[58],CD[52],CD[46],CD[40],CD[34],CD[28],CD[22],CD[16],CD[10],CD[4]};
1409 else if ( send_reg_data ) begin
1410 if(failover_nb_14)
1411 pn_data_reg[13:0] = {1'b0,E[4],1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[28],CD[22],CD[16],CD[10],CD[4]};
1412 else if(failover_nb_13)
1413 pn_data_reg[13:0] = {1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[28],CD[22],CD[16],CD[10],CD[4]};
1414 else if(nb_12)
1415 pn_data_reg[13:0] = {1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[28],CD[22],CD[16],CD[10],CD[4]};
1416 else
1417 pn_data_reg[13:0] = {E[4],E[7],1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[28],CD[22],CD[16],CD[10],CD[4]};
1418
1419 end
1420 else if ( send_status_frm_reg )
1421 begin
1422//`ifdef STINGRAY_FBDIMM_STATUS
1423 pn_data_reg[11:0] = {4'b0000,status_reg7[4],status_reg6[4],status_reg5[4],status_reg4[4],status_reg3[4],status_reg2[4],status_reg1[4],status_reg0[4]};
1424//`else
1425// pn_data_reg[11:0] = {4'b1111,status_reg7[4],status_reg6[4],status_reg5[4],status_reg4[4],status_reg3[4],status_reg2[4],status_reg1[4],status_reg0[4]};
1426//`endif
1427 end
1428
1429 pn4 = pn_data_reg;
1430
1431 end
1432 `NB_ST_6: begin
1433 pn_next_state=`NB_ST_7;
1434 if ( rbuffer_rd_reg ) begin
1435 pn_next_state=`NB_ST_1;
1436 if(failover_nb_14)
1437 pn_data_reg[13:0] = {1'b0,E[5],CD[71],CD[65],CD[59],CD[53],CD[47],CD[41],CD[35],CD[29],CD[23],CD[17],CD[11],CD[5]};
1438 else if(failover_nb_13)
1439 pn_data_reg[13:0] = {1'b0,1'b0,CD[71],CD[65],CD[59],CD[53],CD[47],CD[41],CD[35],CD[29],CD[23],CD[17],CD[11],CD[5]};
1440 else if(nb_12)
1441 pn_data_reg[13:0] = {1'b0,1'b0,E[5],1'b0,CD[59],CD[53],CD[47],CD[41],CD[35],CD[29],CD[23],CD[17],CD[11],CD[5]};
1442 else
1443 pn_data_reg[13:0] = {E[5],E[6],CD[71],CD[65],CD[59],CD[53],CD[47],CD[41],CD[35],CD[29],CD[23],CD[17],CD[11],CD[5]};
1444 end
1445 else if ( send_reg_data ) begin
1446 if(failover_nb_14)
1447 pn_data_reg[13:0] = {1'b0,E[5],1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[29],CD[23],CD[17],CD[11],CD[5]};
1448 else if(failover_nb_13)
1449 pn_data_reg[13:0] = {1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[29],CD[23],CD[17],CD[11],CD[5]};
1450 else if(nb_12)
1451 pn_data_reg[13:0] = {1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[29],CD[23],CD[17],CD[11],CD[5]};
1452 else
1453 pn_data_reg[13:0] = {E[5],E[6],1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,CD[29],CD[23],CD[17],CD[11],CD[5]};
1454 //pn_next_state=`NB_ST_1;
1455
1456 end
1457 else if ( send_status_frm_reg )
1458 begin
1459 pn_data_reg[13:0]=14'b01010101010101;
1460
1461 end
1462
1463 pn5 = pn_data_reg;
1464
1465 end
1466 `NB_ST_7: begin
1467
1468 if ( send_reg_data ) begin
1469
1470 if(failover_nb_14)
1471 pn_data_reg[13:0] = 14'h0;
1472 else if(failover_nb_13)
1473 pn_data_reg[13:0] = 14'h0;
1474 else if(nb_12)
1475 pn_data_reg[13:0] = 14'h0;
1476 else
1477 pn_data_reg[13:0] = 14'h0;
1478
1479 pn_next_state=`NB_ST_9;
1480
1481 end
1482 else if ( send_status_frm_reg ) begin
1483 pn_next_state=`NB_ST_9;
1484 pn_data_reg[13:0]=14'b10101010101010;
1485
1486 end
1487 else if ( send_reg_data ) begin
1488 pn_next_state=`NB_ST_9;
1489 pn_data_reg[13:0]=14'h0;
1490 end
1491
1492 pn6 = pn_data_reg;
1493 end
1494 `NB_ST_9: begin
1495
1496 if ( send_reg_data ) begin
1497
1498 if(failover_nb_14)
1499 pn_data_reg[13:0] = 14'h0;
1500 else if(failover_nb_13)
1501 pn_data_reg[13:0] = 14'h0;
1502 else if(nb_12)
1503 pn_data_reg[13:0] = 14'h0;
1504 else
1505 pn_data_reg[13:0] = 14'h0;
1506
1507 end
1508 else begin
1509 pn_data_reg[13:0]=14'b01010101010101;
1510 end
1511 pn7 = pn_data_reg;
1512 pn_next_state=`NB_ST_10;
1513
1514 end
1515 `NB_ST_10: begin
1516
1517 if ( send_reg_data ) begin
1518
1519 if(failover_nb_14)
1520 pn_data_reg[13:0] = 14'h0;
1521 else if(failover_nb_13)
1522 pn_data_reg[13:0] = 14'h0;
1523 else if(nb_12)
1524 pn_data_reg[13:0] = 14'h0;
1525 else
1526 pn_data_reg[13:0] = 14'h0;
1527
1528 end
1529 else
1530 pn_data_reg[13:0]=14'b10101010101010;
1531
1532 pn_next_state=`NB_ST_11;
1533 pn8 = pn_data_reg;
1534 end
1535 `NB_ST_11: begin
1536
1537 if ( send_reg_data ) begin
1538
1539 if(failover_nb_14)
1540 pn_data_reg[13:0] = 14'h0;
1541 else if(failover_nb_13)
1542 pn_data_reg[13:0] = 14'h0;
1543 else if(nb_12)
1544 pn_data_reg[13:0] = 14'h0;
1545 else
1546 pn_data_reg[13:0] = 14'h0;
1547
1548 end
1549 else
1550 pn_data_reg[13:0]=14'b01010101010101;
1551
1552 pn_next_state=`NB_ST_12;
1553 pn9 = pn_data_reg;
1554 end
1555 `NB_ST_12: begin
1556
1557 if ( send_reg_data ) begin
1558
1559 if(failover_nb_14)
1560 pn_data_reg[13:0] = 14'h0;
1561 else if(failover_nb_13)
1562 pn_data_reg[13:0] = 14'h0;
1563 else if(nb_12)
1564 pn_data_reg[13:0] = 14'h0;
1565 else
1566 pn_data_reg[13:0] = 14'h0;
1567
1568 end
1569 else
1570 pn_data_reg[13:0]=14'b10101010101010;
1571
1572 pn_next_state=`NB_ST_13;
1573 pn10 = pn_data_reg;
1574 end
1575 `NB_ST_13: begin
1576 if ( send_reg_data ) begin
1577
1578 if(failover_nb_14)
1579 pn_data_reg[13:0] = 14'h0;
1580 else if(failover_nb_13)
1581 pn_data_reg[13:0] = 14'h0;
1582 else if(nb_12)
1583 pn_data_reg[13:0] = 14'h0;
1584 else
1585 pn_data_reg[13:0] = 14'h0;
1586
1587 end
1588 else
1589 pn_data_reg[13:0]=14'b01010101010101;
1590
1591 pn_next_state=`NB_ST_1;
1592 pn11 = pn_data_reg;
1593 end
1594
1595 endcase
1596end
1597
1598`endif // FBDIMM_FAST
1599
1600`ifdef FBDIMM_FAST_IDLE
1601
1602idle_lfsr idle_frame_generator( .reset (send_status_frm ),
1603 .pn0_out (pn0_idle_frame),
1604 .pn1_out (pn1_idle_frame),
1605 .pn2_out (pn2_idle_frame),
1606 .pn3_out (pn3_idle_frame),
1607 .pn4_out (pn4_idle_frame),
1608 .pn5_out (pn5_idle_frame),
1609 .pn6_out (pn6_idle_frame),
1610 .pn7_out (pn7_idle_frame),
1611 .pn8_out (pn8_idle_frame),
1612 .pn9_out (pn9_idle_frame),
1613 .pn10_out (pn10_idle_frame),
1614 .pn11_out (pn11_idle_frame),
1615 .frm_begin ( frm_begin),
1616 .frm_boundary ( frm_boundary_sb),
1617 .drc (drc),
1618 .clk (clk_int));
1619
1620assign pn_bus_alert_frame0 = (pn0_idle_frame !== 14'h0) ? ~pn0_idle_frame : 14'h0;
1621assign pn_bus_alert_frame1 = (pn1_idle_frame !== 14'h0) ? ~pn1_idle_frame : 14'h0;
1622assign pn_bus_alert_frame2 = (pn2_idle_frame !== 14'h0) ? ~pn2_idle_frame : 14'h0;
1623assign pn_bus_alert_frame3 = (pn3_idle_frame !== 14'h0) ? ~pn3_idle_frame : 14'h0;
1624assign pn_bus_alert_frame4 = (pn4_idle_frame !== 14'h0) ? ~pn4_idle_frame : 14'h0;
1625assign pn_bus_alert_frame5 = (pn5_idle_frame !== 14'h0) ? ~pn5_idle_frame : 14'h0;
1626assign pn_bus_alert_frame6 = (pn6_idle_frame !== 14'h0) ? ~pn6_idle_frame : 14'h0;
1627assign pn_bus_alert_frame7 = (pn7_idle_frame !== 14'h0) ? ~pn7_idle_frame : 14'h0;
1628assign pn_bus_alert_frame8 = (pn8_idle_frame !== 14'h0) ? ~pn8_idle_frame : 14'h0;
1629assign pn_bus_alert_frame9 = (pn9_idle_frame !== 14'h0) ? ~pn9_idle_frame : 14'h0;
1630assign pn_bus_alert_frame10 = (pn10_idle_frame !== 14'h0) ? ~pn10_idle_frame : 14'h0;
1631assign pn_bus_alert_frame11 = (pn11_idle_frame !== 14'h0) ? ~pn11_idle_frame : 14'h0;
1632
1633
1634`else
1635assign pn_bus_alert_frame = (pn_idle_frame !== 14'h0) ? ~pn_idle_frame : 14'h0;
1636
1637
1638
1639// Idle frame generator module
1640idle_lfsr idle_frame_generator ( .reset (send_status_frm ),
1641 .dtm_reset ( send_status_frm_shft),
1642 .lfsr_output (pn_idle_frame),
1643 .frm_boundary ( frm_boundary_sb ),
1644 .frm_begin ( frm_begin ),
1645 .electrical_idle (electrical_idle),
1646 .clk (link_clk));
1647
1648`endif
1649
1650
1651`ifdef FBDIMM_FAST_NB
1652// CRC calculator for data
1653crc nb_crc_gen2( .b (B1 ),
1654 .E_out (E1) ,
1655 .failover ( nb_config !== 4'hf) );
1656
1657`endif
1658
1659// CRC calculator for data
1660crc nb_crc_gen( .b (B ),
1661 .E_out (E),
1662 .failover ( nb_config !== 4'hf) );
1663
1664wire [7:0] status_delay = 8'h84;
1665
1666
1667
1668
1669`ifdef AXIS_FBDIMM_NO_FSR
1670`else
1671dff_fbd #(1) ff1( .signal_in (send_status_frm),
1672 .signal_out (send_status_frm_d[1]),
1673 .clk (link_clk));
1674dff_fbd #(1) ff2( .signal_in (send_status_frm_d[1]),
1675 .signal_out (send_status_frm_d[2]),
1676 .clk (link_clk));
1677dff_fbd #(1) ff3( .signal_in (send_status_frm_d[2]),
1678 .signal_out (send_status_frm_d[3]),
1679 .clk (link_clk));
1680dff_fbd #(1) ff4( .signal_in (send_status_frm_d[3]),
1681 .signal_out (send_status_frm_d[4]),
1682 .clk (link_clk));
1683dff_fbd #(1) ff5( .signal_in (send_status_frm_d[4]),
1684 .signal_out (send_status_frm_d[5]),
1685 .clk (link_clk));
1686dff_fbd #(1) ff6( .signal_in (send_status_frm_d[5]),
1687 .signal_out (send_status_frm_d[6]),
1688 .clk (link_clk));
1689dff_fbd #(1) ff7( .signal_in (send_status_frm_d[6]),
1690 .signal_out (send_status_frm_d[7]),
1691 .clk (link_clk));
1692dff_fbd #(1) ff8( .signal_in (send_status_frm_d[7]),
1693 .signal_out (send_status_frm_d[8]),
1694 .clk (link_clk));
1695dff_fbd #(1) ff9( .signal_in (send_status_frm_d[8]),
1696 .signal_out (send_status_frm_d[9]),
1697 .clk (link_clk));
1698dff_fbd #(1) ff10( .signal_in (send_status_frm_d[9]),
1699 .signal_out (send_status_frm_d[10]),
1700 .clk (link_clk));
1701dff_fbd #(1) ff11( .signal_in (send_status_frm_d[10]),
1702 .signal_out (send_status_frm_d[11]),
1703 .clk (link_clk));
1704dff_fbd #(1) ff12( .signal_in (send_status_frm_d[11]),
1705 .signal_out (send_status_frm_d[12]),
1706 .clk (link_clk));
1707dff_fbd #(1) ff13( .signal_in (send_status_frm_d[12]),
1708 .signal_out (send_status_frm_d[13]),
1709 .clk (link_clk));
1710
1711`endif // AXIS_FBDIMM_HW
1712
1713wire [NB_LINK-1:0] pn_shft_wire;
1714reg [7:0] fbdreg_local_cmd_to_data,fbdreg_local_cmd_to_data_inc;
1715
1716initial begin
1717fbdreg_local_cmd_to_data =0;
1718fbdreg_local_cmd_to_data_inc=0;
1719end
1720
1721wire [9:0] delay_reg= (send_status_frm_reg || (DS!==0) ) ? 10'h0 : ( ((fbdreg_local_cmd_to_data * 10'hc ) + fbdreg_local_cmd_to_data_inc ) ) ;
1722
1723
1724`ifdef FBDIMM_FAST_NB
1725`else
1726always@(posedge link_clk) begin
1727if ( init )
1728 begin
1729 fbdreg_local_cmd_to_data <= fbdreg_next_cmd_to_data;
1730 fbdreg_local_cmd_to_data_inc <= fbdreg_next_cmd_to_data_inc;
1731 end
1732 else begin
1733 fbdreg_local_cmd_to_data <= fbdreg_curr_cmd_to_data;
1734 fbdreg_local_cmd_to_data_inc <= fbdreg_curr_cmd_to_data_inc;
1735 end
1736end
1737`endif
1738
1739wire [9:0] delay_cfg_reg = delay_reg + 10'd136;
1740
1741`ifdef AXIS_FBDIMM_NO_FSR
1742wire [9:0] sync_delay_reg = delay_reg + ( sync_cmd[12:11] * 3) + 10'd36 ;
1743
1744shifter #(NB_LINK) sync_data_shift ( .signal_in ( pn_read_data ),
1745 .signal_out ( pn_read_data_shft),
1746 .delay_cycles (sync_delay_reg),
1747 .clk ( clk_int ));
1748
1749
1750shifter #(1) sync_ctrl_shift ( .signal_in ( send_status_frm ),
1751 .signal_out ( send_status_frm_shft ),
1752 .delay_cycles ( sync_delay_reg),
1753 .clk ( clk_int));
1754
1755`else
1756
1757reg [3:0] sb_nb_diff_reg;
1758reg start_counter;
1759wire diff_detected = (sb_nb_diff_reg !== 1);
1760reg diff_complete;
1761
1762`ifdef STINGRAY
1763shifter_p #(1) config_rd_ctrl_shft ( .signal_in (config_reg_rd ),
1764`else
1765shifter_UI_p #(1) config_rd_ctrl_shft ( .signal_in (config_reg_rd ),
1766`endif
1767 .signal_out (config_reg_rd_shft),
1768 .delay_cycles(delay_cfg_reg),
1769 .clk (link_clk));
1770
1771shifter #(1) config_rd_ctrl_shft_data ( .signal_in (config_reg_rd ),
1772 .signal_out (config_reg_rd_shft_data),
1773 .delay_cycles(delay_cfg_reg),
1774 .clk (link_clk));
1775
1776`ifdef DTM_ENABLED
1777shifter_p #(NB_LINK) shft (.signal_in ( pn),
1778 .signal_out (pn_shft_out),
1779 .delay_cycles ( (DS == 0 ) ? delay_reg + sb_nb_diff_reg - 1 : 0 ),
1780 .clk (link_clk));
1781`else
1782`ifdef STINGRAY
1783shifter_p #(NB_LINK) shft (.signal_in ( pn),
1784`else
1785shifter_UI_p #(NB_LINK) shft (.signal_in ( pn),
1786`endif
1787 .signal_out (pn_shft_out),
1788 .delay_cycles (delay_reg ),
1789 .clk (link_clk));
1790`endif
1791
1792
1793initial diff_complete =0;
1794
1795`ifdef FBDIMM_FAST_NB
1796wire [9:0] sync_delay_reg = ((drc[7:4]+drc[3:0]) * 12 ) + ( sync_cmd[12:11] * 10'd12 ) + 10'd55 + 10'd36 ;
1797`else
1798wire [9:0] sync_delay_reg = ((drc[7:4]+drc[3:0]) * 12 ) + ( sync_cmd[12:11] * 10'd12 ) + 10'd55 ;
1799`endif
1800
1801`ifdef DTM_ENABLED
1802
1803always@(negedge link_clk ) if ( ~init & !diff_complete )
1804begin
1805 if ( (frm_boundary) && (frm_boundary_sb == frm_boundary ) ) begin
1806 start_counter <=0;
1807 diff_complete <=1;
1808 end
1809 else if ( frm_boundary_sb )
1810 start_counter <=1;
1811 else if ( start_counter & frm_boundary ) begin
1812 start_counter <=0;
1813 diff_complete <=1;
1814 end
1815
1816end
1817else start_counter <= 0;
1818
1819always@(negedge link_clk ) if ( ~init )
1820begin
1821 if ( start_counter )
1822 sb_nb_diff_reg <= sb_nb_diff_reg + 1;
1823end
1824else
1825 sb_nb_diff_reg <= 1;
1826
1827`endif
1828
1829
1830shifter #(NB_LINK) sync_data_shift ( .signal_in ( pn_read_data ),
1831 .signal_out ( pn_read_data_shft),
1832 .delay_cycles (sync_delay_reg),
1833 .clk ( link_clk));
1834
1835
1836shifter_UI_p #(1) sync_ctrl_shift ( .signal_in ( send_status_frm /*_reg */ ),
1837 .signal_out ( send_status_frm_shft ),
1838 .delay_cycles ( sync_delay_reg),
1839 .clk ( link_clk));
1840
1841`endif //AXIS_FBDIMM_NO_FSR
1842
1843always@(negedge frm_boundary_sb )
1844begin
1845 failover_nb_14 <= (nb_config != 4'hf );
1846end
1847
1848
1849endmodule
1850