Verilog changer la taille du côté droit
J'ai un module de base comme suit pour démontrer quelque chose.
module tb();
reg [2:0] U;
reg [2:0] T;
reg [2:0] C;
reg E;
initial begin
U = 5;
T = 3;
{E, C} = U + ~T + 1'b1;
#1000;
end
endmodule
Ce que j'attends, c'est que E soit 1, parce que;
U
est 101
T
est 011
et U + ~T + 001
est,
101
100
001
+______
= 1010
Donc, C obtient la partie 010 et E obtient 1. C'est le comportement attendu, cependant, j'obtiens C comme identique mais E comme 0. Je pense que verilog augmente la taille des variables RHS à 4 bits car le côté gauche est de 4 bits ( 1 + 3). Cependant, pour T, il ajoute un 0 avant de compléter T, donc T devient 0011 et son complément se trouve être 1100, au lieu de 0100, version 4 bits du complément T.
Et cela conduit à,
0101
1100
0001
+______
= 10010
Ce qui fait que E est égal à 0 comme on le voit.
Je ne comprends pas pourquoi il en est ainsi et je n'ai pas pu trouver un moyen de faire en sorte que la complémentation se produise avant d'ajouter un zéro non significatif.
Si je fais ce qui suit à la place, cela fonctionne bien et E obtient 1:
U = 5;
T = 3;
T = ~T;
{E, C} = U + T + 1'b1;
Cela confirme que mes soupçons sont justes. Donc, j'ai une telle solution, oui. Cependant, je n'en suis pas vraiment satisfait, je pense qu'il devrait y avoir un moyen d'empêcher ce comportement.
Toute aide serait appréciée.
Réponses
Lorsque vous avez des opérandes de mélange de largeurs différentes, Verilog a des règles pour dimensionner chaque opérande à la largeur du plus grand opérande en fonction du contexte de l'expression. Vous avez correctement noté que le LHS est de 4 bits, les opérandes sur le RHS sont étendus à 4 bits. Cela se produit avant d' appliquer l'opération.
Vous pouvez résoudre ce problème en tirant parti du fait que les opérandes d'une concaténation sont des contextes auto-déterminés:
{E, C} = U + {~T} + 1'b1;
Désormais, la largeur de ~T
est uniquement déterminée par la largeur de T
.