Visible to Intel only — GUID: mwh1409960002169
Ixiasoft
Visible to Intel only — GUID: mwh1409960002169
Ixiasoft
1.10.3.2. Inferring RAM
Follow these guidelines for the Synplify software to successfully infer RAM in a design:
- The address line must be at least two bits wide.
- Resets on the memory are not supported. Refer to the device family documentation for information about whether read and write ports must be synchronous.
- Some Verilog HDL statements with blocking assignments might not be mapped to RAM blocks, so avoid blocking statements when modeling RAMs in Verilog HDL.
For some device families, the syn_ramstyle attribute specifies the implementation to use for an inferred RAM. You can apply the syn_ramstyle attribute globally to a module or a RAM instance, to specify registers or block_ram values. To turn off RAM inference, set the attribute value to registers.
When inferring RAM for some Intel device families, the Synplify software generates additional bypass logic. This logic is generated to resolve a half-cycle read/write behavior difference between the RTL and post-synthesis simulations. The RTL simulation shows the memory being updated on the positive edge of the clock; the post-synthesis simulation shows the memory being updated on the negative edge of the clock. To eliminate bypass logic, the output of the RAM must be registered. By adding this register, the output of the RAM is seen after a full clock cycle, by which time the update has occurred, thus eliminating the need for bypass logic.
For devices with TriMatrix memory blocks, disable the creation of glue logic by setting the syn_ramstyle value to no_rw_check. Set syn_ramstyle to no_rw_check to disable the creation of glue logic in dual-port mode.
VHDL Code for Inferred Dual-Port RAM
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_signed.all; ENTITY dualport_ram IS PORT ( data_out: OUT STD_LOGIC_VECTOR (7 DOWNTO 0); data_in: IN STD_LOGIC_VECTOR (7 DOWNTO 0) wr_addr, rd_addr: IN STD_LOGIC_VECTOR (6 DOWNTO 0); we: IN STD_LOGIC); clk: IN STD_LOGIC); END dualport_ram; ARCHITECTURE ram_infer OF dualport_ram IS TYPE Mem_Type IS ARRAY (127 DOWNTO 0) OF STD_LOGIC_VECOR (7 DOWNTO 0); SIGNAL mem; Mem_Type; SIGNAL addr_reg: STD_LOGIC_VECTOR (6 DOWNTO 0); BEGIN data_out <= mem (CONV_INTEGER(rd_addr)); PROCESS (clk, we, data_in) BEGIN IF (clk='1' AND clk'EVENT) THEN IF (we='1') THEN mem(CONV_INTEGER(wr_addr)) <= data_in; END IF; END IF; END PROCESS; END ram_infer;
VHDL Code for Inferred Dual-Port RAM Preventing Bypass Logic
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_signed.all; ENTITY dualport_ram IS PORT ( data_out: OUT STD_LOGIC_VECTOR (7 DOWNTO 0); data_in : IN STD_LOGIC_VECTOR (7 DOWNTO 0); wr_addr, rd_addr : IN STD_LOGIC_VECTOR (6 DOWNTO 0); we : IN STD_LOGIC; clk : IN STD_LOGIC); END dualport_ram; ARCHITECTURE ram_infer OF dualport_ram IS TYPE Mem_Type IS ARRAY (127 DOWNTO 0) OF STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL mem : Mem_Type; SIGNAL addr_reg : STD_LOGIC_VECTOR (6 DOWNTO 0); SIGNAL tmp_out : STD_LOGIC_VECTOR (7 DOWNTO 0); --output register BEGIN tmp_out <= mem (CONV_INTEGER (rd_addr)); PROCESS (clk, we, data_in) BEGIN IF (clk='1' AND clk'EVENT) THEN IF (we='1') THEN mem(CONV_INTEGER(wr_addr)) <= data_in; END IF; data_out <= tmp_out; --registers output preventing -- bypass logic generation END IF; END PROCESS; END ram_infer;