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

9

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 instancias de una operación repetitiva. Sin embargo, es muy fácil establecer parámetros que no se pueden lograr (debido a que la operación lleva un período de tiempo no trivial, por lo que la repetición tendría que ocurrir antes de que se haya completado), y en este momento el diseño no proporciona ningún comentario en este.

Me preguntaba si habría alguna forma de activar 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 localparam es menor que otro). Algún equivalente del popular truco C / C ++ compilación-tiempo-aserción, tal vez.

Jules
fuente

Respuestas:

10

Estoy seguro de que hay alguna forma de vincular en una devolución de llamada en tiempo de compilación C / C ++. Sin embargo, siempre que su soporte sea generatebloqueado (introducido en IEEE Std 1364-2001), puede 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, se omite la operación. 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 inexistente).

Si su simulador y sus herramientas de síntesis son compatibles con IEEE Std 1800-2009 (revisión SystemVerilog lanzada en 2009) o una revisió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 vendedor ha implementado esta función todavía. Debería convertirse en el método preferido una vez que la mayoría de los vendedores implementaron, 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
Greg
fuente
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 manera ligeramente diferente, pero si VALUEno 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 range_for_value.

dwikle
fuente
1

¿Es realmente cierto que no hay nada como "afirmar" en Verilog? ¡Esto es 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 determinables en el tiempo de compilación o elaboración, esto funcionará igualmente bien en sim 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;

Ninguna de las respuestas hasta el momento es realmente satisfactoria, excepto quizás el error "System Verilog 2009" $ error (), pero esta es probablemente la más fácil en la gama más amplia de herramientas.

Brian Drummond
fuente