initial
[fpgammix.git] / rtl / Icarus / idt71v416s10.v
blob35037ae3fa3653fff7edcbc828cae1a6669a4d3a
1 /****************************************************************************
2 * Copyright 1991,1992,1993,1998,1999 Integrated Device Technology Corp.
3 * All right reserved.
5 * This program is proprietary and confidential information of
6 * IDT Corp. and may be used and disclosed only as authorized
7 * in a license agreement controlling such use and disclosure.
9 * IDT reserves the right to make any changes to
10 * the product herein to improve function or design.
11 * IDT does not assume any liability arising out of
12 * the application or use of the product herein.
14 * WARNING: The unlicensed shipping, mailing, or carring of this
15 * technical data outside the United States, or the unlicensed
16 * disclosure, by whatever means, through visits abroad, or the
17 * unlicensed disclosure to foreign national in the United States,
18 * may violate the United States criminal law.
20 * File Name : idt71v416s10.v
21 * Function : 256Kx16-bit Asynchronous Static RAM
22 * Simulation Tool/Version : Verilog-XL 2.5
24 ***************************************************************************/
26 /*******************************************************************************
27 * Module Name: idt71v416s10
28 * Description: 256Kx16 10ns Asynchronous Static RAM
29 * Revision : rev00
30 * Date : 06/08/99
31 * Notes : This model is believed to be functionally
32 * accurate. Please direct any inquiries to
33 * IDT SRAM Applications at: sramhelp@idt.com
35 *******************************************************************************/
36 `timescale 1ns/10ps
38 module idt71v416s10(data, addr, we_, oe_, cs_, ble_, bhe_);
39 inout [15:0] data;
40 input [17:0] addr;
41 input we_, oe_, cs_, bhe_, ble_;
43 //Read Cycle Parameters
44 parameter Taa = 10; // address access time
45 parameter Tacs = 10; // cs_ access time
46 parameter Tclz = 4; // cs_ to output low Z time
47 parameter Tchz = 5; // cs_ to output high Z time
48 parameter Toe = 5; // oe_ to output time
49 parameter Tohz = 5; // oe_ to output Z time
50 parameter Toh = 4; // data hold from adr change time
51 parameter Tbe = 5; // we_ to output valid time
53 //Write Cycle Parameters
54 parameter Taw = 8; // adr valid to end of write time
55 parameter Tcw = 8; // cs_ to end of write time
56 parameter Tbw = 8; // ble_/bhe_ to end of write time
57 parameter Tas = 0; // address set up time
58 parameter Twp = 8; // write pulse width min
59 parameter Tdw = 5; // data valid to end of writ time
60 parameter Tow = 3; // data act from end of writ time
61 parameter Twhz = 6; // we_ to output in high Z time
64 reg [7:0] mem1[0:262143];
65 reg [7:0] mem2[0:262143];
67 time adr_chng,da_chng,we_fall,we_rise,cs_fall,cs_rise;
68 time oe_fall,oe_rise,ble_fall,ble_rise,bhe_fall,bhe_rise;
70 wire [15:0] data_in;
71 reg [15:0] data_out;
72 reg [15:0] temp1,temp2,temp3;
73 reg outen, out_en, in_en;
75 reg [31:0] ii;
76 initial
77 begin
78 /* Begin Tommy's hack. */
79 for (ii = 0; ii <= 262143; ii = ii + 1) begin
80 mem1[ii] = 'hE1;
81 mem2[ii] = 'hE2;
82 end
83 /* End Tommy's hack. */
84 in_en = 1'b1;
85 if (cs_)
86 out_en = 1'b0;
87 end
89 // input/output control logic
90 //---------------------------
91 assign data = out_en ? data_out : 'hzzzz;
92 assign data_in = in_en ? data : 'hzzzz;
94 // always @*
95 // $display("%5d SRAM addr %x data_in %x data %x we_ %x bhe_ %x ble_ %x",
96 // $time, addr, data_in, data, we_, bhe_, ble_);
99 // read access
100 //------------
101 always @(addr)
102 if (cs_==0 & we_==1) begin //read
103 fork
104 if(~ble_)
105 #Taa data_out[7:0] = mem1[addr];
106 else #Taa data_out[7:0] = 'hzz;
107 if(~bhe_)
108 #Taa data_out[15:8] = mem2[addr];
109 else #Taa data_out[15:8] = 'hzz;
110 join
112 always @(addr)
113 begin
114 adr_chng = $time;
116 outen = 1'b0;
117 #Toh out_en = outen;
119 //---------------------------------------------
120 if (cs_==0 & we_==1) //read
121 begin
122 if (oe_==0)
123 begin
124 outen = 1'b1;
125 out_en = 1'b1;
128 //---------------------------------------------
129 if (cs_==0 & we_==0) //write
130 begin
131 if (oe_==0)
132 begin
133 outen = 1'b0;
134 out_en = 1'b0;
135 temp1 = data_in;
136 fork
137 if(~ble_)
138 #Tdw mem1[addr] = temp1[7:0];
139 if(~bhe_)
140 #Tdw mem2[addr] = temp1[15:8];
141 join
143 else
144 begin
145 outen = 1'b0;
146 out_en = 1'b0;
147 temp1 = data_in;
148 fork
149 if(~ble_)
150 #(Tdw-Toh) mem1[addr] = temp1[7:0];
151 if(~bhe_)
152 #(Tdw-Toh) mem2[addr] = temp1[15:8];
153 join
156 if(~ble_)
157 data_out[7:0] = mem1[addr];
158 else data_out[7:0] = 'hzz;
159 if(~bhe_)
160 data_out[15:8] = mem2[addr];
161 else data_out[15:8] = 'hzz;
165 always @(negedge cs_)
166 begin
167 cs_fall = $time;
169 if (cs_fall - adr_chng < Tas)
170 $display($time, " Adr setup time is not enough Tas");
172 if (we_==1 & oe_==0)
173 outen = 1'b1;
174 #Tclz out_en = outen;
176 if (we_==1) begin
177 fork
178 if(~ble_)
179 #(Tacs-Tclz) data_out[7:0] = mem1[addr];
180 else #(Tacs-Tclz) data_out[7:0] = 'hzz;
181 if(~bhe_)
182 #(Tacs-Tclz) data_out[15:8] = mem2[addr];
183 else #(Tacs-Tclz) data_out[15:8] = 'hzz;
184 join
187 if (we_==0)
188 begin
189 outen = 1'b0;
190 out_en = 1'b0;
191 temp2 = data_in;
192 fork
193 if(~ble_)
194 #Tdw mem1[addr] = temp2[7:0];
195 if(~bhe_)
196 #Tdw mem2[addr] = temp2[15:8];
197 join
201 always @(posedge cs_)
202 begin
203 cs_rise = $time;
205 if (we_==0)
206 begin
207 if (cs_rise - adr_chng < Taw)
208 begin
209 if(~ble_)
210 mem1[addr] = 8'hxx;
211 if(~bhe_)
212 mem2[addr] = 8'hxx;
213 $display($time, " Adr valid to end of write is not enough Taw");
216 if (cs_rise - cs_fall < Tcw)
217 begin
218 if(~ble_)
219 mem1[addr] = 8'hxx;
220 if(~bhe_)
221 mem2[addr] = 8'hxx;
222 $display($time, " cs_ to end of write is not enough Tcw");
225 if (cs_rise - da_chng < Tdw)
226 begin
227 if(~ble_)
228 mem1[addr] = 8'hxx;
229 if(~bhe_)
230 mem2[addr] = 8'hxx;
231 $display($time, " Data setup is not enough_1");
235 outen = 1'b0;
236 #Tchz out_en = outen;
240 always @(negedge oe_)
241 begin
242 oe_fall = $time;
244 if(~ble_)
245 data_out[7:0] = mem1[addr];
246 else data_out[7:0] = 'hzz;
247 if(~bhe_)
248 data_out[15:8] = mem2[addr];
249 else data_out[15:8] = 'hzz;
251 if (we_==1 & cs_==0)
252 outen = 1'b1;
253 #Toe out_en = outen;
256 always @(posedge oe_)
257 begin
258 oe_rise = $time;
260 outen = 1'b0;
261 #Tohz out_en = outen;
264 // write to ram
265 //-------------
266 always @(negedge we_)
267 begin
268 we_fall = $time;
270 if (we_fall - adr_chng < Tas)
271 $display($time, " Address set-up to WE low is not enough");
273 if (cs_==0 & oe_==0)
274 begin
275 outen = 1'b0;
276 #Twhz out_en = outen;
277 temp3 = data_in;
278 fork
279 if(~ble_)
280 #Tdw mem1[addr] = temp3[7:0];
281 if(~bhe_)
282 #Tdw mem2[addr] = temp3[15:8];
283 join
285 if(~ble_)
286 data_out[7:0] = mem1[addr];
287 else data_out[7:0] = 'hzz;
288 if(~bhe_)
289 data_out[15:8] = mem2[addr];
290 else data_out[15:8] = 'hzz;
293 if (cs_==0 & oe_==1)
294 begin
295 outen = 1'b0;
296 out_en = 1'b0;
297 temp3 = data_in;
298 fork
299 if(~ble_)
300 #Tdw mem1[addr] = temp3[7:0];
301 if(~bhe_)
302 #Tdw mem2[addr] = temp3[15:8];
303 join
305 if(~ble_)
306 data_out[7:0] = mem1[addr];
307 else data_out[7:0] = 'hzz;
308 if(~bhe_)
309 data_out[15:8] = mem2[addr];
310 else data_out[15:8] = 'hzz;
314 always @(posedge we_)
315 begin
316 we_rise = $time;
318 if (cs_==0)
319 begin
320 if (we_rise - da_chng < Tdw)
321 begin
322 if(~ble_)
323 mem1[addr] = 8'hxx;
324 if(~bhe_)
325 mem2[addr] = 8'hxx;
326 $display($time, " Data setup is not enough_2");
328 if (we_rise - adr_chng < Taw)
329 begin
330 if(~ble_)
331 mem1[addr] = 8'hxx;
332 if(~bhe_)
333 mem2[addr] = 8'hxx;
334 $display($time, " Addr setup is not enough");
337 if (cs_==0 & oe_==0)
338 begin
339 if (we_rise - we_fall < (Twhz+Tdw) )
340 begin
341 if(~ble_)
342 mem1[addr] = 8'hxx;
343 if(~bhe_)
344 mem2[addr] = 8'hxx;
345 $display($time, " WE pulse width needs to be Twhz+Tdw");
348 outen = 1'b1;
349 #Tow out_en = outen;
351 if (cs_==0 & oe_==1)
352 begin
353 if (we_rise - we_fall < Twp)
354 begin
355 if(~ble_)
356 mem1[addr] = 8'hxx;
357 if(~bhe_)
358 mem2[addr] = 8'hxx;
359 $display($time, " WE pulse width needs to be Twp");
364 always @(negedge ble_)
365 begin
366 ble_fall = $time;
368 if (ble_fall - adr_chng < Tas)
369 $display($time, " Address set-up to BLE low is not enough");
371 if (we_==0 & cs_==0)
372 begin
373 outen = 1'b0;
374 out_en = outen;
375 temp3 = data_in;
377 #Tdw mem1[addr] = temp3[7:0];
379 if(~ble_)
380 data_out[7:0] = mem1[addr];
381 else data_out[7:0] = 'hzz;
382 if(~bhe_)
383 data_out[15:8] = mem2[addr];
384 else data_out[15:8] = 'hzz;
388 always @(negedge bhe_)
389 begin
390 bhe_fall = $time;
392 if (bhe_fall - adr_chng < Tas)
393 $display($time, " Address set-up to BHE low is not enough");
395 if (we_==0 & cs_==0)
396 begin
397 outen = 1'b0;
398 out_en = outen;
399 temp3 = data_in;
401 #Tdw mem2[addr] = temp3[15:8];
403 if(~ble_)
404 data_out[7:0] = mem1[addr];
405 else data_out[7:0] = 'hzz;
406 if(~bhe_)
407 data_out[15:8] = mem2[addr];
408 else data_out[15:8] = 'hzz;
412 always @(posedge ble_)
413 begin
414 ble_rise = $time;
416 if (we_==0 & cs_==0)
417 begin
419 if (ble_rise - ble_fall < Tbw)
420 begin
421 mem1[addr] = 8'hxx;
422 $display($time, " ble_ to end of write is not enough Tbw");
428 always @(posedge bhe_)
429 begin
430 bhe_rise = $time;
432 if (we_==0 & cs_==0)
433 begin
435 if (bhe_rise - bhe_fall < Tbw)
436 begin
437 mem2[addr] = 8'hxx;
438 $display($time, " bhe_ to end of write is not enough Tbw");
444 always @ (data)
445 begin
446 da_chng = $time;
448 if (we_==0 & cs_==0)
449 begin
450 fork
451 if(~ble_)
452 #Tdw mem1[addr] = data_in[7:0];
453 if(~bhe_)
454 #Tdw mem2[addr] = data_in[15:8];
455 join
457 if(~ble_)
458 data_out[7:0] = mem1[addr];
459 else data_out[7:0] = 'hzz;
460 if(~bhe_)
461 data_out[15:8] = mem2[addr];
462 else data_out[15:8] = 'hzz;
466 endmodule