Verilog ändert die Größe der rechten Seite

Jan 14 2021

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

   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

3 dave_59 Jan 14 2021 at 05:55

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 ~Tausschließlich durch die Breite von bestimmt T.