Die Anatomie eines gesizten Literals
Ein Verilog-Literal hat bis zu drei Teile:
8'b1010_1100
│ │ │
│ │ └─ Ziffern in der gewählten Basis
│ └─── Basisspezifizierer: b (binär), h (hex), d (dezimal), o (oktal)
└────── Breite in Bits (dezimal)
Von links nach rechts gelesen: "ein 8-Bit-Wert, binär geschrieben, mit den Ziffern 10101100". Das ist 172 in Dezimal, 0xAC in Hex, dieselben Bits, egal wie du sie schreibst. Die Breite sagt dem Compiler exakt, wie viele Bits zu reservieren sind; die Basis sagt, wie die Ziffern zu interpretieren sind.
Unterstriche sind visuelle Trenner. 32'b1010_1100_0011_0101 ist dasselbe wie 32'b1010110000110101. Nutze sie.
Die vier Basen
Hex (h) ist der Standard für alles, was breiter als 4 Bit ist. Binär (b) ist der Standard, wenn du Bitmuster direkt lesen willst. Dezimal (d) ist für menschlich bedeutsame Zählwerte. Oktal (o) existiert, aber du wirst es fast nie sehen.
Hex-Ziffern sind case-insensitiv: 8'hAB und 8'hab sind identisch.
Was passiert, wenn der Wert nicht passt?
Füllen deine Ziffern die deklarierte Breite nicht, zero-extendet Verilog links:
8'b101 // äquivalent zu 8'b00000101 (= 5)
8'hF // äquivalent zu 8'h0F (= 15)
Übersteigen deine Ziffern die deklarierte Breite, kappt Verilog die hohen Bits mit einer Warnung:
4'hFF // wird auf 4'hF gekürzt, Simulator warnt
4'b10000 // wird auf 4'b0000 gekürzt
Die Warnung ist dein Freund. Unterdrücke sie nicht.
Gesized vs Ungesized
Ein Literal ohne Breite:
'd10 // ungesized, nimmt Default-Größe (≥32 Bit)
10 // auch ungesized - ohne Basis bedeutet dezimal
Ungesizte Literale gehen in den meisten Tools per Default auf 32 Bit. Das ist die Quelle einer ganzen Klasse von Bugs:
reg [7:0] count;
if (count == -1) ... // -1 ist ungesized 32-Bit; Vergleich wird seltsam
Der Fix ist 8'hFF statt -1 zu schreiben, oder 8'd255, oder {8{1'b1}}. Gröstze Literale immer, wenn sie in breitenspezifischen Ausdrücken verwendet werden.
Der eine Ort, an dem ungesizte Literale okay sind, sind integer-Counter in Testbench-for-Schleifen, wo der Integer breit genug ist, dass nichts Überraschendes passiert.
Signed Literale
Standardmäßig sind gesizte Literale unsigned:
8'd255 // unsigned 255
8'b1111_1111 // unsigned 255 - gleiches Bitmuster, nur anders geschrieben
Willst du das Literal als signed interpretiert haben, füge s nach dem Apostroph ein:
8'sd10 // signed 10
8'sb1111_1111 // signed -1 (Zweierkomplement)
Die s-Flag zählt für:
- Die
<<<- und>>>-Operatoren (arithmetische Shifts) - sie sign-extenden signed-Operanden. - Vergleichs-Operatoren auf gemischten signed-Ausdrücken.
- Die
$signed/$unsigned-Casts.
Für gewöhnliche Arithmetik auf Bussignalen lässt du das s weg.
Zahlen-Literale mit X und Z
Eine Literal-Ziffer kann x (unknown) oder z (high-impedance) sein:
8'bx ist Kurzform für "alle 8 Bit unknown" - der Wert wird propagiert, um die deklarierte Breite zu füllen. x-Ziffern sind in default-Cases von Automaten und in der Initialisierung üblich. Die Semantik behandeln wir in X- und Z-Werte.
Wo gesizte Literale in der Praxis auftauchen
Sobald du echte Module schreibst, tauchen gesizte Literale überall auf:
// Busbreiten
input wire [31:0] addr;
wire [31:0] zero = 32'h0;
wire [31:0] all_ones = 32'hFFFF_FFFF;
// Zustandskodierungen
localparam IDLE = 3'd0;
localparam BUSY = 3'd1;
localparam DONE = 3'd2;
// Masken
wire is_msb_set = data & 32'h8000_0000;
// Vergleiche
if (counter == 8'd255) ...
// Resetwerte
always @(posedge clk) begin
if (reset) data_out <= 8'd0;
else data_out <= data_in;
end
Das Muster ist konsistent: Breite schreiben, Basis schreiben, Ziffern schreiben. Jedes Literal, zu dem du greifst, hat dieselbe Form.
Eine Testfahrt
Du hast jetzt alles, was du brauchst, um jede Konstante zu schreiben, die ein Verilog-Modul je verlangen könnte. Das letzte Stück der Datentyp-Geschichte ist, was passiert, wenn ein Signal kein sauberes 0 oder 1 ist - die x- und z-Werte.
Häufig gestellte Fragen
Was bedeutet 8'b1010 in Verilog?
Es ist ein gesiztes Binär-Literal: ein 8-Bit-Wert, dessen Binärdarstellung 00001010 ist. Die Zahl vor dem Apostroph ist die Breite in Bits; der Buchstabe danach ist die Basis (b binär, h hex, d dezimal, o oktal); die Ziffern danach sind der Wert. Das Literal wird links mit Nullen gepolstert, wenn die Ziffern die Breite nicht füllen.
Was ist der Unterschied zwischen gesizten und ungesizten Zahlen in Verilog?
Ein gesiztes Literal wie 8'd10 ist exakt 8 Bit breit. Ein ungesiztes Literal wie 'd10 oder einfach 10 ist per Default 32 Bit, was meist zu viel ist. Ungesizte Literale in breitenspezifische Ausdrücke zu mischen verursacht subtile Bugs - bevorzuge gesizte Literale überall außer in Wegwerf-Testcode.
Wie schreibt man eine Hex-Zahl in Verilog?
Mit dem 'h-Basisspezifizierer: 8'hFF ist ein 8-Bit-Wert von 255. Hex-Ziffern sind case-insensitiv; 8'hff und 8'hFF sind identisch. Du kannst Ziffern mit Unterstrichen für die Lesbarkeit gruppieren: 32'hDEAD_BEEF. Der Parser ignoriert die Unterstriche.
Wie funktionieren Unterstriche in Verilog-Zahlen?
Unterstriche sind visuelle Trenner, die der Parser ignoriert. 32'b1010_1100_0011_0101 ist exakt derselbe Wert wie 32'b1010110000110101, aber viel besser lesbar. Das erste Zeichen nach dem Basis-Präfix darf kein Unterstrich sein, aber sonst kannst du sie überall in der Ziffernkette platzieren.
Wie schreibt man eine signed Zahl in Verilog?
Füge s nach dem Apostroph ein: 8'sd10 ist ein signed 8-Bit-Dezimal-10, und 8'sb1111_1111 ist signed -1. Standardmäßig sind gesizte Literale unsigned; der s-Modifier dreht das. Die meiste Arithmetik nutzt unsigned Operanden - greife nur dann zu signed, wenn du wirklich negative Werte durch <, >>> und ähnliche Operatoren propagieren willst.