Gibt es eine Möglichkeit, einen Fehler bei der Kompilierung in Verilog bedingt auszulösen?

9

Ich habe ein parametrisiertes Modul in Verilog, bei dem die Parameter eine Taktrate und eine Aktualisierungsrate sind, mit denen berechnet wird, wie viele Inaktivitätszyklen zwischen Instanzen einer sich wiederholenden Operation eingefügt werden. Es ist jedoch sehr einfach, Parameter einzustellen, die nicht erreicht werden können (da die Operation nicht trivial dauert, sodass die Wiederholung vor Abschluss erfolgen müsste), und das Design gibt derzeit keine Rückmeldung dazu.

Ich habe mich gefragt, ob es eine Möglichkeit gibt, während der Synthese (oder Kompilierung vor der Simulation) einen Fehler auszulösen, wenn die Bedingungen nicht erfüllt werden können (dh wenn ein lokaler Parameter kleiner als ein anderer ist). Vielleicht ein Äquivalent zum beliebten C / C ++ - Hack zur Kompilierungszeit.

Jules
quelle

Antworten:

10

Ich bin sicher, dass es eine Möglichkeit gibt, einen C / C ++ - Rückruf zur Kompilierungszeit zu binden. Solange Ihre Unterstützungsblöcke generate(eingeführt in IEEE Std 1364-2001), können Sie jedoch Folgendes tun:

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

Wenn die Bedingung erfüllt ist, gibt der Compiler einen Fehler aus, da eine Anforderung für etwas vorliegt, das nicht vorhanden ist. Wenn die Bedingung falsch ist, wird die Operation übersprungen. Die einzige Voraussetzung ist, dass der Code für die unzulässige Bedingung der gesetzlichen Verilog-Syntax folgt und die unzulässige Bedingung niemals versehentlich gültig wird (daher der lange und ausführliche nicht vorhandene Modulname).

Wenn Ihr Simulator und Ihre Synthesetools IEEE Std 1800-2009 (SystemVerilog-Revision, veröffentlicht 2009) oder eine neuere Revision unterstützen, können Sie $error()eine aussagekräftigere Meldung verwenden, um den Fehler zu beheben. Ich bin mir nicht sicher, ob ein Anbieter diese Funktion bereits implementiert hat. Sobald die meisten Anbieter implementiert sind, sollte dies die bevorzugte Methode sein. Daher werde ich ein Beispiel geben:

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

Sie könnten so etwas tun:

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

Tools können dies etwas anders behandeln, aber wenn VALUEes nicht innerhalb des erwarteten Bereichs liegt, sollte es wirklich ein Fehler sein, da der Bitindex für die Zuweisungsanweisung außerhalb der Grenzen von liegt range_for_value.

dwikle
quelle
1

Stimmt es wirklich, dass es in Verilog nichts Vergleichbares gibt wie "behaupten"? Das ist ziemlich einfaches Zeug!

Wenn Ihre Tools gemischte Sprachen unterstützen, können Sie ein Modul hinzufügen, das nur eine VHDL-Entität mit den erforderlichen Ports oder Generika und der offensichtlichen ASSERT-Anweisung ist. Für durch die Kompilierungs- oder Ausarbeitungszeit bestimmbare Bedingungen funktioniert dies in der Simulation oder Synthese gleich gut (zumindest mit XST oder 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;

Keine der bisherigen Antworten ist wirklich zufriedenstellend, außer vielleicht der "System Verilog 2009" $ error (), aber dies ist wahrscheinlich die einfachste für die breiteste Palette von Tools.

Brian Drummond
quelle