Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / niu / rtl / niu_pio_virt_decode.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: niu_pio_virt_decode.v
4// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
5// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
6//
7// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8//
9// This program is free software; you can redistribute it and/or modify
10// it under the terms of the GNU General Public License as published by
11// the Free Software Foundation; version 2 of the License.
12//
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21//
22// For the avoidance of doubt, and except that if any non-GPL license
23// choice is available it will apply instead, Sun elects to use only
24// the General Public License version 2 (GPLv2) at this time for any
25// software where a choice of GPL license versions is made
26// available with the language indicating that GPLv2 or any later version
27// may be used, or where a choice of which version of the GPL is applied is
28// otherwise unspecified.
29//
30// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
31// CA 95054 USA or visit www.sun.com if you need additional information or
32// have any questions.
33//
34// ========== Copyright Header End ============================================
35/*%W% %G%*/
36
37/*****************************************************************
38 *
39 * File Name : niu_pio_virt_decode.v
40 * Author Name : Maya Suresh
41 * Description : Virtualization Decoder
42 *
43 * Parent Module: niu_pio_regs.v
44 * Child Module:
45 * Interface Mod:
46 * Date Created : 04/25/05
47 *
48 * Copyright (c) 2020, Sun Microsystems, Inc.
49 * Sun Proprietary and Confidential
50 *
51 * Modification :
52 *
53 ****************************************************************/
54
55module niu_pio_virt_decode (
56 // Outputs
57 virt_addr, pio_virt_sel_ok, fflp_virt_sel_ok,
58 dma_virt_sel_ok,
59 // Inputs
60 addr, fc0_v, fc1_v, fc2_v, fc3_v
61 );
62
63output [26:0] virt_addr ;
64output pio_virt_sel_ok ;
65output fflp_virt_sel_ok ;
66output dma_virt_sel_ok;
67
68input [26:0] addr ;
69input fc0_v ;
70input fc1_v ;
71input fc2_v ;
72input fc3_v ;
73
74reg [26:0] virt_addr ;
75reg pio_virt_sel_ok ;
76reg fflp_virt_sel_ok ;
77reg dma_virt_sel_ok;
78
79always @ (addr or
80 fc0_v or
81 fc1_v or
82 fc2_v or
83 fc3_v )
84 begin
85 virt_addr[26:0] = 27'b0;
86 pio_virt_sel_ok = 1'b0 ;
87 fflp_virt_sel_ok = 1'b0 ;
88 dma_virt_sel_ok = 1'b0 ;
89
90 // Function Zero Virtualization
91 if (fc0_v) // Function Zero Virtualization Decode
92 begin
93
94 // Code for DMA Virtualization
95 if (addr[23:13] == 11'b0000_0000_000)
96 begin
97 virt_addr[26:0] = addr[26:0];
98 dma_virt_sel_ok = 1'b1 ;
99 end
100 if (addr[23:13] == 11'b0000_0000_010)
101 begin
102 virt_addr[26:0] = addr[26:0];
103 dma_virt_sel_ok = 1'b1 ;
104 end
105 // END
106
107 if (addr[15:8] == 8'b0010_0000)
108 begin
109 virt_addr[23:0] = {8'b1000_0000,addr[7:5],8'b0,addr[4:0]};
110 virt_addr[26:24]= addr[26:24];
111 pio_virt_sel_ok = 1'b1 ;
112 end
113
114 if (addr[15:8] == 8'b0110_0000)
115 begin
116 virt_addr[23:0] = {8'b1000_0001,addr[7:5],8'b0,addr[4:0]};
117 virt_addr[26:24]= addr[26:24];
118 pio_virt_sel_ok = 1'b1 ;
119 end
120
121 if (addr[15:0] == 16'b0010_0001_0000_0000)
122 begin
123 virt_addr[23:0] = {4'b0011,20'b0};
124 virt_addr[26:24]= addr[26:24];
125 fflp_virt_sel_ok = 1'b1 ;
126 end
127 if (addr[15:0] == 16'b0010_0001_0000_1000)
128 begin
129 virt_addr[23:0] = {4'b0011,16'b0,4'b1000};
130 virt_addr[26:24]= addr[26:24];
131 fflp_virt_sel_ok = 1'b1 ;
132 end
133 if (addr[15:0] == 16'b0010_0001_0001_0000)
134 begin
135 virt_addr[23:0] = {4'b0011,12'b0,4'b0001,4'b0000};
136 virt_addr[26:24]= addr[26:24];
137 fflp_virt_sel_ok = 1'b1 ;
138 end
139
140 if (addr[15:0] == 16'b0110_0001_0000_0000)
141 begin
142 virt_addr[23:0] = {4'b0011,4'b0000,4'b0010,12'b0};
143 virt_addr[26:24]= addr[26:24];
144 fflp_virt_sel_ok = 1'b1 ;
145 end
146 if (addr[15:0] == 16'b0110_0001_0000_1000)
147 begin
148 virt_addr[23:0] = {4'b0011,4'b0000,4'b0010,8'b0,4'b1000};
149 virt_addr[26:24]= addr[26:24];
150 fflp_virt_sel_ok = 1'b1 ;
151 end
152 if (addr[15:0] == 16'b0110_0001_0001_0000)
153 begin
154 fflp_virt_sel_ok = 1'b1 ;
155 virt_addr[23:0] = {4'b0011,4'b0000,4'b0010,4'b0000,4'b0001,4'b0000};
156 virt_addr[26:24]= addr[26:24];
157 end
158 end
159
160 // Function One Virtualization
161 if (fc1_v) // Function Zero Virtualization Decode
162 begin
163
164 // Code for DMA Virtualization
165 if (addr[23:13] == 11'b0000_0000_000)
166 begin
167 virt_addr[26:0] = addr[26:0];
168 dma_virt_sel_ok = 1'b1 ;
169 end
170 if (addr[23:13] == 11'b0000_0000_010)
171 begin
172 virt_addr[26:0] = addr[26:0];
173 dma_virt_sel_ok = 1'b1 ;
174 end
175 // END
176
177 if (addr[15:8] == 8'b0010_0000)
178 begin
179 virt_addr[23:0] = {8'b1000_0010,addr[7:5],8'b0,addr[4:0]};
180 virt_addr[26:24]= addr[26:24];
181 pio_virt_sel_ok = 1'b1 ;
182 end
183 if (addr[15:8] == 8'b0110_0000)
184 begin
185 virt_addr[23:0] = {8'b1000_0011,addr[7:5],8'b0,addr[4:0]};
186 virt_addr[26:24]= addr[26:24];
187 pio_virt_sel_ok = 1'b1 ;
188 end
189
190 if (addr[15:0] == 16'b0010_0001_0000_0000)
191 begin
192 virt_addr[23:0] = {4'b0011,4'b0000,4'b0100,8'b0,4'b0000};
193 virt_addr[26:24]= addr[26:24];
194 fflp_virt_sel_ok = 1'b1 ;
195 end
196 if (addr[15:0] == 16'b0010_0001_0000_1000)
197 begin
198 virt_addr[23:0] = {4'b0011,4'b0000,4'b0100,8'b0,4'b1000};
199 virt_addr[26:24]= addr[26:24];
200 fflp_virt_sel_ok = 1'b1 ;
201 end
202 if (addr[15:0] == 16'b0010_0001_0001_0000)
203 begin
204 virt_addr[23:0] = {4'b0011,4'b0000,4'b0100,4'b0,4'b0001,4'b0000};
205 virt_addr[26:24]= addr[26:24];
206 fflp_virt_sel_ok = 1'b1 ;
207 end
208
209 if (addr[15:0] == 16'b0110_0001_0000_0000)
210 begin
211 virt_addr[23:0] = {4'b0011,4'b0000,4'b0110,8'b0,4'b0000};
212 virt_addr[26:24]= addr[26:24];
213 fflp_virt_sel_ok = 1'b1 ;
214 end
215 if (addr[15:0] == 16'b0110_0001_0000_1000)
216 begin
217 virt_addr[23:0] = {4'b0011,4'b0000,4'b0110,8'b0,4'b1000};
218 virt_addr[26:24]= addr[26:24];
219 fflp_virt_sel_ok = 1'b1 ;
220 end
221 if (addr[15:0] == 16'b0110_0001_0001_0000)
222 begin
223 virt_addr[23:0] = {4'b0011,4'b0000,4'b0110,4'b0,4'b0001,4'b0000};
224 virt_addr[26:24]= addr[26:24];
225 fflp_virt_sel_ok = 1'b1 ;
226 end
227 end
228
229 // Function Two Virtualization
230 if (fc2_v) // Function Zero Virtualization Decode
231 begin
232
233 // Code for DMA Virtualization
234 if (addr[23:13] == 11'b0000_0000_000)
235 begin
236 virt_addr[26:0] = addr[26:0];
237 dma_virt_sel_ok = 1'b1 ;
238 end
239 if (addr[23:13] == 11'b0000_0000_010)
240 begin
241 virt_addr[26:0] = addr[26:0];
242 dma_virt_sel_ok = 1'b1 ;
243 end
244 // END
245
246 if (addr[15:8] == 8'b0010_0000)
247 begin
248 virt_addr[23:0] = {8'b1000_0100,addr[7:5],8'b0,addr[4:0]};
249 virt_addr[26:24]= addr[26:24];
250 pio_virt_sel_ok = 1'b1 ;
251 end
252 if (addr[15:8] == 8'b0110_0000)
253 begin
254 virt_addr[23:0] = {8'b1000_0101,addr[7:5],8'b0,addr[4:0]};
255 virt_addr[26:24]= addr[26:24];
256 pio_virt_sel_ok = 1'b1 ;
257 end
258
259 if (addr[15:0] == 16'b0010_0001_0000_0000)
260 begin
261 virt_addr[23:0] = {4'b0011,4'b0000,4'b1000,8'b0,4'b0000};
262 virt_addr[26:24]= addr[26:24];
263 fflp_virt_sel_ok = 1'b1 ;
264 end
265 if (addr[15:0] == 16'b0010_0001_0000_1000)
266 begin
267 virt_addr[23:0] = {4'b0011,4'b0000,4'b1000,8'b0,4'b1000};
268 virt_addr[26:24]= addr[26:24];
269 fflp_virt_sel_ok = 1'b1 ;
270 end
271 if (addr[15:0] == 16'b0010_0001_0001_0000)
272 begin
273 virt_addr[23:0] = {4'b0011,4'b0000,4'b1000,4'b0,4'b0001,4'b0000};
274 virt_addr[26:24]= addr[26:24];
275 fflp_virt_sel_ok = 1'b1 ;
276 end
277
278 if (addr[15:0] == 16'b0110_0001_0000_0000)
279 begin
280 virt_addr[23:0] = {4'b0011,4'b0000,4'b1010,8'b0,4'b0000};
281 virt_addr[26:24]= addr[26:24];
282 fflp_virt_sel_ok = 1'b1 ;
283 end
284 if (addr[15:0] == 16'b0110_0001_0000_1000)
285 begin
286 virt_addr[23:0] = {4'b0011,4'b0000,4'b1010,8'b0,4'b1000};
287 virt_addr[26:24]= addr[26:24];
288 fflp_virt_sel_ok = 1'b1 ;
289 end
290 if (addr[15:0] == 16'b0110_0001_0001_0000)
291 begin
292 fflp_virt_sel_ok = 1'b1 ;
293 virt_addr[26:24]= addr[26:24];
294 virt_addr[23:0] = {4'b0011,4'b0000,4'b1010,4'b0,4'b0001,4'b0000};
295 end
296 end
297
298 // Function Three Virtualization
299 if (fc3_v) // Function Zero Virtualization Decode
300 begin
301
302 // Code for DMA Virtualization
303 if (addr[23:13] == 11'b0000_0000_000)
304 begin
305 virt_addr[26:0] = addr[26:0];
306 dma_virt_sel_ok = 1'b1 ;
307 end
308 if (addr[23:13] == 11'b0000_0000_010)
309 begin
310 virt_addr[26:0] = addr[26:0];
311 dma_virt_sel_ok = 1'b1 ;
312 end
313 // END
314
315 if (addr[15:8] == 8'b0010_0000)
316 begin
317 virt_addr[23:0] = {8'b1000_0110,addr[7:5],8'b0,addr[4:0]};
318 virt_addr[26:24]= addr[26:24];
319 pio_virt_sel_ok = 1'b1 ;
320 end
321 if (addr[15:8] == 8'b0110_0000)
322 begin
323 virt_addr[23:0] = {8'b1000_0111,addr[7:5],8'b0,addr[4:0]};
324 virt_addr[26:24]= addr[26:24];
325 pio_virt_sel_ok = 1'b1 ;
326 end
327
328 if (addr[15:0] == 16'b0010_0001_0000_0000)
329 begin
330 virt_addr[23:0] = {4'b0011,4'b0000,4'b1100,8'b0,4'b0000};
331 virt_addr[26:24]= addr[26:24];
332 fflp_virt_sel_ok = 1'b1 ;
333 end
334 if (addr[15:0] == 16'b0010_0001_0000_1000)
335 begin
336 virt_addr[23:0] = {4'b0011,4'b0000,4'b1100,8'b0,4'b1000};
337 virt_addr[26:24]= addr[26:24];
338 fflp_virt_sel_ok = 1'b1 ;
339 end
340 if (addr[15:0] == 16'b0010_0001_0001_0000)
341 begin
342 virt_addr[23:0] = {4'b0011,4'b0000,4'b1100,4'b0,4'b0001,4'b0000};
343 virt_addr[26:24]= addr[26:24];
344 fflp_virt_sel_ok = 1'b1 ;
345 end
346
347 if (addr[15:0] == 16'b0110_0001_0000_0000)
348 begin
349 virt_addr[23:0] = {4'b0011,4'b0000,4'b1110,8'b0,4'b0000};
350 virt_addr[26:24]= addr[26:24];
351 fflp_virt_sel_ok = 1'b1 ;
352 end
353 if (addr[15:0] == 16'b0110_0001_0000_1000)
354 begin
355 virt_addr[23:0] = {4'b0011,4'b0000,4'b1110,8'b0,4'b1000};
356 virt_addr[26:24]= addr[26:24];
357 fflp_virt_sel_ok = 1'b1 ;
358 end
359 if (addr[15:0] == 16'b0110_0001_0001_0000)
360 begin
361 fflp_virt_sel_ok = 1'b1 ;
362 virt_addr[26:24]= addr[26:24];
363 virt_addr[23:0] = {4'b0011,4'b0000,4'b1110,4'b0,4'b0001,4'b0000};
364 end
365 end
366 end
367
368endmodule // niu_pio_virt_decode
369