Xilinx optimerar bort mitt block ram

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
arte
Inlägg: 317
Blev medlem: 13 januari 2006, 01:18:50

Xilinx optimerar bort mitt block ram

Inlägg av arte »

Hej,

Jag använder två stycken dualport block RAM för att konstruera en registerbank i en processor.
Registerbanken har två läsportar och en skrivport.
Mitt problem är att synthes verktyget tar bort ett utav minnerna och gör om registerbanken så att den får 1 läs/skriv samt en läsport.

Det fungerar i RTL simulering men inte i Post Translate simulering.

Min registerbank beskrivs med följande kod:

Kod: Markera allt

entity cpu_regbank is
    Port ( clk : in  STD_LOGIC;
			  regbank_in : in regbank_in_type;
			  regbank_out : out regbank_out_type
			  );
end cpu_regbank;


architecture Behavioral of cpu_regbank is
type regram_type is array(31 downto 0) of std_logic_vector(31 downto 0);
signal ram1: regram_type := ( others =>x"00000000" ); 
signal ram2: regram_type := ( others =>x"00000000" ); 
signal addr_a,addr_b : std_logic_vector(4 downto 0);
begin
	process(clk, regbank_in)
	begin		
		if rising_edge(clk) then						
			if regbank_in.we = '1'  then
				ram1(conv_integer(regbank_in.addrc)) <= regbank_in.data;			
			end if;							
			addr_a<=regbank_in.addra;			
		end if;
	end process;
	
	process(clk, regbank_in)
	begin		
		if rising_edge(clk) then						
			if regbank_in.we = '1' then
				ram2(conv_integer(regbank_in.addrc)) <= regbank_in.data;			
			end if;							
			addr_b<=regbank_in.addrb;			
		end if;
	end process;
	regbank_out.dataa <= ram1(conv_integer(addr_a));			
	regbank_out.datab <= ram2(conv_integer(addr_b));				
end Behavioral;
---
type regbank_in_type is record
	addra : std_logic_vector(4 downto 0); -- läsport
	addrb : std_logic_vector(4 downto 0); -- läsport
	addrc : std_logic_vector(4 downto 0); -- skrivport
	data  : std_logic_vector(31 downto 0);
	we	   : std_logic;
end record;
	
type regbank_out_type is record
	dataa : std_logic_vector(31 downto 0);
	datab : std_logic_vector(31 downto 0);
end record;
Synthes verktyget (webpack) skriver ut följande information:

INFO:Xst:2737 - Unit <cpu_regbank> : The RAM <Mram_ram1>, combined with <Mram_ram2>, will be implemented as a BLOCK RAM, absorbing the following register(s): <addr_a> <addr_b>.
-----------------------------------------------------------------------
| ram_type | Block | |
-----------------------------------------------------------------------
| Port A |
| aspect ratio | 32-word x 32-bit | |
| mode | write-first | |
| clkA | connected to signal <clk> | rise |
| weA | connected to signal <regbank_in_we> | high |
| addrA | connected to signal <regbank_in_addrc> | |
| diA | connected to signal <regbank_in_data> | |
| doA | connected to signal <regbank_out_dataa> | |
-----------------------------------------------------------------------
| optimisation | speed | |
-----------------------------------------------------------------------
| Port B |
| aspect ratio | 32-word x 32-bit | |
| mode | write-first | |
| clkB | connected to signal <clk> | rise |
| addrB | connected to signal <regbank_in_addrb> | |
| doB | connected to signal <regbank_out_datab> | |
-----------------------------------------------------------------------
| optimisation | speed | |
-----------------------------------------------------------------------

I RTL schematic så ser schemat ut

Bild

Altså signalen addrA har försvunnit helt och då är det klart att det inte kommer att fungera.
Ett alternativ är att byta till distrubuted RAM men vill pröva med blockram först.
rehnmaak
Inlägg: 2204
Blev medlem: 13 december 2005, 01:43:41

Inlägg av rehnmaak »

Jag har också haft problem att få xst att syntetisera blockram som man vill ha dem.

Enklaste sättet att få det att fungera är att instantiera ett RAMB4_Sxxxx och mappa portarna så som man vill ha dem.
arte
Inlägg: 317
Blev medlem: 13 januari 2006, 01:18:50

Inlägg av arte »

Körde på det, fungerar!
Skriv svar