“<signal> n'est pas une constante” erreur dans le if
Je suis en train d'écrire un simple module de sortie 14-nombre de bits basé sur la valeur de quatre signaux d'entrée. Ma tentative est indiqué ci-dessous.
module select_size(
input a,
input b,
input c,
input d,
output [13:0] size
);
if (a) begin
assign size = 14'h2222;
end
else begin
if (b) begin
assign size = 14'h1111;
end
else begin
if (c) begin
assign size = 14'h0777;
end
else begin
assign size = 14'h0333;
end
end
end
endmodule
Lors de la compilation, j'ai l'erreur suivante:
ERREUR:HDLCompiler:44 - Ligne 67: c est pas une constante
Je ne comprends pas pourquoi que particulier si l'instruction n'est pas de travail, si les deux autres qui le précède. J'ai essayé de changer la condition de
if (c == 1) begin
mais en vain.
Quelqu'un sait comment résoudre cette erreur? Merci!!!!
Le compilateur ceux qui sont conditionnelles générer des articles, pas des instructions conditionnelles.
OriginalL'auteur Evan W | 2012-08-06
Vous devez vous connecter pour publier un commentaire.
Deux problèmes:
1) Vous avez besoin de mettre
if
états à l'intérieur d'unalways
bloc.Si vous utilisez verilog-2001, vous pouvez utiliser
Spécifier toutes les entrées de la sensibilité de la liste:
2) les affectations Constantes ne sont pas autorisés à l'intérieur des instructions if.
Supprimer la
assign
mot clé de toutes les déclarations à l'intérieur de laif
bloc:Vous devrez également déclarer la taille comme une
reg
type.Cependant ma préférence serait de réécrire l'intégralité du module avec l'opérateur conditionnel, je trouve ça beaucoup préférable à lire. Ce module permet d'obtenir le même résultat:
Merci!!!! Je suis allé avec toujours @(*)
Imbriquée ternaire affectations, très intéressant. Je vais faire un essai. Merci beaucoup!
OriginalL'auteur Tim
@Tim a déjà répondu, à l'aide de
reg
types à l'intérieur dealways
blocs ouwire
avecassign
.@Tim a aussi décrit la imbriquée ternaire affectations, tandis que dans l'exemple sont très bien écrit, ils sont généralement considéré comme une mauvaise pratique. Ils impliquent un très long chemin combinatoire et peuvent être difficiles à maintenir. La combinatoire chemin d'accès peut être optimisé par la synthèse, qui devrait impliquer un multiplexeur à une logique de sélection.
Plus facile à maintenir du code aura un faible coût de possession, et tant qu'elle ne conduit pas à une plus grande synthèse de la conception, il est normalement préférable.
Ma mise en œuvre serait d'utiliser un casez, (? n'ayez donc pas de soucis). Je trouve la priorité de chaque valeur plus facile à voir/debug.
Aussi, alors je sais que c'est un module trivial, et quelque peu d'une conception de préférence, dans une conception plus complexe, je crois que vous devez également ajouter un cas de défaut qui affecte la sortie de X. C'est une autre raison pourquoi je préfère le ternaire des affectations, comme si/d'autre et en cas de déclaration peut avoir des conséquences dangereuses pour X-Propagation dans la vérification que si vous ne faites pas attention. Si vous simuler ce et a/b/c/d X, puis le ternaire cession de propagation X à la sortie (idéal), le if/else sortie 14'h0333, et le casez instruction loquet de la valeur précédente, car il n'a pas de défaut de déclaration.
Généralement mauvaise pratique, Chaque revue de code, j'ai eu/donné. Société le guide de codage des lignes. Mon expérience de la maintenance sur les anciennes bases de code qui utilisent fortement imbriqués ternaire opérateurs. Tous ceux qui mentors m'a également fait un point d'honneur de les éviter en raison de maux de tête impliqués dans leur débogage lorsque le ne fonctionnent pas comme prévu.
La Déglutition X est un problème pour le débogage, comme suggéré par @Tim, j'ai ajouté une instruction par défaut.
>"ils sont généralement considéré comme une mauvaise pratique". Avez-vous une source pour cette affirmation? Pas sûr que ma réponse précédente est venu à travers comme prévu. J'ai été influencé par le modèle des préférences de ceux autour de moi. En Ruby, qui ont aussi l'opérateur ternaire j'ai vu dans la communauté des revues de code que l'utilisation de imbriqués les opérateurs d'obfuscation du code et abaissé la lisibilité. Pour moi, c'est un problème de la lisibilité du code. @Tim, le vôtre est le plus propre exemple de ce que j'ai vu, pas tout le monde est aussi prudent avec mise en forme du code.
OriginalL'auteur Morgan