VHDL: el subtipo o el tipo tiene un rango nulo

¿Cuál es el significado de la siguiente advertencia (planteada por Quartus)?

Warning (10445): VHDL Subtype or Type Declaration warning at someFile.vhd(32): subtype or type has null range


La línea de código ofensiva es:

-- Drive unused low
q( N - 1 downto X ) <= ( others => '0' );  -- drive unused low

Ny Xson constantes enteras que se usan con éxito en otras partes del código (sin generar advertencias). qse declara comoq : out std_logic_vector( N - 1 downto 0 )


También se genera el mismo error para esta línea de código (en otro archivo):

-- Upper nibble
q <= zero( N - 1 downto 8 ) & q0( 7 downto 4 ) & zero( 3 downto 0 );

Nes una constante entera utilizada con éxito en otras partes del código. qse declara como q : out std_logic_vector( N - 1 downto 0 ). q0se declara como signal q0 : std_logic_vector( N - 1 downto 0 ). zerose declara comoconstant zero : std_logic_vector( N - 1 downto 0 ) := ( others => '0' )


Parece que ( others => '0' )es el punto común para ambos, pero no sé cómo se relaciona esto con la advertencia de rango nulo.

Respuestas (1)

El rango: N - 1 downto Xestá evaluando un rango con 0 o tamaño negativo. Considere el rango: 0 downto 4, tiene un tamaño que es menor que 0 ya que el número anterior al downto es menor que el número posterior.

El problema aquí es que usar un rango que tiene un tamaño inferior a 1 lo convierte en un rango nulo que tiene algunos usos válidos en vhdl. Sin embargo, dado que esto es potencialmente un error de rango, Quartus da la advertencia que está viendo aquí.

¡Gracias! El código se escribió inicialmente para más de 16 bits (N=16). Usarlo para 8 bits (N=8) causó el error sutil. N - 1 downto 8convertirse7 downto 8
VHDL le permite tener rangos NULL y segmentos NULL. Es por eso que es una advertencia y no un error. Hay buenos casos de uso que usan rangos NULL. Pero en la mayoría de los casos es un error en el cálculo de los límites de corte.