pico
pico

Reputation: 1910

vhdl ERRROR: Attribute "range" requires a constrained array prefix

Two questions:

  1. how to get rid of the warning: "Shared variables must be of a protected type." while keeping it as a "shared variable"?

  2. How to fix Attribute "range" requires a constrained array prefix?

First of all, what is a constrained array prefix?


$ vcom.exe -2002 -l test3.vhd

** Warning: test3.vhd(14): (vcom-1236) Shared variables 
must be of a protected type.

** Error: test3.vhd(20): (vcom-14402) Attribute "range" 
requires a constrained array prefix.

library ieee;
use ieee.std_logic_1164.all;

entity test3 is
end entity;

architecture beh of test3 is
    constant dw    :integer := 8;
    constant depth :integer := 128;
    
    type mem_t is array (integer range<>) of std_logic_vector(dw-1 downto 0);
    
    shared variable ram_block :mem_t(0 to depth-1);    
begin

process 
     variable i:integer;
begin
     for i in mem_t'range loop
         report integer'image(i);
     end loop;
end process;

end architecture;

Upvotes: 0

Views: 344

Answers (2)

Tricky
Tricky

Reputation: 4461

A protected type in VHDL, is similar to a class in OO programming, where it can have member methods and it can retain state. Since 2002, it is required that shared variables must be of a protected type. By default, most tools only throw a warning to maintain backwards compatibility unless you turn on strict rule checking

So you have two options to remove the warning

  1. revert to VHDL 1993 standard.
  2. Create a protected type.

Your example shows no need for a shared variable. It could be made into a normal (non shared) variable inside the process.

Upvotes: 1

pico
pico

Reputation: 1910

Question 2, I found... But Question 1, I'm still not sure about..

architecture beh of test3 is
    constant dw    :integer := 8;
    constant depth :integer := 128;
    
    type mem_t is array (integer range<>) of std_logic_vector(dw-1 downto 0);
    
    shared variable ram_block :mem_t(0 to depth-1);    
begin

process 
     variable i:integer;
begin
    report "left:"  & integer'image( ram_block'left);
    report "right:" & integer'image( ram_block'right);   
    
    for i in ram_block'range loop
        report integer'image(i);
    end loop;
    
    wait;
end process;


end architecture;

Upvotes: 0

Related Questions