Existe-t-il un moyen de déclencher conditionnellement une erreur de compilation dans Verilog?

9

J'ai un module paramétré dans verilog, où les paramètres sont une fréquence d'horloge et une fréquence de rafraîchissement, qui est utilisé pour calculer combien de cycles d'inactivité sont insérés entre les instances d'une opération répétée. Cependant, il est très facile de définir des paramètres qui ne peuvent pas être atteints (car l'opération prend une durée non triviale, de sorte que la répétition devrait avoir lieu avant qu'elle ne soit terminée), et pour le moment la conception ne donne aucun retour d'information sur ce.

Je me demandais s'il y avait un moyen de déclencher une erreur pendant la synthèse (ou la compilation avant la simulation) si les conditions ne peuvent pas être remplies (c'est-à-dire si un paramètre local est inférieur à un autre)? Peut-être un équivalent du hack de compilation-assertion C / C ++ populaire.

Jules
la source

Réponses:

10

Je suis sûr qu'il existe un moyen de se lier dans un rappel de temps de compilation C / C ++. Cependant, tant que vos generateblocs de support (introduits dans IEEE Std 1364-2001), vous pouvez faire quelque chose comme ceci:

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

Si la condition est vraie, le compilateur donnera une erreur car il y a une demande pour quelque chose qui n'existe pas. Si la condition est fausse, l'opération est ignorée. La seule exigence est que le code de la condition illégale respecte la syntaxe Verilog légale et la condition illégale ne deviendra jamais accidentellement valide (d'où le nom de module inexistant long et prolixe).

Si votre simulateur et vos outils de synthèse prennent en charge IEEE Std 1800-2009 (révision SystemVerilog publiée en 2009) ou une révision plus récente, vous pouvez utiliser $error()et donner un message plus significatif pour corriger l'erreur. Je ne sais pas si des fournisseurs ont encore implémenté cette fonctionnalité. Cela devrait devenir la méthode préférée une fois que la plupart des fournisseurs auront implémenté, je vais donc donner un exemple:

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

Vous pourriez faire quelque chose comme ça:

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

Les outils peuvent traiter cela légèrement différemment, mais s'il VALUEn'est pas dans la plage attendue, cela devrait vraiment être une erreur car l'index de bit pour l'instruction assign sera hors des limites de range_for_value.

dwikle
la source
1

Est-il vraiment vrai qu'il n'y a rien de tel que «affirmer» dans Verilog? C'est assez basique!

Si vos outils prennent en charge un langage mixte, vous pouvez ajouter un module qui n'est qu'une entité VHDL avec les ports ou génériques nécessaires et l'instruction ASSERT évidente. Pour les conditions de temps de compilation ou d'élaboration déterminables, cela fonctionnera aussi bien en simulation qu'en synthèse (au moins avec XST ou 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;

Jusqu'à présent, aucune des réponses n'est vraiment satisfaisante, à l'exception peut-être de celle du "System Verilog 2009" $ error (), mais c'est probablement la plus simple parmi la gamme d'outils la plus large.

Brian Drummond
la source