F
fl
Guest
Hi,
When I learn Modelsim, I find that there is shared variable in its single port
memory example. Every architecture of sp_syn_ram has its
SHARED VARIABLE mem : mem_type;
I do not see one mem variable accessed by other process signals.
I only copy two architectures below of the four similar structures.
Do you think what purpose it uses shared variable here?
Thanks,
..........................
ARCHITECTURE constrainedintarch OF sp_syn_ram IS
SUBTYPE constrained_int is integer range 0 to 2**data_width-1;
TYPE mem_type IS ARRAY (0 TO 2**addr_width-1) OF constrained_int;
SHARED VARIABLE mem : mem_type;
BEGIN
ASSERT data_width <= 32
REPORT "### Illegal data width detected"
SEVERITY failure;
control_proc : PROCESS (inclk, outclk)
VARIABLE inner_addr : integer;
VARIABLE outer_addr : integer;
BEGIN
IF (inclk'event AND inclk = '1') THEN
IF (we = '1') THEN
mem(to_integer(addr)) := to_integer(unsigned(data_in));
END IF;
END IF;
IF (outclk'event AND outclk = '1') THEN
data_out <= std_logic_vector(to_unsigned(mem(to_integer(addr)), data_out'length));
END IF;
END PROCESS;
END constrainedintarch;
ARCHITECTURE \3D\ OF sp_syn_ram IS
TYPE mem_type IS ARRAY (0 TO 3, 0 TO 2**(addr_width-2)-1) OF integer;
SHARED VARIABLE mem : mem_type;
BEGIN
control_proc : PROCESS (inclk, outclk)
VARIABLE inner_addr : integer;
VARIABLE outer_addr : integer;
BEGIN
IF (inclk'event AND inclk = '1') THEN
inner_addr := to_integer(addr(addr_width-3 DOWNTO 0));
outer_addr := to_integer(addr(addr_width-1 DOWNTO addr_width-2));
IF (we = '1') THEN
mem(outer_addr, inner_addr) := to_integer(unsigned(data_in));
END IF;
END IF;
IF (outclk'event AND outclk = '1') THEN
inner_addr := to_integer(addr(addr_width-3 DOWNTO 0));
outer_addr := to_integer(addr(addr_width-1 DOWNTO addr_width-2));
data_out <= std_logic_vector(to_unsigned(mem(outer_addr, inner_addr), data_out'length));
END IF;
END PROCESS;
END \3D\;
When I learn Modelsim, I find that there is shared variable in its single port
memory example. Every architecture of sp_syn_ram has its
SHARED VARIABLE mem : mem_type;
I do not see one mem variable accessed by other process signals.
I only copy two architectures below of the four similar structures.
Do you think what purpose it uses shared variable here?
Thanks,
..........................
ARCHITECTURE constrainedintarch OF sp_syn_ram IS
SUBTYPE constrained_int is integer range 0 to 2**data_width-1;
TYPE mem_type IS ARRAY (0 TO 2**addr_width-1) OF constrained_int;
SHARED VARIABLE mem : mem_type;
BEGIN
ASSERT data_width <= 32
REPORT "### Illegal data width detected"
SEVERITY failure;
control_proc : PROCESS (inclk, outclk)
VARIABLE inner_addr : integer;
VARIABLE outer_addr : integer;
BEGIN
IF (inclk'event AND inclk = '1') THEN
IF (we = '1') THEN
mem(to_integer(addr)) := to_integer(unsigned(data_in));
END IF;
END IF;
IF (outclk'event AND outclk = '1') THEN
data_out <= std_logic_vector(to_unsigned(mem(to_integer(addr)), data_out'length));
END IF;
END PROCESS;
END constrainedintarch;
ARCHITECTURE \3D\ OF sp_syn_ram IS
TYPE mem_type IS ARRAY (0 TO 3, 0 TO 2**(addr_width-2)-1) OF integer;
SHARED VARIABLE mem : mem_type;
BEGIN
control_proc : PROCESS (inclk, outclk)
VARIABLE inner_addr : integer;
VARIABLE outer_addr : integer;
BEGIN
IF (inclk'event AND inclk = '1') THEN
inner_addr := to_integer(addr(addr_width-3 DOWNTO 0));
outer_addr := to_integer(addr(addr_width-1 DOWNTO addr_width-2));
IF (we = '1') THEN
mem(outer_addr, inner_addr) := to_integer(unsigned(data_in));
END IF;
END IF;
IF (outclk'event AND outclk = '1') THEN
inner_addr := to_integer(addr(addr_width-3 DOWNTO 0));
outer_addr := to_integer(addr(addr_width-1 DOWNTO addr_width-2));
data_out <= std_logic_vector(to_unsigned(mem(outer_addr, inner_addr), data_out'length));
END IF;
END PROCESS;
END \3D\;