Si la memoria que está simulando puede caber en el ram de la estación de trabajo, usar un almacenamiento de tamaño fijo es lo más fácil de usar. Pero, como ha visto, las señales son mucho más caras en comparación con las variables. Esta diferencia está relacionada con el modelo de simulación de eventos discretos en el que se basa VHDL. Una asignación de señal programa una transacción en un punto dado en el tiempo, pero una asignación de variable es estrictamente una declaración secuencial que se ejecuta en tiempo de simulación de cero. La diferencia se puede ver en el uso de la memoria de los dos modelos diferentes. Los resultados se obtienen ejecutando el siguiente código de ejemplo en Riviera PRO.
Asignación de memoria cuando se usa una señal para el almacenamiento de datos:
Allocation: Simulator allocated 891567 kB (elbread=1023 elab2=890389 kernel=154 sdf=0)
Asignación de memoria cuando se utiliza una variable para el almacenamiento de datos:
Allocation: Simulator allocated 39599 kB (elbread=1023 elab2=38421 kernel=154 sdf=0)
Código de ejemplo
library ieee;
use ieee.std_logic_1164.all;
use std.env;
entity memtest is
end;
architecture sim of memtest is
signal clk : std_logic := '0';
signal we : std_logic;
signal writedata, q : integer;
signal addr : natural;
-- Uncomment or comment to switch between variable or signal for memory storage.
--signal mem : integer_vector(0 to 2 * 2048**2-1);
begin
clk <= not clk after 10 ns;
-----------------------------------
stimulus :
-----------------------------------
process
begin
for n in 0 to 100 loop
wait until falling_edge(clk);
we <= '1' ;
writedata <= n;
addr <= n;
end loop;
env.stop;
end process;
-----------------------------------
memory :
-----------------------------------
process ( clk )
-- Uncomment or comment to switch between variable or signal for memory storage.
variable mem : integer_vector(0 to 2 * 2048**2-1);
begin
if rising_edge(clk) then
q <= mem(addr);
if we = '1' then
-- Remember to modify assignment operator when switching data storage.
mem(addr) := writedata;
end if;
end if;
end process;
end;