2017-06-21 6 views
5

J'ai un module qui est passé un parameter puis instancie un autre module correspondant au paramètre défini.Qu'est-ce qu'une instruction LINT/synthèse safe pour lancer une erreur lors de la compilation?

Cependant, dans le cas où une affaire est pas définie pour une certaine combinaison de paramètres, je voudrais une erreur d'être jeté au moment de la compilation pour mettre en évidence le problème, comme ceci:

generate 
if (PARAM1 == 1 && PARAM2 == 2) begin 

    // instantiate module logic_A 

end else if (PARAM1 == 2 && PARAM2 == 1) begin    

    // instantiate module logic_B 

end else begin 

    // throw an error at compile time if we haven't 
    // defined a case for those parameters 

end 
endgenerate 

Cependant , ce code doit encore être synthétisable (dans Verilog, pas SystemVerilog) et passer LINTing, malgré l'erreur insérée.

Est-ce que quelqu'un sait ce que je pourrais utiliser dans cette situation? Merci d'avance.

Répondre

4

J'ai répondu à une question très similaire sur le site soeur, Electronics StackExchange, pour "a way of conditionally triggering a compile-time error in verilog". La solution est de conditionner et d'instancier un module qui n'existe pas. Je recommande que le module inexistant ait un nom très long et un nom significatif, explique l'erreur. Cela réduit également le risque que les modules non existants portent accidentellement le même nom qu'un module existant.

generate 
if (PARAM1 == 1 && PARAM2 == 2) begin : use_logicA 
    // instantiate module logic_A 
end 
else if (PARAM1 == 2 && PARAM2 == 1) begin : use_logicB 
    // instantiate module logic_B 
end 
else begin : illegal 
    illegal_parameter_condition_triggered_will_instantiate_an non_existing_module(); 
end 
endgenerate 

Cela fonctionne parce que vérifier l'existence du module non-existant ne se fait pas jusqu'à ce que les valeurs des paramètres sont évalués au cours de la phase d'élaboration.


La meilleure solution serait d'utiliser l'approche SystemVerilog; spécifiquement avec un complément de simulateur avec la norme IEEE Std 1800-2009 ou plus récent. Ensuite, vous pouvez utiliser $error() et donner un message plus significatif pour aller avec l'erreur (par exemple, imprimer les valeurs de paramètre qui ont déclenché la condition d'erreur). Vous pouvez en lire plus à ce sujet dans IEEE Std 1800-2012 20.11 tâches système élaboration

generate 
if (PARAM1 == 1 && PARAM2 == 2) begin : use_logicA 
    // instantiate module logic_A 
end 
else if (PARAM1 == 2 && PARAM2 == 1) begin : use_logicB 
    // instantiate module logic_B 
end 
else begin : illegal 
    $error("Expected PRAM1/2 to be 1/2 or 2/1, but was %0d/%0d", PARAM1, PARAM2); 
end 
endgenerate 
0

Non. Il n'y a rien dans Verilog pour cela. Vous ne pouvez pas le faire lors de la compilation.

Mais vous pouvez faire quelque chose pour vider les erreurs et sortir à l'instant '0' en simulation.

Dans Verilog système, vous pouvez ajouter une affirmation:

initial assert(0) else $fatal("--error--"); 

ou tout simplement

initial $fatal("--error--"); 

autrement quelque chose comme ça:

initial begin $display("--error--"); $finish; end 

deux fournira un message au début de simulation.

+2

En SystemVerilog, vous pouvez simplement faire '$ fatale ("message") dans la clause else du' generate-if'. –

+0

Juste vérifié, dans vcs 2015 il est implémenté mais nécessite un switch de compilation spécial "-assert svaext". vcs produit un joli message de compilation dans un tel cas. Sinon, il détecte une erreur de syntaxe. Avec 'initial', il compile sans problèmes et génère un message de violation d'exécution. – Serge

1

Il est un peu maladroit et je ne sais pas ce que votre outil de peluches vérifie, mais que diriez-vous:

generate 
    if (PARAM1 == 1 && PARAM2 == 2) begin 

    // instantiate module logic_A 

    end else if (PARAM1 == 2 && PARAM2 == 1) begin    

    // instantiate module logic_B 

    end else begin 

    reg ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2; 
    reg DUMMYO, DUMMYI; 
    always @(posedge ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2 or negedge ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2) 
     DUMMYO <= DUMMYI; 

    end 
endgenerate 

Cela donne l'erreur suivante sur Quartus quand je mis PARAM1-3:

erreur (10239): Verilog HDL toujours construire erreur à synth_assertion.v (18): commande d'événement ne peut pas tester pour les deux bords positifs et négatifs de la variable "ILLEGAL_VALUES_ON_PARAM1_AND_PARAM2"