Commit | Line | Data |
---|---|---|
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 ============================================ | |
35 | module 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 | |
57 | parameter NB_LINK = 14; | |
58 | parameter DS = 0; | |
59 | ||
60 | ||
61 | // Inputs/Outputs | |
62 | output [NB_LINK-1:0] pn_shft_map_out,pn_bar_map_out; // primary southbound | |
63 | output [NB_LINK-1:0] pn0_out,pn1_out,pn2_out,pn3_out,pn4_out,pn5_out,pn6_out; | |
64 | output [NB_LINK-1:0] pn7_out,pn8_out,pn9_out,pn10_out,pn11_out; | |
65 | input [NB_LINK-1:0] sn_in,sn_bar_in; // secondary southbound | |
66 | input [71:0] rbuffer_rd_data_in; | |
67 | input [31:0] config_reg_data; | |
68 | input [23:0] sync_cmd; | |
69 | input [31:0] drc; | |
70 | input dram_2x_clk; | |
71 | input electrical_idle; | |
72 | output [7:0] fbds0,fbds1,fbds2,fbds3; | |
73 | input [7:0] fbdreg_mtr; | |
74 | input [3:0] nb_config; | |
75 | input [7:0] fbdreg_curr_cmd_to_data,fbdreg_curr_cmd_to_data_inc; | |
76 | input [7:0] fbdreg_next_cmd_to_data,fbdreg_next_cmd_to_data_inc; | |
77 | input soft_channel_reset; | |
78 | input frm_begin,frm_boundary,frm_boundary_sb; | |
79 | input ddrio_nbencode_rd; | |
80 | `ifdef AXIS_FBDIMM_NO_FSR | |
81 | `else | |
82 | input link_clk,link_clk_bar; | |
83 | `endif | |
84 | input dram_clk; | |
85 | ||
86 | output rbuffer_rd_out; | |
87 | output chmon_pn_data,chmon_pn_status; | |
88 | output serdes_data_rdy; | |
89 | input rbuffer_empty; | |
90 | input reset; | |
91 | input clk_int; | |
92 | input init; // =1 if initializing | |
93 | input config_reg_rd; | |
94 | input send_status_frm; | |
95 | input disable_state; | |
96 | input send_alert_frame_in; | |
97 | input ref_clk; | |
98 | input sb_crc_error; | |
99 | ||
100 | //internal registers | |
101 | wire [NB_LINK-1:0] pn0_idle_frame,pn1_idle_frame,pn2_idle_frame,pn3_idle_frame,pn4_idle_frame; | |
102 | wire [NB_LINK-1:0] pn5_idle_frame,pn6_idle_frame,pn7_idle_frame,pn9_idle_frame,pn8_idle_frame; | |
103 | wire [NB_LINK-1:0] pn10_idle_frame,pn11_idle_frame; | |
104 | wire [NB_LINK-1:0] pn_idle_frame,pn,pn_alert_frame; | |
105 | wire [NB_LINK-1:0] pn_shft_out; | |
106 | reg [NB_LINK-1:0] pn_data_reg; | |
107 | wire [NB_LINK-1:0] pn_read_data=pn_data_reg; | |
108 | wire [NB_LINK-1:0] pn_read_data_shft; | |
109 | reg [NB_LINK-1:0] pn0,pn1,pn2,pn3,pn4,pn5,pn6,pn7,pn8,pn9,pn10,pn11; | |
110 | reg [NB_LINK-1:0] pn_bus_read_data,pn_bus_status_data; | |
111 | wire [NB_LINK-1:0] pn_bus_alert_frame; | |
112 | wire [NB_LINK-1:0] pn_bus_alert_frame0,pn_bus_alert_frame1,pn_bus_alert_frame2,pn_bus_alert_frame3; | |
113 | wire [NB_LINK-1:0] pn_bus_alert_frame4,pn_bus_alert_frame5,pn_bus_alert_frame6,pn_bus_alert_frame7; | |
114 | wire [NB_LINK-1:0] pn_bus_alert_frame8,pn_bus_alert_frame9,pn_bus_alert_frame10,pn_bus_alert_frame11; | |
115 | reg [71:0] data_package [3:0]; | |
116 | reg [71:0] Data1,Data2; | |
117 | reg [11:0] DataCRC1,DataCRC2; | |
118 | wire [71:0] B,B1; | |
119 | wire [11:0] E,E1; | |
120 | reg [11:0] E_d,E1_d; | |
121 | reg [71:0] CD,D; | |
122 | reg [13:0] pn0_reg,pn1_reg,pn2_reg,pn3_reg,pn4_reg,pn5_reg; | |
123 | reg [13:0] pn6_reg,pn7_reg,pn8_reg,pn9_reg,pn10_reg,pn11_reg; | |
124 | reg [13:0] pn0_reg_l,pn1_reg_l,pn2_reg_l,pn3_reg_l,pn4_reg_l,pn5_reg_l; | |
125 | reg [13:0] pn6_reg_l,pn7_reg_l,pn8_reg_l,pn9_reg_l,pn10_reg_l,pn11_reg_l; | |
126 | ||
127 | reg [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; | |
128 | reg [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 | ||
130 | reg [13:0] pn0_dreg,pn1_dreg,pn2_dreg,pn3_dreg,pn4_dreg,pn5_dreg; | |
131 | reg [13:0] pn6_dreg,pn7_dreg,pn8_dreg,pn9_dreg,pn10_dreg,pn11_dreg; | |
132 | ||
133 | reg [13:0] pn0_d2reg,pn1_d2reg,pn2_d2reg,pn3_d2reg,pn4_d2reg,pn5_d2reg; | |
134 | reg [13:0] pn6_d2reg,pn7_d2reg,pn8_d2reg,pn9_d2reg,pn10_d2reg,pn11_d2reg; | |
135 | ||
136 | reg [13:0] pn0_dreg_d,pn1_dreg_d,pn2_dreg_d,pn3_dreg_d,pn4_dreg_d,pn5_dreg_d; | |
137 | reg [13:0] pn6_dreg_d,pn7_dreg_d,pn8_dreg_d,pn9_dreg_d,pn10_dreg_d,pn11_dreg_d; | |
138 | reg [4:0] status_reg0; | |
139 | reg [4:0] status_reg1; | |
140 | reg [4:0] status_reg2; | |
141 | reg [4:0] status_reg3; | |
142 | reg [4:0] status_reg4; | |
143 | reg [4:0] status_reg5; | |
144 | reg [4:0] status_reg6; | |
145 | reg [4:0] status_reg7; | |
146 | reg [7:0] fbds0_reg,fbds1_reg,fbds2_reg,fbds3_reg; | |
147 | reg [1:0] rbuffer_rd_cnt; | |
148 | reg [1:0] curr_state; | |
149 | reg [3:0] pn_curr_state,pn_next_state; | |
150 | wire config_reg_rd_shft_data; | |
151 | wire send_status_frm_shft; | |
152 | reg rbuffer_rd_reg; | |
153 | reg get_rfifo_data; | |
154 | reg send_reg_data; | |
155 | wire config_reg_rd_shft; | |
156 | reg send_status_frm_reg; | |
157 | reg data1_rdy, data2_rdy, data3_rdy; | |
158 | reg fbdimm0_set_status_alert_bit_always; | |
159 | reg fbdimm0_set_status_parity_bit_always; | |
160 | reg fbdimm1_set_status_alert_bit_always; | |
161 | reg fbdimm1_set_status_parity_bit_always; | |
162 | reg fbdimm2_set_status_alert_bit_always; | |
163 | reg fbdimm2_set_status_parity_bit_always; | |
164 | reg fbdimm3_set_status_alert_bit_always; | |
165 | reg fbdimm3_set_status_parity_bit_always; | |
166 | reg fbdimm4_set_status_alert_bit_always; | |
167 | reg fbdimm4_set_status_parity_bit_always; | |
168 | reg fbdimm5_set_status_alert_bit_always; | |
169 | reg fbdimm5_set_status_parity_bit_always; | |
170 | reg fbdimm6_set_status_alert_bit_always; | |
171 | reg fbdimm6_set_status_parity_bit_always; | |
172 | reg fbdimm7_set_status_alert_bit_always; | |
173 | reg fbdimm7_set_status_parity_bit_always; | |
174 | reg [1:0] fbdimm0_set_thermal_trip; | |
175 | reg [1:0] fbdimm1_set_thermal_trip; | |
176 | reg [1:0] fbdimm2_set_thermal_trip; | |
177 | reg [1:0] fbdimm3_set_thermal_trip; | |
178 | reg [1:0] fbdimm4_set_thermal_trip; | |
179 | reg [1:0] fbdimm5_set_thermal_trip; | |
180 | reg [1:0] fbdimm6_set_thermal_trip; | |
181 | reg [1:0] fbdimm7_set_thermal_trip; | |
182 | reg [9:0] fbdimm0_set_status_alert_bit,fbdimm0_set_status_parity_bit; | |
183 | reg [9:0] fbdimm1_set_status_alert_bit,fbdimm1_set_status_parity_bit; | |
184 | reg [9:0] fbdimm2_set_status_alert_bit,fbdimm2_set_status_parity_bit; | |
185 | reg [9:0] fbdimm3_set_status_alert_bit,fbdimm3_set_status_parity_bit; | |
186 | reg [9:0] fbdimm4_set_status_alert_bit,fbdimm4_set_status_parity_bit; | |
187 | reg [9:0] fbdimm5_set_status_alert_bit,fbdimm5_set_status_parity_bit; | |
188 | reg [9:0] fbdimm6_set_status_alert_bit,fbdimm6_set_status_parity_bit; | |
189 | reg [9:0] fbdimm7_set_status_alert_bit,fbdimm7_set_status_parity_bit; | |
190 | reg nb_12, failover_nb_13, failover_nb_14; //, nb_data_rdy; | |
191 | reg send_alert_frame_in_d,dummy; | |
192 | wire nb_data_rdy; | |
193 | reg pn_bus_alert, pn_bus_reg, pn_bus_read, pn_bus_status; | |
194 | wire [13:0] send_status_frm_d; | |
195 | reg status1_rdy,status2_rdy; | |
196 | wire fbdimm_fast_nb; | |
197 | wire nb_status_rdy = status1_rdy; // | status2_rdy ; | |
198 | ||
199 | ||
200 | `ifdef AXIS_FBDIMM_HW | |
201 | reg [7:0] LastAMB_ID; | |
202 | wire [7:0] Last_FBDimm_ID_REG = LastAMB_ID; | |
203 | `else | |
204 | reg [7:0] config_mem[0:24]; | |
205 | wire [7:0] Last_FBDimm_ID_REG = config_mem[0]; | |
206 | `endif | |
207 | ||
208 | ||
209 | ||
210 | // Assignments | |
211 | assign nb_data_rdy = data1_rdy | data2_rdy; | |
212 | assign chmon_pn_status = send_status_frm_reg; | |
213 | assign chmon_pn_data = rbuffer_rd_reg; | |
214 | assign fbds0 = fbds0_reg; | |
215 | assign fbds1 = fbds1_reg; | |
216 | assign fbds2 = fbds2_reg; | |
217 | assign fbds3 = fbds3_reg; | |
218 | assign serdes_data_rdy = nb_data_rdy | nb_status_rdy ; | |
219 | assign pn_bar_map_out = disable_state ? pn_shft_map_out : ~pn_shft_map_out; | |
220 | assign 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 | ||
238 | assign 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 | ||
246 | assign 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 | ||
254 | assign 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 | ||
262 | assign 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 | ||
270 | assign 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 | ||
278 | assign 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 | ||
286 | assign 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 | ||
294 | assign 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 | ||
302 | assign 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 | ||
311 | assign 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 | ||
320 | assign 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 | ||
329 | assign 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 | ||
337 | assign 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 | ||
346 | assign 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 | ||
362 | assign rbuffer_rd_out = get_rfifo_data; | |
363 | ||
364 | `ifdef FBDIMM_FAST_NB | |
365 | // cem | |
366 | assign 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]}; | |
367 | assign 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]}; | |
368 | assign 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]}; | |
369 | assign 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]}; | |
370 | assign 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]}; | |
371 | assign 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 | ||
375 | assign 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]}; | |
376 | assign 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]}; | |
377 | assign 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]}; | |
378 | assign 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]}; | |
379 | assign 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]}; | |
380 | assign 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 | ||
384 | always@(posedge frm_boundary_sb) | |
385 | send_alert_frame_in_d<=send_alert_frame_in; | |
386 | ||
387 | `ifdef AXIS_FBDIMM_NO_FSR | |
388 | ||
389 | initial begin | |
390 | pn_bus_alert = 0; | |
391 | pn_bus_status_data = 0; | |
392 | pn_bus_reg = 0; | |
393 | end | |
394 | ||
395 | `else | |
396 | always@(posedge link_clk) | |
397 | begin | |
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 | ||
406 | end | |
407 | `endif | |
408 | ||
409 | ||
410 | // Initialization | |
411 | initial 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 | |
459 | fbdimm0_set_thermal_trip = 2'h0; | |
460 | fbdimm1_set_thermal_trip = 2'h0; | |
461 | fbdimm2_set_thermal_trip = 2'h0; | |
462 | fbdimm3_set_thermal_trip = 2'h0; | |
463 | fbdimm4_set_thermal_trip = 2'h0; | |
464 | fbdimm5_set_thermal_trip = 2'h0; | |
465 | fbdimm6_set_thermal_trip = 2'h0; | |
466 | fbdimm7_set_thermal_trip = 2'h0; | |
467 | ||
468 | // Plusargs for AMB0 | |
469 | fbdimm0_set_status_alert_bit = 0; | |
470 | fbdimm0_set_status_parity_bit = 0; | |
471 | fbdimm1_set_status_alert_bit = 0; | |
472 | fbdimm1_set_status_parity_bit = 0; | |
473 | fbdimm2_set_status_alert_bit = 0; | |
474 | fbdimm2_set_status_parity_bit = 0; | |
475 | fbdimm3_set_status_alert_bit = 0; | |
476 | fbdimm3_set_status_parity_bit = 0; | |
477 | fbdimm4_set_status_alert_bit = 0; | |
478 | fbdimm4_set_status_parity_bit = 0; | |
479 | fbdimm5_set_status_alert_bit = 0; | |
480 | fbdimm5_set_status_parity_bit = 0; | |
481 | fbdimm6_set_status_alert_bit = 0; | |
482 | fbdimm6_set_status_parity_bit = 0; | |
483 | fbdimm7_set_status_alert_bit = 0; | |
484 | fbdimm7_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 | ||
493 | if ($test$plusargs("1_FBDIMM")) | |
494 | config_mem[0]=0; | |
495 | else if ($test$plusargs("2_FBDIMMS")) | |
496 | config_mem[0]=1; | |
497 | else if ($test$plusargs("3_FBDIMMS")) | |
498 | config_mem[0]=2; | |
499 | else if ($test$plusargs("4_FBDIMMS")) | |
500 | config_mem[0]=3; | |
501 | else if ($test$plusargs("5_FBDIMMS")) | |
502 | config_mem[0]=4; | |
503 | else if ($test$plusargs("6_FBDIMMS")) | |
504 | config_mem[0]=5; | |
505 | else if ($test$plusargs("7_FBDIMMS")) | |
506 | config_mem[0]=6; | |
507 | else if ($test$plusargs("8_FBDIMMS")) | |
508 | config_mem[0]=7; | |
509 | else | |
510 | config_mem[0]=0; | |
511 | ||
512 | ||
513 | dummy=$value$plusargs("fbdimm0_set_thermal_trip=%h",fbdimm0_set_thermal_trip); | |
514 | dummy=$value$plusargs("fbdimm1_set_thermal_trip=%h",fbdimm1_set_thermal_trip); | |
515 | dummy=$value$plusargs("fbdimm2_set_thermal_trip=%h",fbdimm2_set_thermal_trip); | |
516 | dummy=$value$plusargs("fbdimm3_set_thermal_trip=%h",fbdimm3_set_thermal_trip); | |
517 | dummy=$value$plusargs("fbdimm4_set_thermal_trip=%h",fbdimm4_set_thermal_trip); | |
518 | dummy=$value$plusargs("fbdimm5_set_thermal_trip=%h",fbdimm5_set_thermal_trip); | |
519 | dummy=$value$plusargs("fbdimm6_set_thermal_trip=%h",fbdimm6_set_thermal_trip); | |
520 | dummy=$value$plusargs("fbdimm7_set_thermal_trip=%h",fbdimm7_set_thermal_trip); | |
521 | ||
522 | ||
523 | dummy=$value$plusargs("fbdimm0_set_status_alert_bit=%h",fbdimm0_set_status_alert_bit); | |
524 | dummy=$value$plusargs("fbdimm0_set_status_parity_bit=%h",fbdimm0_set_status_parity_bit); | |
525 | dummy=$value$plusargs("fbdimm1_set_status_alert_bit=%h",fbdimm1_set_status_alert_bit); | |
526 | dummy=$value$plusargs("fbdimm1_set_status_parity_bit=%h",fbdimm1_set_status_parity_bit); | |
527 | dummy=$value$plusargs("fbdimm2_set_status_alert_bit=%h",fbdimm2_set_status_alert_bit); | |
528 | dummy=$value$plusargs("fbdimm2_set_status_parity_bit=%h",fbdimm2_set_status_parity_bit); | |
529 | dummy=$value$plusargs("fbdimm3_set_status_alert_bit=%h",fbdimm3_set_status_alert_bit); | |
530 | dummy=$value$plusargs("fbdimm3_set_status_parity_bit=%h",fbdimm3_set_status_parity_bit); | |
531 | dummy=$value$plusargs("fbdimm4_set_status_alert_bit=%h",fbdimm4_set_status_alert_bit); | |
532 | dummy=$value$plusargs("fbdimm4_set_status_parity_bit=%h",fbdimm4_set_status_parity_bit); | |
533 | dummy=$value$plusargs("fbdimm5_set_status_alert_bit=%h",fbdimm5_set_status_alert_bit); | |
534 | dummy=$value$plusargs("fbdimm5_set_status_parity_bit=%h",fbdimm5_set_status_parity_bit); | |
535 | dummy=$value$plusargs("fbdimm6_set_status_alert_bit=%h",fbdimm6_set_status_alert_bit); | |
536 | dummy=$value$plusargs("fbdimm6_set_status_parity_bit=%h",fbdimm6_set_status_parity_bit); | |
537 | dummy=$value$plusargs("fbdimm7_set_status_alert_bit=%h",fbdimm7_set_status_alert_bit); | |
538 | dummy=$value$plusargs("fbdimm7_set_status_parity_bit=%h",fbdimm7_set_status_parity_bit); | |
539 | ||
540 | // amb0 | |
541 | if ($test$plusargs("fbdimm0_set_status_alert_bit_always")) | |
542 | fbdimm0_set_status_alert_bit_always = 1'b1; | |
543 | else | |
544 | fbdimm0_set_status_alert_bit_always = 1'b0; | |
545 | ||
546 | if ($test$plusargs("fbdimm0_set_status_parity_bit_always")) | |
547 | fbdimm0_set_status_parity_bit_always = 1'b1; | |
548 | else | |
549 | fbdimm0_set_status_parity_bit_always = 1'b0; | |
550 | ||
551 | //amb1 | |
552 | if ($test$plusargs("fbdimm1_set_status_alert_bit_always")) | |
553 | fbdimm1_set_status_alert_bit_always = 1'b1; | |
554 | else | |
555 | fbdimm1_set_status_alert_bit_always = 1'b0; | |
556 | ||
557 | if ($test$plusargs("fbdimm1_set_status_parity_bit_always")) | |
558 | fbdimm1_set_status_parity_bit_always = 1'b1; | |
559 | else | |
560 | fbdimm1_set_status_parity_bit_always = 1'b0; | |
561 | ||
562 | //amb2 | |
563 | if ($test$plusargs("fbdimm2_set_status_alert_bit_always")) | |
564 | fbdimm2_set_status_alert_bit_always = 1'b1; | |
565 | else | |
566 | fbdimm2_set_status_alert_bit_always = 1'b0; | |
567 | ||
568 | if ($test$plusargs("fbdimm2_set_status_parity_bit_always")) | |
569 | fbdimm2_set_status_parity_bit_always = 1'b1; | |
570 | else | |
571 | fbdimm2_set_status_parity_bit_always = 1'b0; | |
572 | ||
573 | //amb3 | |
574 | if ($test$plusargs("fbdimm3_set_status_alert_bit_always")) | |
575 | fbdimm3_set_status_alert_bit_always = 1'b1; | |
576 | else | |
577 | fbdimm3_set_status_alert_bit_always = 1'b0; | |
578 | ||
579 | if ($test$plusargs("fbdimm3_set_status_parity_bit_always")) | |
580 | fbdimm3_set_status_parity_bit_always = 1'b1; | |
581 | else | |
582 | fbdimm3_set_status_parity_bit_always = 1'b0; | |
583 | ||
584 | //amb4 | |
585 | if ($test$plusargs("fbdimm4_set_status_alert_bit_always")) | |
586 | fbdimm4_set_status_alert_bit_always = 1'b1; | |
587 | else | |
588 | fbdimm4_set_status_alert_bit_always = 1'b0; | |
589 | ||
590 | if ($test$plusargs("fbdimm4_set_status_parity_bit_always")) | |
591 | fbdimm4_set_status_parity_bit_always = 1'b1; | |
592 | else | |
593 | fbdimm4_set_status_parity_bit_always = 1'b0; | |
594 | ||
595 | //amb5 | |
596 | if ($test$plusargs("fbdimm5_set_status_alert_bit_always")) | |
597 | fbdimm5_set_status_alert_bit_always = 1'b1; | |
598 | else | |
599 | fbdimm5_set_status_alert_bit_always = 1'b0; | |
600 | ||
601 | if ($test$plusargs("fbdimm5_set_status_parity_bit_always")) | |
602 | fbdimm5_set_status_parity_bit_always = 1'b1; | |
603 | else | |
604 | fbdimm5_set_status_parity_bit_always = 1'b0; | |
605 | ||
606 | //amb6 | |
607 | if ($test$plusargs("fbdimm6_set_status_alert_bit_always")) | |
608 | fbdimm6_set_status_alert_bit_always = 1'b1; | |
609 | else | |
610 | fbdimm6_set_status_alert_bit_always = 1'b0; | |
611 | ||
612 | if ($test$plusargs("fbdimm6_set_status_parity_bit_always")) | |
613 | fbdimm6_set_status_parity_bit_always = 1'b1; | |
614 | else | |
615 | fbdimm6_set_status_parity_bit_always = 1'b0; | |
616 | ||
617 | //amb7 | |
618 | if ($test$plusargs("fbdimm7_set_status_alert_bit_always")) | |
619 | fbdimm7_set_status_alert_bit_always = 1'b1; | |
620 | else | |
621 | fbdimm7_set_status_alert_bit_always = 1'b0; | |
622 | ||
623 | if ($test$plusargs("fbdimm7_set_status_parity_bit_always")) | |
624 | fbdimm7_set_status_parity_bit_always = 1'b1; | |
625 | else | |
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 | ||
634 | if($test$plusargs("fbdimm_nb_failover_14bit")) | |
635 | failover_nb_14=1; | |
636 | else | |
637 | failover_nb_14=0; | |
638 | ||
639 | if($test$plusargs("fbdimm_nb_failover_13bit")) | |
640 | failover_nb_13=1; | |
641 | else | |
642 | failover_nb_13=0; | |
643 | ||
644 | ||
645 | if($test$plusargs("fbdimm_nb_12bit")) | |
646 | nb_12=1; | |
647 | else | |
648 | nb_12=0; | |
649 | ||
650 | pn_bus_read = 0; | |
651 | pn_bus_read_data = 0; | |
652 | pn_bus_status=0; | |
653 | send_status_frm_reg=0; | |
654 | pn0_reg=0; | |
655 | pn1_reg=0; | |
656 | pn2_reg=0; | |
657 | pn3_reg=0; | |
658 | pn4_reg=0; | |
659 | pn5_reg=0; | |
660 | pn6_reg=0; | |
661 | pn7_reg=0; | |
662 | pn8_reg=0; | |
663 | pn9_reg=0; | |
664 | pn10_reg=0; | |
665 | pn11_reg=0; | |
666 | ||
667 | end | |
668 | ||
669 | // nb bus display | |
670 | `ifdef AXIS_FBDIMM_NO_FSR | |
671 | always@(posedge clk_int) | |
672 | `else | |
673 | always@(posedge link_clk) | |
674 | `endif | |
675 | begin | |
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 | ||
682 | if ( 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 | |
697 | if ( send_status_frm_reg ) | |
698 | `PR_ALWAYS ("nb_enc",`DBG_0,"%d: FBDIMM: NB_BUS STATUS FRAME %h\n",$time,pn); | |
699 | `endif | |
700 | ||
701 | end | |
702 | ||
703 | ||
704 | wire capture_data = frm_begin; //~(rbuffer_rd_out | rbuffer_empty ) | ; | |
705 | ||
706 | ||
707 | initial begin | |
708 | data1_rdy=0; | |
709 | data2_rdy=0; | |
710 | status1_rdy=0; | |
711 | status2_rdy=0; | |
712 | end | |
713 | ||
714 | ||
715 | `ifdef FBDIMM_FAST_NB | |
716 | ||
717 | reg ddrio_nbencode_rd_d1; | |
718 | reg ddrio_nbencode_rd_d2; | |
719 | reg ddrio_nbencode_rd_d3; | |
720 | reg ddrio_nbencode_rd_d4; | |
721 | reg ddrio_nbencode_rd_d5; | |
722 | reg ddrio_nbencode_rd_d6; | |
723 | reg ddrio_nbencode_rd_d7; | |
724 | reg ddrio_nbencode_rd_d8; | |
725 | reg ddrio_nbencode_rd_d9; | |
726 | reg ddrio_nbencode_rd_d10; | |
727 | reg ddrio_nbencode_rd_d11; | |
728 | reg ddrio_nbencode_rd_d12; | |
729 | reg ddrio_nbencode_rd_d13; | |
730 | wire ddrio_nbencode_rd_d18; | |
731 | reg ddrio_nbencode_rd_d19; | |
732 | reg ddrio_nbencode_rd_d20; | |
733 | reg ddrio_nbencode_rd_d21; | |
734 | reg ddrio_nbencode_rd_d22; | |
735 | ||
736 | shifter_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 | ||
742 | always@(posedge dram_2x_clk ) | |
743 | begin | |
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 | ||
749 | end | |
750 | ||
751 | reg ddrio_nbencode_rd_a; | |
752 | ||
753 | always@(posedge frm_boundary_sb ) | |
754 | begin | |
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 | ||
773 | end | |
774 | ||
775 | always@(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 | /* | |
785 | always@(posedge frm_boundary ) | |
786 | begin | |
787 | end | |
788 | */ | |
789 | ||
790 | always@(negedge frm_begin ) | |
791 | begin | |
792 | E1_d <= E1; | |
793 | E_d <= E; | |
794 | end | |
795 | ||
796 | //assign DataCRC1 = E1; | |
797 | //assign DataCRC2 = E1; | |
798 | ||
799 | initial pn_curr_state=1; | |
800 | ||
801 | always@(negedge dram_2x_clk ) | |
802 | begin | |
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 | ||
881 | end | |
882 | ||
883 | ||
884 | ||
885 | ||
886 | always@(posedge frm_boundary_sb ) | |
887 | begin | |
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 | ||
904 | end | |
905 | ||
906 | ||
907 | reg data_rdy; | |
908 | reg nb_data_rdy_d ; | |
909 | ||
910 | ||
911 | always@(posedge frm_boundary_sb ) | |
912 | begin | |
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 | ||
927 | end | |
928 | ||
929 | ||
930 | ||
931 | ||
932 | //wire nb_status_rdy_d = nb_status_rdy; | |
933 | reg nb_status_rdy_d; | |
934 | ||
935 | always@(posedge frm_boundary_sb) | |
936 | nb_status_rdy_d<= nb_status_rdy; | |
937 | ||
938 | assign 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; | |
943 | assign 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; | |
949 | assign 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; | |
955 | assign 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; | |
961 | assign 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; | |
967 | assign 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; | |
973 | assign 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; | |
979 | assign 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; | |
985 | assign 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; | |
991 | assign 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; | |
997 | assign 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; | |
1003 | assign 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 | ||
1012 | assign pn0_out = 14'h0; | |
1013 | assign pn1_out = 14'h0; | |
1014 | assign pn2_out = 14'h0; | |
1015 | assign pn3_out = 14'h0; | |
1016 | assign pn4_out = 14'h0; | |
1017 | assign pn5_out = 14'h0; | |
1018 | assign pn6_out = 14'h0; | |
1019 | assign pn7_out = 14'h0; | |
1020 | assign pn8_out = 14'h0; | |
1021 | assign pn9_out = 14'h0; | |
1022 | assign pn10_out = 14'h0; | |
1023 | assign pn11_out = 14'h0; | |
1024 | ||
1025 | always@(posedge link_clk) | |
1026 | pn_curr_state <= pn_next_state; | |
1027 | ||
1028 | always@(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 | |
1038 | always@(negedge link_clk) // pn_curr_state or send_status_frm_shft or config_reg_rd or rbuffer_empty | |
1039 | begin | |
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 | |
1596 | end | |
1597 | ||
1598 | `endif // FBDIMM_FAST | |
1599 | ||
1600 | `ifdef FBDIMM_FAST_IDLE | |
1601 | ||
1602 | idle_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 | ||
1620 | assign pn_bus_alert_frame0 = (pn0_idle_frame !== 14'h0) ? ~pn0_idle_frame : 14'h0; | |
1621 | assign pn_bus_alert_frame1 = (pn1_idle_frame !== 14'h0) ? ~pn1_idle_frame : 14'h0; | |
1622 | assign pn_bus_alert_frame2 = (pn2_idle_frame !== 14'h0) ? ~pn2_idle_frame : 14'h0; | |
1623 | assign pn_bus_alert_frame3 = (pn3_idle_frame !== 14'h0) ? ~pn3_idle_frame : 14'h0; | |
1624 | assign pn_bus_alert_frame4 = (pn4_idle_frame !== 14'h0) ? ~pn4_idle_frame : 14'h0; | |
1625 | assign pn_bus_alert_frame5 = (pn5_idle_frame !== 14'h0) ? ~pn5_idle_frame : 14'h0; | |
1626 | assign pn_bus_alert_frame6 = (pn6_idle_frame !== 14'h0) ? ~pn6_idle_frame : 14'h0; | |
1627 | assign pn_bus_alert_frame7 = (pn7_idle_frame !== 14'h0) ? ~pn7_idle_frame : 14'h0; | |
1628 | assign pn_bus_alert_frame8 = (pn8_idle_frame !== 14'h0) ? ~pn8_idle_frame : 14'h0; | |
1629 | assign pn_bus_alert_frame9 = (pn9_idle_frame !== 14'h0) ? ~pn9_idle_frame : 14'h0; | |
1630 | assign pn_bus_alert_frame10 = (pn10_idle_frame !== 14'h0) ? ~pn10_idle_frame : 14'h0; | |
1631 | assign pn_bus_alert_frame11 = (pn11_idle_frame !== 14'h0) ? ~pn11_idle_frame : 14'h0; | |
1632 | ||
1633 | ||
1634 | `else | |
1635 | assign pn_bus_alert_frame = (pn_idle_frame !== 14'h0) ? ~pn_idle_frame : 14'h0; | |
1636 | ||
1637 | ||
1638 | ||
1639 | // Idle frame generator module | |
1640 | idle_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 | |
1653 | crc nb_crc_gen2( .b (B1 ), | |
1654 | .E_out (E1) , | |
1655 | .failover ( nb_config !== 4'hf) ); | |
1656 | ||
1657 | `endif | |
1658 | ||
1659 | // CRC calculator for data | |
1660 | crc nb_crc_gen( .b (B ), | |
1661 | .E_out (E), | |
1662 | .failover ( nb_config !== 4'hf) ); | |
1663 | ||
1664 | wire [7:0] status_delay = 8'h84; | |
1665 | ||
1666 | ||
1667 | ||
1668 | ||
1669 | `ifdef AXIS_FBDIMM_NO_FSR | |
1670 | `else | |
1671 | dff_fbd #(1) ff1( .signal_in (send_status_frm), | |
1672 | .signal_out (send_status_frm_d[1]), | |
1673 | .clk (link_clk)); | |
1674 | dff_fbd #(1) ff2( .signal_in (send_status_frm_d[1]), | |
1675 | .signal_out (send_status_frm_d[2]), | |
1676 | .clk (link_clk)); | |
1677 | dff_fbd #(1) ff3( .signal_in (send_status_frm_d[2]), | |
1678 | .signal_out (send_status_frm_d[3]), | |
1679 | .clk (link_clk)); | |
1680 | dff_fbd #(1) ff4( .signal_in (send_status_frm_d[3]), | |
1681 | .signal_out (send_status_frm_d[4]), | |
1682 | .clk (link_clk)); | |
1683 | dff_fbd #(1) ff5( .signal_in (send_status_frm_d[4]), | |
1684 | .signal_out (send_status_frm_d[5]), | |
1685 | .clk (link_clk)); | |
1686 | dff_fbd #(1) ff6( .signal_in (send_status_frm_d[5]), | |
1687 | .signal_out (send_status_frm_d[6]), | |
1688 | .clk (link_clk)); | |
1689 | dff_fbd #(1) ff7( .signal_in (send_status_frm_d[6]), | |
1690 | .signal_out (send_status_frm_d[7]), | |
1691 | .clk (link_clk)); | |
1692 | dff_fbd #(1) ff8( .signal_in (send_status_frm_d[7]), | |
1693 | .signal_out (send_status_frm_d[8]), | |
1694 | .clk (link_clk)); | |
1695 | dff_fbd #(1) ff9( .signal_in (send_status_frm_d[8]), | |
1696 | .signal_out (send_status_frm_d[9]), | |
1697 | .clk (link_clk)); | |
1698 | dff_fbd #(1) ff10( .signal_in (send_status_frm_d[9]), | |
1699 | .signal_out (send_status_frm_d[10]), | |
1700 | .clk (link_clk)); | |
1701 | dff_fbd #(1) ff11( .signal_in (send_status_frm_d[10]), | |
1702 | .signal_out (send_status_frm_d[11]), | |
1703 | .clk (link_clk)); | |
1704 | dff_fbd #(1) ff12( .signal_in (send_status_frm_d[11]), | |
1705 | .signal_out (send_status_frm_d[12]), | |
1706 | .clk (link_clk)); | |
1707 | dff_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 | ||
1713 | wire [NB_LINK-1:0] pn_shft_wire; | |
1714 | reg [7:0] fbdreg_local_cmd_to_data,fbdreg_local_cmd_to_data_inc; | |
1715 | ||
1716 | initial begin | |
1717 | fbdreg_local_cmd_to_data =0; | |
1718 | fbdreg_local_cmd_to_data_inc=0; | |
1719 | end | |
1720 | ||
1721 | wire [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 | |
1726 | always@(posedge link_clk) begin | |
1727 | if ( 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 | |
1736 | end | |
1737 | `endif | |
1738 | ||
1739 | wire [9:0] delay_cfg_reg = delay_reg + 10'd136; | |
1740 | ||
1741 | `ifdef AXIS_FBDIMM_NO_FSR | |
1742 | wire [9:0] sync_delay_reg = delay_reg + ( sync_cmd[12:11] * 3) + 10'd36 ; | |
1743 | ||
1744 | shifter #(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 | ||
1750 | shifter #(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 | ||
1757 | reg [3:0] sb_nb_diff_reg; | |
1758 | reg start_counter; | |
1759 | wire diff_detected = (sb_nb_diff_reg !== 1); | |
1760 | reg diff_complete; | |
1761 | ||
1762 | `ifdef STINGRAY | |
1763 | shifter_p #(1) config_rd_ctrl_shft ( .signal_in (config_reg_rd ), | |
1764 | `else | |
1765 | shifter_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 | ||
1771 | shifter #(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 | |
1777 | shifter_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 | |
1783 | shifter_p #(NB_LINK) shft (.signal_in ( pn), | |
1784 | `else | |
1785 | shifter_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 | ||
1793 | initial diff_complete =0; | |
1794 | ||
1795 | `ifdef FBDIMM_FAST_NB | |
1796 | wire [9:0] sync_delay_reg = ((drc[7:4]+drc[3:0]) * 12 ) + ( sync_cmd[12:11] * 10'd12 ) + 10'd55 + 10'd36 ; | |
1797 | `else | |
1798 | wire [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 | ||
1803 | always@(negedge link_clk ) if ( ~init & !diff_complete ) | |
1804 | begin | |
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 | ||
1816 | end | |
1817 | else start_counter <= 0; | |
1818 | ||
1819 | always@(negedge link_clk ) if ( ~init ) | |
1820 | begin | |
1821 | if ( start_counter ) | |
1822 | sb_nb_diff_reg <= sb_nb_diff_reg + 1; | |
1823 | end | |
1824 | else | |
1825 | sb_nb_diff_reg <= 1; | |
1826 | ||
1827 | `endif | |
1828 | ||
1829 | ||
1830 | shifter #(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 | ||
1836 | shifter_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 | ||
1843 | always@(negedge frm_boundary_sb ) | |
1844 | begin | |
1845 | failover_nb_14 <= (nb_config != 4'hf ); | |
1846 | end | |
1847 | ||
1848 | ||
1849 | endmodule | |
1850 |