Verilog Scalars und Vectors verstehen: Bits, Register, Net-Typen
Verilog muss einzelne Bits und Bitgruppen darstellen. Ein einzelnes sequenzielles Element = Flipflop (1 Bit). 16-Bit-sequenzielles Element = Register (16 Bits). Dafür gibt es scalar und vector Nets und Variables.
Scalar und Vector
Net oder reg ohne Bereichsangabe = 1 Bit breit = Scalar. Mit Bereichsangabe = Multibit-Entität = Vector.
wire o_nor; // 1-Bit Scalar Net
wire [7:0] o_flop; // 8-Bit Vector Net
reg parity; // 1-Bit Scalar Variable
reg [31:0] addr; // 32-Bit Vector Variable für Adresse
Der Bereich ermöglicht Adressierung einzelner Bits im Vektor. MSB (Most Significant Bit) = linker Wert im Bereich, LSB (Least Significant Bit) = rechter Wert.
wire [msb:lsb] name;
integer my_msb;
wire [15:0] priority; // msb=15, lsb=0
wire [my_msb:2] prior; // Illegal: msb/lsb müssen konstante Ausdrücke sein
MSB/LSB können beliebige Integer sein (positiv, negativ, null). LSB kann größer, gleich oder kleiner als MSB sein.
Bit-Selektion (Bit-Selects)
Einzelnes Bit in einem Vektor kann selektiert und zugewiesen werden. Out-of-bounds oder x/z Selektion → Rückgabewert x.
reg [7:0] addr; // Bits [7,6,5,4,3,2,1,0]
addr[0] = 1; // Bit 0 auf 1
addr[3] = 0; // Bit 3 auf 0
addr[8] = 1; // Illegal: Bit 8 existiert nicht
Teil-Selektion (Part-Selects)
Zusammenhängender Bitbereich. Zwei Arten: Constant Part-Select und Indexed Part-Select.
reg [31:0] addr;
addr[23:16] = 8'h23; // Bits 23 bis 16 ersetzt durch 0x23 (Constant)
Variable Part-Select (effektiv in Loops): Startbit variabel, Breite konstant.
[ +: ] // inkrementiert von Startbit
[ -: ] // dekrementiert von Startbit
module des;
reg [31:0] data;
int i;
initial begin
data = 32'hFACE_CAFE;
for (i = 0; i < 4; i++) begin
$display("data[8*%0d +: 8] = 0x%0h", i, data[8*i +: 8]);
end
$display("data[7:0] = 0x%0h", data[7:0]);
$display("data[15:8] = 0x%0h", data[15:8]);
$display("data[23:16] = 0x%0h", data[23:16]);
$display("data[31:24] = 0x%0h", data[31:24]);
end
endmodule
Simulationslog:
data[8*0 +: 8] = 0xfe data[8*1 +: 8] = 0xca data[8*2 +: 8] = 0xce data[8*3 +: 8] = 0xfa data[7:0] = 0xfe data[15:8] = 0xca data[23:16] = 0xce data[31:24] = 0xfa
Häufige Fehler
module tb;
reg [15:0] data;
initial begin
$display("data[0:9] = 0x%0h", data[0:9]); // Error: Reversed part-select index ordering
end
endmodule
Part-Select-Indizes müssen in der gleichen Reihenfolge wie die Deklaration (MSB:LSB) angegeben werden.
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
- Inter- und Intra-Assignment Delays in Verilog verstehen
- Verilog Clock Generator: Design & Implementierungsleitfaden
- Verilog Math Functions meistern für effizientes Hardware-Design
- Verilog $timeformat meistern: Präzision und Anzeigesteuerung