Verilog changer la taille du côté droit

Jan 14 2021

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 + 001est,

   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

3 dave_59 Jan 14 2021 at 05:55

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 ~Test uniquement déterminée par la largeur de T.