¿Hay alguna forma de activar condicionalmente un error de compilación en verilog?

6

Tengo un módulo parametrizado en verilog, donde los parámetros son una frecuencia de reloj y una frecuencia de actualización, que se utiliza para calcular cuántos ciclos de inactividad se insertan entre las instancias de una operación de repetición. Sin embargo, es muy fácil establecer parámetros que no se pueden alcanzar (porque la operación toma un período de tiempo no trivial, por lo que la repetición tendría que ocurrir antes de que se completara), y en el momento el diseño no proporciona ningún comentario. en esto.

Me preguntaba si habría alguna manera de que pudiera desencadenar un error durante la síntesis (o compilación antes de la simulación) si no se pueden cumplir las condiciones (es decir, si un parámetro local es menor que otro). Tal vez algún equivalente del hack popular de compilación en tiempo de compilación de C / C ++,

    
pregunta Jules

3 respuestas

7

Estoy seguro de que hay alguna forma de enlazar en una devolución de llamada de compilación C / C ++. Sin embargo, siempre que tu soporte generate bloquee (introducido en IEEE Std 1364-2001), entonces puedes hacer algo como lo siguiente:

generate
if (CONDITION > MAX_ALLOWED /* your condition check */ ) begin
    illegal_parameter_condition_triggered_will_instantiate_an non_existing_module();
end
endgenerate

Si la condición es verdadera, entonces el compilador dará un error porque hay una solicitud de algo que no existe. Si la condición es falsa, entonces la operación se omite. El único requisito es que el código para la condición ilegal sigue la sintaxis legal de Verilog y la condición ilegal nunca será accidentalmente válida (de ahí el nombre largo y detallado del módulo no existente).

Si su simulador y sus herramientas de síntesis son compatibles con IEEE Std 1800-2009 (revisión de SystemVerilog lanzada en 2009) o una versión más reciente, puede usar $error() y dar un mensaje más significativo para acompañar el error. No estoy seguro de si algún proveedor ha implementado esta característica todavía. Debería convertirse en el método preferido una vez que se hayan implementado la mayoría de los proveedores, por lo tanto, daré un ejemplo:

generate
if (CONDITION > MAX_ALLOWED /* your condition check */ ) begin
    $error("%m ** Illegal Condition ** CONDITION(%d) > MAX_ALLOWED(%d)", CONDITION, MAX_ALLOWED);
end
endgenerate
    
respondido por el Greg
1

Podrías hacer algo como esto:

module test();

  parameter VALUE=16;

  // VALUE should be between 16 and 64
  wire [64:16] range_for_value;
  assign range_for_value[VALUE] = 1'b0;

endmodule

Las herramientas pueden tratar esto de forma ligeramente diferente, pero si VALUE no está dentro del rango esperado, realmente debería ser un error, ya que el índice de bits para la instrucción de asignación estará fuera de los límites de range_for_value .

    
respondido por el dwikle
1

¿Es realmente cierto que no hay nada como "afirmar" en Verilog? ¡Esto es algo bastante básico!

Si sus herramientas admiten lenguaje mixto, podría agregar un módulo que sea solo una entidad VHDL con los puertos o genéricos necesarios y la declaración ASSERT obvia. Para condiciones de tiempo de compilación o elaboración determinadas, esto funcionará igualmente bien en simulación o síntesis (al menos con XST o Synplicity).

entity CheckSize is
   generic (depth : natural := 16);
   port (data : std_logic_vector);
end CheckSize;

architecture empty of CheckSize is
begin
   Assert depth * data'length <= 256 Report "Size too large!" 
      severity Failure;
end empty;

Hasta ahora, ninguna de las respuestas es realmente satisfactoria, excepto tal vez el error "System Verilog 2009" (error) (uno), pero esta es probablemente la más sencilla en la gama más amplia de herramientas.

    
respondido por el Brian Drummond

Lea otras preguntas en las etiquetas