Like many other languages, it is possible in VHDL to perform name scoping. This happens if you declare a new object in a nested scope that reuses the name of an object that was already declared. This is not an error in VHDL, but it can be confusing and it can cause errors. In general, I would advice against name scoping unless you have a very good reason. Even then, it would be best if you document (comment) your code so that everybody understands what is going on.
This is a straightforward example of name shadowing:
entity e0 is
end entity e0;
architecture demo of e0 is
constant c : integer := 1;
begin
assert c = 1;
myblock : block
constant c : integer := 2;
begin
assert c = 2 report "the second declaration of constant c shadows the first";
end block myblock;
assert c = 1 report "this is the scope of the first declaration again";
end architecture demo;
It gets more confusing if you shadow names from the a standardized package:
architecture demo2 of e0 is
constant true : boolean := false; -- shadowing the name "true". Bad idea!
begin
assert false = true;
end architecture demo;
A common misconception is that loop iterators need to be declared beforehand. They don’t, because they are declared implicitly in the loop statement.
architecture demo4 of e0 is
begin
process is
variable i: integer := 1;
begin
assert i = 1;
i := 5;
assert i = 5;
for i in 0 to 10 loop -- this is a different object, shadowing the variable i
report integer'image(i);
-- i behaves like a constant here
i := i+1; -- error! cannot assign to constants!
end loop;
assert i = 5; -- this is still the variable, declared in the process
i := i+1;
assert i = 6;
wait;
end process ;
end architecture;
Note: you can reach these shadowed names by using their expanded names:
entity fun is
end entity;
architecture hide of fun is
begin
example : process is
variable x : integer := 0;
procedure changevar (x : integer) is
begin
hide.example.x := x; -- or example.x
end procedure;
begin
changevar(5);
report "x=" & integer'image(x);
wait;
end process;
end architecture;
VSIM 1> run -all
# ** Note: x=5
# Time: 0 ns Iteration: 0 Instance: /fun