Depende, pero casi siempre es preferible especificar el rango.
Para ilustrar, considera este ejemplo:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity naturals is
Port ( clk : in std_logic;
rst : in std_logic;
count : out std_logic_vector(2 downto 0));
end naturals;
architecture behavioral of naturals is
signal count_intern : natural := 0;
begin
count <= std_logic_vector(to_unsigned(count_intern, count'length));
process(clk)
begin
if (rising_edge(clk)) then
if (rst = '1') then
count_intern <= 0;
elsif (count_intern = 5) then
count_intern <= 0;
else
count_intern <= count_intern + 1;
end if;
end if;
end process;
end behavioral;
Este es un contador simple que va de 0 a 5.
Su simulación se ve así:
Sinembargo,nolimitélaseñalcount_intern
,porloqueinternamenteesde31bits(losenterossonde32bits,losnaturalesson31).Aunqueenrealidadsolousolos3bitsmásbajos,los31terminanenlasoperacionesdesumaycomparación.¿Porqué?Porqueenelinicio,elvalorinicialdecount_intern
noestádefinido.Porejemplo,podríacomenzarconunvalorde7,momentoenelqueelcontadoraumentaráhastaquelos31bitssellenenysedesbordena0.Lainicialización(a0)queproporcionéenElcódigo,soloseaplicaalasimulación,esignoradoporelsintetizador.
Elesquemadepost-síntesis,porlotanto,seveasí:
Medoycuentadequelaimagenesdemasiadograndeparadistinguirsusdetalles,peroeseeselpunto.Esundesastre;yparauncircuitomuysencillo.
Ahora,vamosareemplazarlalíneaúnica:
señalcount_intern:natural:=0;
con
señalcount_intern:rangonatural0a5:=0;
Sinprueba,lasimulaciónesexactamentelamisma.Sinembargo,elesquemadepost-síntesisahoraseresuelveen:
Dehecho,losresultadosdeestosepuedenconfirmarinclusodespuésdelaimplementación,donderealmentecuenta:
Sinlimitarelrangonatural:
Conlímitederango:
Note la diferencia en los flip-flops utilizados.
Aunque utilicé los productos naturales aquí, esto (por supuesto) se extiende también a los enteros.
Los resultados de la implementación pueden variar. Aquí estoy usando la configuración predeterminada en Vivado 2015. De cualquier manera, el punto es: es más seguro y preferible especificar siempre el rango.