La compilación de un multiplexor simple de 2 entradas con GHDL falla

Empecé a leer "The Designer's Guide to VHDL" de PJ Ashenden, pero ya estoy atascado después del ejercicio 9, aquí está mi código:

entity mul2 is
port ( a, b, sel : in bit;
       z : out bit );
end entity mul2;

architecture behav of mul2 is
begin

multiplex : process is
begin
    if sel then
        z <= a;
    else
        z <= b;
    end if;
end process multiplex;

end architecture behav;

Cuando invoco GHDL con

ghdl -a mul2.vhdl

Obtuve el siguiente error:

mul2.vhdl:11:19: can't match port "sel" with type boolean
mul2.vhdl:2:21: (location of port "sel")

Estoy un poco confundido, porque en el libro hay un ejemplo que muestra un puerto de bits que se usa en una declaración if de la misma manera que lo hago en mi código, pero ese ejemplo no se compilará tan bien (ejemplo 1.2, si tienes el libro a mano).

Creo que este es un problema con GHDL que no implementa el estándar correctamente. ¿Alguien tiene una idea de lo que está mal aquí?

IEEE Std 1076-2008 10.8 Sentencias If "Para la ejecución de una sentencia if, la condición especificada después de if, y cualquier condición especificada después de elsif, se evalúan en sucesión (tratando un else final como elsif VERDADERO entonces) hasta que uno se evalúe como VERDADERO o todas las condiciones se evalúan y dan como resultado FALSO. Si una condición se evalúa como VERDADERO, entonces se ejecuta la secuencia de instrucciones correspondiente; de ​​lo contrario, no se ejecuta ninguna de las secuencias de instrucciones". ghdl --disp-estándar | grep -i FALSO -> type boolean is (false, true);Son valores de enumeración de tipo booleano.
La guía del diseñador para VHDL 2.ª edición. Capítulo 1 Ejercicio 8. "Escriba una declaración de entidad y un cuerpo de arquitectura de comportamiento para un multiplexor de dos entradas con puertos de entrada a, b y sel y un puerto de salida de z. Si la entrada sel es '0', el valor de a debe ser copiado a z, de lo contrario, el valor de b debe copiarse a z. Escriba un banco de pruebas para el modelo de multiplexor y pruébelo usando un simulador VHDL". Ese '0' es un valor de enumeración para el tipo de sel, en su caso, escriba bit. La respuesta al ejercicio 8 no está en la parte de atrás de mi copia del libro.
No hay soluciones para los ejercicios de nivel 2, 3 y 4 en el libro, solo para el nivel 1. Pero sí, ese es el ejercicio que estoy tratando de resolver, ahora mismo me quedé con un banco de pruebas funcionando, pero estoy haciendo progreso :)

Respuestas (3)

El problema está en el ifenunciado.

A diferencia de C, en VHDL no hay ningún atajo que evalúe cualquier valor distinto de cero como verdadero y el resto como falso. VHDL es mucho más estricto aquí.

Aquí está el código fijo:

entity mul2 is
port ( a, b, sel : in bit;
       z : out bit );
end entity mul2;

architecture behav of mul2 is
begin

multiplex : process is
begin
    if sel = '1' then  --- see, if you do a proper compare it works
        z <= a;
    else
        z <= b;
    end if;
end process multiplex;

end architecture behav;
¡Gracias! Eso hizo el truco. Me pregunto por qué el autor hizo el camino si es ilegal en su ejemplo, pero de eso se trata el aprendizaje.
Si sel fuera booleano, su código sería correcto. ¿Dónde viste en el libro el ejemplo ilegal que mencionas? Tengo la tercera edición de su libro.
Tengo la tercera edición también, es el ejemplo 1.2 del capítulo 1 en la página 9
Encontré algún tipo de versión abreviada del mismo autor aquí , en esta versión usa el mismo código pero ligeramente modificado a la solución sugerida por Nils Pipenbrinck.

Esto no proporciona información adicional para la respuesta de TEMLIB sin mutilarlo. La información no cabe en un comentario.

IEEE Std 1076-2008 9.2.9 Operador de condición, párrafo 4:

