Answers Database


SYNPLIFY: How to infer ROM in HDL (VHDL/Verilog)?


Record #8183

Product Family: Software

Product Line: Synplicity

Product Part: Synplify

Product Version: 5.0

Problem Title:
SYNPLIFY: How to infer ROM in HDL (VHDL/Verilog)?


Problem Description:
Urgency: Standard

General Description:
One of the new features in Synplify 5.3 is ROM inference.
Synplify 5.3 now maps these inferred ROMs to Xilinx ROM primitives, ROM16X1 and ROM32X1.
Xilinx ROM primitives are inferred with the use of an attribute called syn_romstyle. Currently, the only supported value for this attribute is 'select_rom'. This attribute is set on the output of the ROM as in examples below.

Note: Tested in Synplicity 5.3.


Solution 1:

//Verilog example

module testrom(a, z);
input [3:0] a;
output [3:0] z;

reg [3:0] z /* synthesis syn_romstyle = "select_rom" */;

always @(a)
begin
  case(a)
   4'b0000: z = 4'hA;
   4'b0001: z = 4'h4;
   4'b0010: z = 4'h7;
   4'b0011: z = 4'h2;
   4'b0100: z = 4'h5;
   4'b0101: z = 4'h9;
   4'b0110: z = 4'hB;
   4'b1001: z = 4'h1;
   4'b1010: z = 4'hF;
   4'b1011: z = 4'h6;
   4'b1100: z = 4'h8;
   4'b1101: z = 4'hE;
   4'b1110: z = 4'hC;
   default : z = 4'h0;
  endcase
end

endmodule



Solution 2:

-- VHDL example

library IEEE;
use IEEE.std_logic_1164.all;
entity rom is
   port ( a: in std_logic_vector(3 downto 0);
       z: out std_logic_vector(3 downto 0)
         );
attribute syn_romstyle : string;
attribute syn_romstyle of z : signal is "select_rom";
end rom;

architecture rtl of rom is
begin
process(a)
begin
   case a is
    when "0000" => z <= "1010";
    when "0001" => z <= "0100";
    when "0010" => z <= "0111";
    when "0011" => z <= "0010";
    when "0100" => z <= "0101";
    when "0101" => z <= "1001";
    when "0110" => z <= "1011";
    when "1001" => z <= "0001";
    when "1010" => z <= "1111";
    when "1011" => z <= "0110";
    when "1100" => z <= "1000";
    when "1101" => z <= "1110";
    when "1110" => z <= "1100";
    when others => z <= "0000";
   end case;
end process;
end rtl;



Solution 3:

# SDC example
In Synplify, run the vhdl/verilog design once and go to HDL Analyst -> RTL -> Hierarchical View. Note the ROM module name, e.g.: z_18[3:0].

Click on New Constraint File Icon, select Attributes tab and enter the following:
  z_18[3:0] (rom instance name) under 'Object' column
syn_romstyle under attribute column, and
select_rom under value column.

Save and rerun.

Alternatively, you can enter the following in <filename>.sdc :
define_attribute {z_18[3:0]} syn_romstyle {select_rom}




End of Record #8183 - Last Modified: 01/04/00 17:19

For the latest news, design tips, and patch information on the Xilinx design environment, check out the Technical Tips!