9 votos

¿Hay una forma de activación condicional de un error de compilación en verilog?

Tengo un parametrizar el módulo en verilog, donde los parámetros son una velocidad de reloj y la frecuencia de actualización, que se utiliza para calcular el número de ciclos de inactividad se insertan entre las instancias de una repetición de la operación. Sin embargo, es muy fácil establecer parámetros que no puede ser alcanzado (debido a que la operación se lleva a no trivial de la longitud de tiempo, por lo que la repetición tendría que ocurrir antes de que se hubiera completado), y en el momento en que el diseño no dar ninguna opinión sobre esta.

Me preguntaba si había alguna manera de que yo pueda desencadenar un error durante la síntesis (o la compilación antes de simulación) si las condiciones no se cumplen (es decir, si uno localparam es menos que el otro)? Algunos equivalente de la popular C/C++ en tiempo de compilación afirmar hack, tal vez.

10voto

MegaMind Puntos 116

Estoy seguro de que hay alguna manera de enlazar en una C/C++ tiempo de compilación de devolución de llamada. Sin embargo, mientras que los soportes generate bloques (introducido en IEEE Std 1364-2001), entonces usted 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 no es una petición de algo que no existe. Si la condición es falsa, entonces la operación se omite. El único requisito es el código para el ilegal condición de la siguiente manera legal Verilog de la sintaxis y la ilegal condición nunca accidentalmente válida (de ahí el largo y detallado no-existente nombre del módulo).

Si el simulador y las herramientas de síntesis de soporte IEEE Std 1800-2009 (SystemVerilog de revisión publicado en 2009) o la más reciente revisión, entonces usted puede utilizar $error() y dar un mensaje más significativo para ir con el error. No estoy seguro de si alguna de las vendedoras ha implementado esta característica todavía. Debe ser el método preferido una vez que la mayoría de los vendedores implementado, por lo tanto voy a 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

1voto

nikolaMM94 Puntos 38

Usted podría 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

Herramientas pueden tratar esto un poco diferente, pero si VALUE no está dentro del rango esperado realmente debe ser un error desde el índice de bit de la instrucción de asignación será fuera de los límites de range_for_value .

1voto

Brian Drummond Puntos 27798

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

Si las herramientas de soporte de lenguaje mixto, se puede añadir un módulo que es sólo una entidad VHDL con los puertos necesarios o los medicamentos genéricos y la evidente instrucción ASSERT. Para compilar o elaboración de tiempo determinable condiciones, esto va a funcionar igual de bien en la tarjeta sim o de 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 son muy satisfactorios, excepto tal vez el "Sistema de Verilog 2009" $error (), pero este es probablemente el más fácil a través de la más amplia gama de herramientas.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X