1 //////////////////////////////////////////////////////////////////////
3 //// Generic Single-Port Synchronous RAM ////
5 //// This file is part of memory library available from ////
6 //// http://www.opencores.org/cvsweb.shtml/generic_memories/ ////
9 //// This block is a wrapper with common single-port ////
10 //// synchronous memory interface for different ////
11 //// types of ASIC and FPGA RAMs. Beside universal memory ////
12 //// interface it also provides behavioral model of generic ////
13 //// single-port synchronous RAM. ////
14 //// It should be used in all OPENCORES designs that want to be ////
15 //// portable accross different target technologies and ////
16 //// independent of target memory. ////
18 //// Supported ASIC RAMs are: ////
19 //// - Artisan Single-Port Sync RAM ////
20 //// - Avant! Two-Port Sync RAM (*) ////
21 //// - Virage Single-Port Sync RAM ////
22 //// - Virtual Silicon Single-Port Sync RAM ////
24 //// Supported FPGA RAMs are: ////
25 //// - Xilinx Virtex RAMB4_S16 ////
26 //// - Altera LPM ////
29 //// - xilinx rams need external tri-state logic ////
30 //// - fix avant! two-port ram ////
31 //// - add additional RAMs ////
34 //// - Damjan Lampret, lampret@opencores.org ////
36 //////////////////////////////////////////////////////////////////////
38 //// Copyright (C) 2000 Authors and OPENCORES.ORG ////
40 //// This source file may be used and distributed without ////
41 //// restriction provided that this copyright statement is not ////
42 //// removed from the file and that any derivative work contains ////
43 //// the original copyright notice and the associated disclaimer. ////
45 //// This source file is free software; you can redistribute it ////
46 //// and/or modify it under the terms of the GNU Lesser General ////
47 //// Public License as published by the Free Software Foundation; ////
48 //// either version 2.1 of the License, or (at your option) any ////
49 //// later version. ////
51 //// This source is distributed in the hope that it will be ////
52 //// useful, but WITHOUT ANY WARRANTY; without even the implied ////
53 //// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
54 //// PURPOSE. See the GNU Lesser General Public License for more ////
57 //// You should have received a copy of the GNU Lesser General ////
58 //// Public License along with this source; if not, download it ////
59 //// from http://www.opencores.org/lgpl.shtml ////
61 //////////////////////////////////////////////////////////////////////
63 // CVS Revision History
66 // Revision 1.7 2004/04/05 08:29:57 lampret
67 // Merged branch_qmem into main tree.
69 // Revision 1.3.4.1 2003/12/09 11:46:48 simons
70 // Mbist nameing changed, Artisan ram instance signal names fixed, some synthesis waning fixed.
72 // Revision 1.3 2003/04/07 01:19:07 lampret
73 // Added Altera LPM RAMs. Changed generic RAM output when OE inactive.
75 // Revision 1.2 2002/10/17 20:04:41 lampret
76 // Added BIST scan. Special VS RAMs need to be used to implement BIST.
78 // Revision 1.1 2002/01/03 08:16:15 lampret
79 // New prefixes for RTL files, prefixed module names. Updated cache controllers and MMUs.
81 // Revision 1.7 2001/11/02 18:57:14 lampret
82 // Modified virtual silicon instantiations.
84 // Revision 1.6 2001/10/21 17:57:16 lampret
85 // Removed params from generic_XX.v. Added translate_off/on in sprs.v and id.v. Removed spr_addr from dc.v and ic.v. Fixed CR+LF.
87 // Revision 1.5 2001/10/14 13:12:09 lampret
90 // Revision 1.1.1.1 2001/10/06 10:18:36 igorm
93 // Revision 1.1 2001/08/09 13:39:33 lampret
96 // Revision 1.2 2001/07/30 05:38:02 lampret
97 // Adding empty directories required by HDL coding guidelines
101 // synopsys translate_off
102 `include "timescale.v"
103 // synopsys translate_on
104 `include "or1200_defines.v"
106 module or1200_spram_64x22(
109 mbist_si_i
, mbist_so_o
, mbist_ctrl_i
,
111 // Generic synchronous single-port RAM interface
112 clk
, rst
, ce
, we
, oe
, addr
, di
, do
116 // Default address and data buses width
126 input [`OR1200_MBIST_CTRL_WIDTH - 1:0] mbist_ctrl_i;
131 // Generic synchronous single-port RAM interface
135 input ce
; // Chip enable input
136 input we
; // Write enable input
137 input oe
; // Output enable input
138 input [aw
-1:0] addr
; // address bus inputs
139 input [dw
-1:0] di
; // input data bus
140 output [dw
-1:0] do
; // output data bus
143 // Internal wires and registers
145 wire [9:0] unconnected
;
147 `ifdef OR1200_ARTISAN_SSP
149 `ifdef OR1200_VIRTUALSILICON_SSP
152 assign mbist_so_o
= mbist_si_i
;
157 `ifdef OR1200_ARTISAN_SSP
160 // Instantiation of ASIC memory:
162 // Artisan Synchronous Single-Port RAM (ra1sh)
165 art_hssp_64x22 #
(dw
, 1<<aw
, aw
) artisan_ssp(
168 art_hssp_64x22_bist
artisan_ssp(
170 art_hssp_64x22
artisan_ssp(
175 .
mbist_si_i(mbist_si_i
),
176 .
mbist_so_o(mbist_so_o
),
177 .
mbist_ctrl_i(mbist_ctrl_i
),
190 `ifdef OR1200_AVANT_ATP
193 // Instantiation of ASIC memory:
195 // Avant! Asynchronous Two-Port RAM
211 `ifdef OR1200_VIRAGE_SSP
214 // Instantiation of ASIC memory:
216 // Virage Synchronous 1-port R/W RAM
218 virage_ssp
virage_ssp(
230 `ifdef OR1200_VIRTUALSILICON_SSP
233 // Instantiation of ASIC memory:
235 // Virtual Silicon Single-Port Synchronous SRAM
238 vs_hdsp_64x22 #
(1<<aw
, aw
-1, dw
-1) vs_ssp(
241 vs_hdsp_64x22_bist
vs_ssp(
243 vs_hdsp_64x22
vs_ssp(
248 .
mbist_si_i(mbist_si_i
),
249 .
mbist_so_o(mbist_so_o
),
250 .
mbist_ctrl_i(mbist_ctrl_i
),
263 `ifdef OR1200_XILINX_RAMB4
266 // Instantiation of FPGA memory:
274 RAMB4_S16
ramb4_s16_0(
277 .
ADDR({2'b00, addr
}),
287 RAMB4_S16
ramb4_s16_1(
290 .
ADDR({2'b00, addr
}),
291 .
DI({unconnected
, di
[21:16]}),
294 .
DO({unconnected
, do
[21:16]})
299 `ifdef OR1200_ALTERA_LPM
302 // Instantiation of FPGA memory:
306 // Added By Jamil Khatib
313 initial $display("Using Altera LPM.");
315 lpm_ram_dq
lpm_ram_dq_component (
324 defparam lpm_ram_dq_component.lpm_width
= dw
,
325 lpm_ram_dq_component.lpm_widthad
= aw
,
326 lpm_ram_dq_component.lpm_indata
= "REGISTERED",
327 lpm_ram_dq_component.lpm_address_control
= "REGISTERED",
328 lpm_ram_dq_component.lpm_outdata
= "UNREGISTERED",
329 lpm_ram_dq_component.lpm_hint
= "USE_EAB=ON";
330 // examplar attribute lpm_ram_dq_component NOOPT TRUE
335 // Generic single-port synchronous RAM model
339 // Generic RAM's registers and wires
341 reg [dw
-1:0] mem
[(1<<aw
)-1:0]; // RAM content
342 reg [dw
-1:0] do_reg
; // RAM data output register
345 // Data output drivers
347 assign do
= (oe
) ? do_reg
: {dw
{1'b0}};
350 // RAM read and write
352 always @(posedge clk
)
354 do_reg
<= #1 mem
[addr
];
358 `endif // !OR1200_ALTERA_LPM
359 `endif // !OR1200_XILINX_RAMB4_S16
360 `endif // !OR1200_VIRTUALSILICON_SSP
361 `endif // !OR1200_VIRAGE_SSP
362 `endif // !OR1200_AVANT_ATP
363 `endif // !OR1200_ARTISAN_SSP