El operador de condición aplicado implícitamente, si lo hay, es el operador predefinido para el tipo BIT o un operador sobrecargado, determinado de la siguiente manera. Si, sin resolución de sobrecarga (ver 12.5), la expresión es de tipo BOOLEAN definida en el paquete STANDARD, o si, asumiendo una regla que requiere que la expresión sea de tipo BOOLEAN definida en el paquete STANDARD, la resolución de sobrecarga puede determinar al menos una interpretación de cada componente del contexto completo más interno, incluida la expresión, no se aplica el operador de condición. De lo contrario, el operador de condición se aplica implícitamente y el tipo de expresión con la aplicación implícita será BOOLEAN definido en el paquete STANDARD.

El tipo BOOLEAN tiene el operador implementado en el paquete estándar:

ghdl --disp-estándar --std=08 | grep\?\?
-- function "??" (<anonymous>: bit) return boolean;

También está implementado en la revisión -2008 del paquete std_logic_1164:

function "??" (l : STD_ULOGIC) return BOOLEAN;

Que sirve para cualquier tipo de matriz o subtipos definidos con elementos STD_ULOGIC. (Los tipos de matriz ufixed, sfixed, float, firmed, unsigned, std_ulogic_vector y std_logic_vector utilizan elementos std_ulogic y se declaran en paquetes IEEE).

No hay otros tipos con el operador de condición predefinido en la revisión -2008 del estándar.

El estándar -2008 también introduce operadores relacionales coincidentes (consulte 9.2.3 Operadores relacionales.

Hay un inconveniente. Casi todas las herramientas VHDL deben tener habilitado el modo de compatibilidad -2008, y todas las funciones nuevas no son compatibles con todas las herramientas (presuntamente todavía no, solo han pasado ocho años ).

Las construcciones que debe usar generalmente están dictadas por toda su cadena de herramientas (especialmente las herramientas de síntesis), así como por las preocupaciones de portabilidad.

Encontrará las funciones admitidas de Xilinx en la Guía del usuario 901 Vivado Design Suite Guía del usuario Síntesis Capítulo 5 VHDL-2008 Soporte de idiomas. Por lo general, otros proveedores ofrecerán soporte de características.

Podría notar en The Designer's Guide to VHDL , Peter Ashenden, 2d ed., 2002 que el tema del ejercicio de donde se toma la pregunta precede al lanzamiento del estándar -2008 por más de seis años.

Capítulo 1 Ejercicio 8, Libro página 26:

Escriba una declaración de entidad y un cuerpo de arquitectura de comportamiento para un multiplexor de dos entradas con puertos de entrada a , b y sel y un puerto de salida de z . Si la entrada sel es '0', el valor de a debe copiarse en z ; de lo contrario, el valor de b debe copiarse en z . Escriba un banco de pruebas para el modelo de multiplexor y pruébelo usando un simulador VHDL".

Sugiero poner en práctica todos los atajos de inmediato:

entity mul2 is
port ( a, b, sel: bit;
       z : out bit );
end;

architecture foo of mul2 is
begin
    Z <= a when sel else b;
end;

no sirve al aprendiz de VHDL además de comprender la sintaxis, la semántica y el sistema de tipos ni comprender los límites de la cadena de herramientas que está utilizando. Si no comprende lo suficiente el VHDL, solucionar las deficiencias de la cadena de herramientas puede ser mucho más difícil.

Además de un operador de condición aplicado implícitamente, la expresión de condición podría aplicarse explícitamente: ?? sel.

Al igual que con la respuesta de TEMLIB, sospechaba tal cosa. Sé que las cadenas de herramientas a menudo se quedan atrás en términos de implementación de nuevos estándares (C ++ 11 está funcionando bien por fin mientras ya están hablando de C ++ 17, sin olvidar C ++ 14), así que hice mi pregunta aquí después de que Google no encontró nada sobre el tema.

El uso directo de std_logic o bit como valores booleanos en declaraciones IF es una novedad introducida en la edición 2008 de VHDL.

De manera predeterminada, GHDL admite el idioma definido en la edición de 1993 del estándar (que es más ampliamente utilizado), puede seleccionar la edición de 2008 a través de una opción de línea de comando:

--std=08