Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | // ========== Copyright Header Begin ========================================== |
2 | // | |
3 | // OpenSPARC T2 Processor File: niu_pio_fifo16d.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_fifo16d.v | |
40 | * Author Name : John Lo | |
41 | * Description : This is a 16 deep, 112 bit wide FIFO. | |
42 | * Parent Module: niu | |
43 | * Child Module: | |
44 | * Interface Mod: many. | |
45 | * Date Created : 3/29/2004 | |
46 | * | |
47 | * Copyright (c) 2020, Sun Microsystems, Inc. | |
48 | * Sun Proprietary and Confidential | |
49 | * | |
50 | * Modification : | |
51 | * | |
52 | * Synthesis Notes: | |
53 | * | |
54 | *************************************************************************/ | |
55 | `include "niu_pio.h" | |
56 | ||
57 | module niu_pio_fifo16d( | |
58 | clk, | |
59 | reset, | |
60 | rd, | |
61 | wr, | |
62 | din, | |
63 | dout, | |
64 | pio_peu_afull, | |
65 | full, | |
66 | empty, | |
67 | rd_ptr, | |
68 | wr_ptr | |
69 | ); | |
70 | ||
71 | /* 0in fifo | |
72 | -enq wr | |
73 | -deq rd | |
74 | -depth 16 | |
75 | -value -enq_data din -deq_data dout | |
76 | -clock clk | |
77 | -reset reset | |
78 | -message "0in-ERROR : niu_pio FIFO 16d failed" | |
79 | */ | |
80 | ||
81 | input clk; | |
82 | input reset; | |
83 | input rd; | |
84 | input wr; | |
85 | input [`PIO_FIFO_W_R] din; | |
86 | output [`PIO_FIFO_W_R] dout; | |
87 | output pio_peu_afull; | |
88 | output full; | |
89 | output empty; | |
90 | output [`PIO_FIFO_PTR] rd_ptr; | |
91 | output [`PIO_FIFO_PTR] wr_ptr; | |
92 | ||
93 | wire ld0; | |
94 | wire ld1; | |
95 | wire ld2; | |
96 | wire ld3; | |
97 | wire ld4; | |
98 | wire ld5; | |
99 | wire ld6; | |
100 | wire ld7; | |
101 | wire ld8; | |
102 | wire ld9; | |
103 | wire lda; | |
104 | wire ldb; | |
105 | wire ldc; | |
106 | wire ldd; | |
107 | wire lde; | |
108 | wire ldf; | |
109 | wire [`PIO_FIFO_W_R] word0; | |
110 | wire [`PIO_FIFO_W_R] word1; | |
111 | wire [`PIO_FIFO_W_R] word2; | |
112 | wire [`PIO_FIFO_W_R] word3; | |
113 | wire [`PIO_FIFO_W_R] word4; | |
114 | wire [`PIO_FIFO_W_R] word5; | |
115 | wire [`PIO_FIFO_W_R] word6; | |
116 | wire [`PIO_FIFO_W_R] word7; | |
117 | wire [`PIO_FIFO_W_R] word8; | |
118 | wire [`PIO_FIFO_W_R] word9; | |
119 | wire [`PIO_FIFO_W_R] worda; | |
120 | wire [`PIO_FIFO_W_R] wordb; | |
121 | wire [`PIO_FIFO_W_R] wordc; | |
122 | wire [`PIO_FIFO_W_R] wordd; | |
123 | wire [`PIO_FIFO_W_R] worde; | |
124 | wire [`PIO_FIFO_W_R] wordf; | |
125 | wire [`PIO_FIFO_PTR] rd_ptr; | |
126 | wire [`PIO_FIFO_PTR] wr_ptr; | |
127 | wire [`PIO_FIFO_W_R] din; | |
128 | reg [`PIO_FIFO_W_R] dout; | |
129 | ||
130 | wire full = (rd_ptr[`PIO_FIFO_A_R] == wr_ptr[`PIO_FIFO_A_R]) & (rd_ptr[`PIO_FIFO_A]!=wr_ptr[`PIO_FIFO_A]); | |
131 | ||
132 | wire empty = (rd_ptr[`PIO_FIFO_PTR] == wr_ptr[`PIO_FIFO_PTR]); | |
133 | ||
134 | wire [`PIO_FIFO_PTR] empty_space = | |
135 | (wr_ptr[`PIO_FIFO_A] == rd_ptr[`PIO_FIFO_A]) ? | |
136 | `PIO_FIFO_D - ({1'b0,wr_ptr[`PIO_FIFO_A_R]} - {1'b0,rd_ptr[`PIO_FIFO_A_R]}): | |
137 | ({1'b0,rd_ptr[`PIO_FIFO_A_R]} - {1'b0,wr_ptr[`PIO_FIFO_A_R]}) ; | |
138 | ||
139 | wire afull = empty_space < 5'd2; | |
140 | reg pio_peu_afull; | |
141 | ||
142 | always @ (posedge clk) | |
143 | begin | |
144 | if (reset) | |
145 | pio_peu_afull <= 1'b0; | |
146 | else | |
147 | pio_peu_afull <= afull; | |
148 | end | |
149 | ||
150 | wire wr_en = ~full & wr; | |
151 | wire rd_en = ~empty & rd; | |
152 | ||
153 | wire [`PIO_FIFO_PTR] wr_ptr_in = wr_en ? wr_ptr + 1 : wr_ptr; | |
154 | wire [`PIO_FIFO_PTR] rd_ptr_in = rd_en ? rd_ptr + 1 : rd_ptr; | |
155 | dffr #(5) wr_ptr_dffr(.d(wr_ptr_in),.reset(reset),.clk(clk),.q(wr_ptr)); | |
156 | dffr #(5) rd_ptr_dffr(.d(rd_ptr_in),.reset(reset),.clk(clk),.q(rd_ptr)); | |
157 | ||
158 | assign ld0 = ((wr_ptr[`PIO_FIFO_A_R] == 4'h0) & wr_en); | |
159 | assign ld1 = ((wr_ptr[`PIO_FIFO_A_R] == 4'h1) & wr_en); | |
160 | assign ld2 = ((wr_ptr[`PIO_FIFO_A_R] == 4'h2) & wr_en); | |
161 | assign ld3 = ((wr_ptr[`PIO_FIFO_A_R] == 4'h3) & wr_en); | |
162 | assign ld4 = ((wr_ptr[`PIO_FIFO_A_R] == 4'h4) & wr_en); | |
163 | assign ld5 = ((wr_ptr[`PIO_FIFO_A_R] == 4'h5) & wr_en); | |
164 | assign ld6 = ((wr_ptr[`PIO_FIFO_A_R] == 4'h6) & wr_en); | |
165 | assign ld7 = ((wr_ptr[`PIO_FIFO_A_R] == 4'h7) & wr_en); | |
166 | assign ld8 = ((wr_ptr[`PIO_FIFO_A_R] == 4'h8) & wr_en); | |
167 | assign ld9 = ((wr_ptr[`PIO_FIFO_A_R] == 4'h9) & wr_en); | |
168 | assign lda = ((wr_ptr[`PIO_FIFO_A_R] == 4'ha) & wr_en); | |
169 | assign ldb = ((wr_ptr[`PIO_FIFO_A_R] == 4'hb) & wr_en); | |
170 | assign ldc = ((wr_ptr[`PIO_FIFO_A_R] == 4'hc) & wr_en); | |
171 | assign ldd = ((wr_ptr[`PIO_FIFO_A_R] == 4'hd) & wr_en); | |
172 | assign lde = ((wr_ptr[`PIO_FIFO_A_R] == 4'he) & wr_en); | |
173 | assign ldf = ((wr_ptr[`PIO_FIFO_A_R] == 4'hf) & wr_en); | |
174 | ||
175 | dffre #(`PIO_FIFO_W) word0_dffr(.d(din),.reset(reset),.en(ld0),.clk(clk),.q(word0)); | |
176 | dffre #(`PIO_FIFO_W) word1_dffr(.d(din),.reset(reset),.en(ld1),.clk(clk),.q(word1)); | |
177 | dffre #(`PIO_FIFO_W) word2_dffr(.d(din),.reset(reset),.en(ld2),.clk(clk),.q(word2)); | |
178 | dffre #(`PIO_FIFO_W) word3_dffr(.d(din),.reset(reset),.en(ld3),.clk(clk),.q(word3)); | |
179 | dffre #(`PIO_FIFO_W) word4_dffr(.d(din),.reset(reset),.en(ld4),.clk(clk),.q(word4)); | |
180 | dffre #(`PIO_FIFO_W) word5_dffr(.d(din),.reset(reset),.en(ld5),.clk(clk),.q(word5)); | |
181 | dffre #(`PIO_FIFO_W) word6_dffr(.d(din),.reset(reset),.en(ld6),.clk(clk),.q(word6)); | |
182 | dffre #(`PIO_FIFO_W) word7_dffr(.d(din),.reset(reset),.en(ld7),.clk(clk),.q(word7)); | |
183 | dffre #(`PIO_FIFO_W) word8_dffr(.d(din),.reset(reset),.en(ld8),.clk(clk),.q(word8)); | |
184 | dffre #(`PIO_FIFO_W) word9_dffr(.d(din),.reset(reset),.en(ld9),.clk(clk),.q(word9)); | |
185 | dffre #(`PIO_FIFO_W) worda_dffr(.d(din),.reset(reset),.en(lda),.clk(clk),.q(worda)); | |
186 | dffre #(`PIO_FIFO_W) wordb_dffr(.d(din),.reset(reset),.en(ldb),.clk(clk),.q(wordb)); | |
187 | dffre #(`PIO_FIFO_W) wordc_dffr(.d(din),.reset(reset),.en(ldc),.clk(clk),.q(wordc)); | |
188 | dffre #(`PIO_FIFO_W) wordd_dffr(.d(din),.reset(reset),.en(ldd),.clk(clk),.q(wordd)); | |
189 | dffre #(`PIO_FIFO_W) worde_dffr(.d(din),.reset(reset),.en(lde),.clk(clk),.q(worde)); | |
190 | dffre #(`PIO_FIFO_W) wordf_dffr(.d(din),.reset(reset),.en(ldf),.clk(clk),.q(wordf)); | |
191 | ||
192 | // read decoder | |
193 | always @(/*AUTOSENSE*/rd_ptr or word0 or word1 or word2 or word3 | |
194 | or word4 or word5 or word6 or word7 or word8 or word9 | |
195 | or worda or wordb or wordc or wordd or worde or wordf) | |
196 | begin | |
197 | case (rd_ptr[`PIO_FIFO_A_R]) | |
198 | 4'h0: dout = word0; | |
199 | 4'h1: dout = word1; | |
200 | 4'h2: dout = word2; | |
201 | 4'h3: dout = word3; | |
202 | 4'h4: dout = word4; | |
203 | 4'h5: dout = word5; | |
204 | 4'h6: dout = word6; | |
205 | 4'h7: dout = word7; | |
206 | 4'h8: dout = word8; | |
207 | 4'h9: dout = word9; | |
208 | 4'ha: dout = worda; | |
209 | 4'hb: dout = wordb; | |
210 | 4'hc: dout = wordc; | |
211 | 4'hd: dout = wordd; | |
212 | 4'he: dout = worde; | |
213 | 4'hf: dout = wordf; | |
214 | default: dout = {69'b0,32'hdead_beef}; | |
215 | endcase | |
216 | end | |
217 | ||
218 | endmodule // niu_pio_fifo16d | |
219 | ||
220 | ||
221 |