Cálculo intermedio constante de VHDL

1

¿VHDL especifica cómo se manejan los cálculos intermedios? Por ejemplo, tengo la siguiente constante definida en una de mis entidades.

constant MAX_ADDR : integer := (1024*1024*1024*8)/64;

En el simulador ACTIVE-HDL de Aldec, la constante se evalúa correctamente a 134,217,728. Por otro lado, en Vivado, la parte (1024 * 1024 * 1024 * 8) del cálculo parece desbordar el tipo entero de 32 bits antes de la división por 64, lo que lleva a una síntesis incorrecta (y varias horas de compilación, depuración y frustración). ).

    
pregunta ks0ze

2 respuestas

2

VHDL solo garantiza un mínimo de 32 bits para representar un entero (firmado). Intentar incluir un valor sin firmar de 34 bits, incluso como valor intermedio, es solo buscar problemas.

Fuiste descuidado y te mordieron. Supéralo.

    
respondido por el Dave Tweed
1

Supongo que Dave quiso decir que 32 bits es máximo para representar un número entero. En lugar de integer puedes probar signed o unsigned . O, si está seguro de la precisión y ese valor no sería mayor que 2 ^ 31-1, puede poner primero la división y luego la multiplicación y se compilará correctamente:

constant MAX_ADDR : integer :=(1024/64*1024*1024*8);
    
respondido por el Daniil Smirnov

Lea otras preguntas en las etiquetas