Verilog-Syntax meistern: Wichtige Regeln & Best Practices
Lexikalische Konventionen in Verilog ähneln C: Ein Strom von Tokens. Ein Token besteht aus einem oder mehreren Zeichen und kann Kommentare, Keywords, Zahlen, Strings oder Whitespace sein. Alle Zeilen müssen mit Semikolon ; enden.
var_a und var_A sind unterschiedliche Bezeichner.Kommentare
Zwei Arten:
- Einzeilig: Beginnt mit
//– alles bis Zeilenende ist Kommentar. - Mehrzeilig: Beginnt mit
/*, endet mit*/– nicht verschachtelbar.
Einzeilige Kommentare können in mehrzeiligen verschachtelt werden.
// Einzeiliger Kommentar
integer a; // Variable a, alles rechts von // ist Kommentar
/* Mehrzeiliger Block-Kommentar */
/* Dies ist /* ein ungültig verschachtelter Block-Kommentar */ */
/* Aber // dieser hier ist okay */
// Auch okay
///////////// Immer noch okay
Whitespace
Whitespace (Spaces, Tabs, Newlines, Formfeeds) wird ignoriert, außer er trennt Tokens. Hilft bei Einrückung für Lesbarkeit.
module dut;
// 'module' ist Keyword, 'dut' Identifier
reg [8*6:1] name = "Hello!";
// Die 2 Spaces am Anfang werden ignoriert
In Strings werden Blanks/Tabs nicht ignoriert:
// Kein Space am Zeilenanfang, aber im String
reg [8*6:1] addr = "Earth ";
endmodule
Operatoren
Drei Typen: unär, binär, ternär/conditional.
- Unäre Operatoren stehen links vom Operanden
- Binäre Operatoren zwischen Operanden
- Ternäre Operatoren haben zwei Operatoren für drei Operanden
x = ~y; // ~ unär, y Operand
x = y | z; // | binär, y und z Operanden
x = (y > 5) ? w : z; // ?: ternär, (y>5), w, z Operanden
Ist (y > 5) wahr, erhält x Wert von w, sonst z.
Zahlenformate
Standard: Dezimal. Für andere Basen (Binär, Oktal, Hex) gelten Regeln:
16 // Dezimal
0x10 // Hexadezimal
10000 // Binär
20 // Oktal
Sized Numbers (mit Breitenangabe)
Syntax: [size]'[base_format][number]
base_format: 'd/'D (Dezimal), 'h/'H (Hex), 'o/'O (Oktal), 'b/'B (Binär)number: Ziffern entsprechend der Basis (0-9, A-F für Hex)
3'b010; // 3 Bit, Binär, Wert 2
3'd2; // 3 Bit, Dezimal, Wert 2
8'h70; // 8 Bit, Hex 0x70 = Dezimal 112
9'h1FA; // 9 Bit, Hex 0x1FA = Dezimal 506
4'hA = 4'd10 = 4'b1010 = 4'o12 // Dezimal 10 in 4 Formaten
8'd234 = 8'D234 // Groß-/Kleinschreibung bei Base egal
32'hFACE_47B2; // Underscore _ für Lesbarkeit (16-Bit-Gruppen)
16'hcafe; // Kleinbuchstaben OK
16'hCAFE; // Großbuchstaben OK
32'h1D40_CAFE; // Underscore als Trenner OK
Unsized Numbers (ohne Breitenangabe)
Ohne base_format → Dezimal. Ohne size → Standardbreite (simulator-/maschinenabhängig, oft 32 Bit).
integer a = 5423; // Dezimal 5423
integer a = 'h1AD7; // 32 Bit: 32'h0000_1AD7
Negative Zahlen
Minuszeichen vor der Größe: -6'd3 (8-bit Two's Complement von 3). Minus zwischen Base und Number ist illegal: 8'd-4 → Fehler.
-6'd3; // 8-bit negativ, Two's Complement von 3
-6'sd9; // Für signed Arithmetik
8'd-4; // Illegal!
Strings
Zeichenkette in doppelten Anführungszeichen " ". Nicht mehrzeilig. Jedes Zeichen = 1 Byte.
"Hello World!" // 12 Zeichen → 12 Bytes
"x + z" // 5 Zeichen
"How are you...?" // Illegal: mehrzeilig
Identifiers (Bezeichner)
Namen für Variablen. Alphanumerisch [a-z][A-Z][0-9], Underscore _, Dollar $. Case-sensitive. Darf nicht mit Ziffer oder $ beginnen.
integer var_a; // OK
integer $var_a; // Ungültig: beginnt mit $
integer v$ar_a; // OK: $ mittendrin
integer 2var; // Ungültig: beginnt mit Ziffer
integer var23_g; // OK
integer 23; // Ungültig: nur Ziffern
Keywords
Reservierte Bezeichner für Sprachkonstrukte, in Kleinbuchstaben. Wichtige Keywords siehe Abbildung (nicht als Text verfügbar).
Verilog-Revisionen
Verilog hat mehrere Revisionen durchlaufen (1995–2001), siehe Abbildung.
Verilog
- Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
- Verilog Concatenation meistern: Praktischer Leitfaden
- Verilog Assignments verstehen: Typen, Syntax und Best Practices
- Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
- Verilog Functions meistern für effizientes RTL-Design
- Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
- Verilog Clock Generator: Design & Implementierungsleitfaden
- Verilog Math Functions meistern für effizientes Hardware-Design
- Verilog $timeformat meistern: Präzision und Anzeigesteuerung
- Verilog Timescales an jedem Scope verstehen und ausgeben