Cette opération
additionne 3 termes 1 bit qui se retrouvent dans le résultat
sous la forme de 2 bits.
L'opérateur d'addition existe, pourquoi ne pas l'utiliser ?
Le programme généré
pourrait être :
module ADD1Bit (A1, B1, R0, S1, R1)
;
input A1, B1, R0 ;
output S1, R1 ;
assign {R1, S1} = A1 + B1 + R0;
endmodule
Attention ce résultat, bien que semblant
conforme ne l’est pas et donne un résultat
erroné. En effet, tous les termes à droite
du signe égal sont définis sur 1 bit. Le calcul
se fera sur 1 bit et le résultat sera
sur 1 bit. Il faut, pour que la taille évolue, qu’au
moins un des termes soit d’une autre taille (>= 2 bits).
Ainsi en ajoutant 0, on ne change pas le résultat,
mais le calcul est fait sur 32 bits et ramené à
2 bits au moment de l’affectation.
La solution correcte est :
module ADD1Bit (A1, B1, R0, S1, R1)
;
input A1, B1, R0 ;
output S1, R1 ;
assign {R1, S1} = A1 + B1 + R0 + 0;
endmodule
Il est aussi possible de contrôler
la taille de la variable ainsi que son codage et limiter
éventuellement les warnings à la compilation
(voir le codage des nombres).