Verilog ändert die Größe der rechten Seite
Ich habe ein Grundmodul wie folgt, um etwas zu demonstrieren.
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
Was ich erwarte, ist, dass E 1 ist, weil;
U
ist 101
T
ist 011
und U + ~T + 001
ist,
101
100
001
+______
= 1010
Also, C bekommt 010 Teil und E bekommt 1. Dies ist das erwartete Verhalten, aber ich bekomme C genauso, aber E als 0. Ich denke, Verilog erhöht die Größe von RHS-Variablen auf 4 Bit, weil die linke Seite 4 Bit ist ( 1 + 3). Für T wird jedoch die führende 0 vor dem Komplementieren von T angehängt, sodass T zu 0011 wird und sein Komplement zufällig 1100 anstelle der 0100-4-Bit-Version des T-Komplements ist.
Und das führt zu,
0101
1100
0001
+______
= 10010
Was dazu führt, dass E wie gesehen 0 ist.
Ich verstehe nicht, warum dies so ist, und konnte keinen Weg finden, eine Ergänzung zu erreichen, bevor eine führende Null hinzugefügt wurde.
Wenn ich stattdessen Folgendes mache, funktioniert es einwandfrei und E erhält 1:
U = 5;
T = 3;
T = ~T;
{E, C} = U + T + 1'b1;
Dies bestätigt, dass mein Verdacht richtig ist. Ich habe also eine solche Lösung, ja. Ich bin jedoch nicht wirklich zufrieden damit. Ich denke, es sollte einen Weg geben, dieses Verhalten zu verhindern.
Jede Hilfe wäre dankbar.
Antworten
Wenn Sie Operanden mit einer Mischung unterschiedlicher Breiten haben, hat Verilog Regeln, um jeden Operanden basierend auf dem Kontext des Ausdrucks auf die Breite des größten Operanden zu skalieren. Sie haben richtig bemerkt, dass die LHS 4 Bit beträgt, die Operanden auf der RHS werden auf 4 Bit erweitert. Dies geschieht vor dem Anwenden der Operation.
Sie können dies beheben, indem Sie die Tatsache ausnutzen, dass Operanden einer Verkettung selbstbestimmte Kontexte sind:
{E, C} = U + {~T} + 1'b1;
Jetzt wird die Breite von ~T
ausschließlich durch die Breite von bestimmt T
.