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;
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

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.