Verilog-Skalar und -Vektor
Verilog muss sowohl einzelne Bits als auch Gruppen von Bits darstellen. Beispielsweise ist ein sequentielles Einzelbitelement ein Flip-Flop. Ein sequentielles 16-Bit-Element ist jedoch ein Register, das 16 Bits aufnehmen kann. Zu diesem Zweck hat Verilog Skalar und Vektor Netze und Variablen.
Skalar und Vektor
Ein Netz oder reg
Deklaration ohne Bereichsangabe wird als 1 Bit breit angesehen und ist ein Skalar . Wenn ein Bereich angegeben ist, dann das Netz oder reg
wird zu einer Multibit-Entität, die als Vektor bekannt ist .
wire o_nor; // single bit scalar net
wire [7:0] o_flop; // 8-bit vector net
reg parity; // single bit scalar variable
reg [31:0] addr; // 32 bit vector variable to store address
Der Bereich gibt die Möglichkeit, einzelne Bits in einem Vektor zu adressieren. Das höchstwertige Bit des Vektors sollte als linker Wert im Bereich angegeben werden, während das niedrigstwertige Bit des Vektors rechts angegeben werden sollte.
wire [msb:lsb] name;
integer my_msb;
wire [15:0] priority; // msb = 15, lsb = 0
wire [my_msb: 2] prior; // illegal
Im obigen Beispiel wird ein 16 Bit breites Netz namens Priorität erstellt. Beachten Sie, dass die msb und lsb sollte ein konstanter Ausdruck sein und kann nicht durch eine Variable ersetzt werden. Aber sie können jeden ganzzahligen Wert haben - positiv, negativ oder null; und das lsb Der Wert kann größer, gleich oder kleiner als der msb-Wert sein.
Bit-Auswahl
Jedes Bit in einer vektorisierten Variablen kann einzeln ausgewählt und wie unten gezeigt einem neuen Wert zugewiesen werden. Dies wird als Bitauswahl bezeichnet . Wenn die Bitauswahl außerhalb der Grenzen liegt oder die Bitauswahl x ist oder z , dann ist der zurückgegebene Wert x .
reg [7:0] addr; // 8-bit reg variable [7, 6, 5, 4, 3, 2, 1, 0]
addr [0] = 1; // assign 1 to bit 0 of addr
addr [3] = 0; // assign 0 to bit 3 of addr
addr [8] = 1; // illegal : bit8 does not exist in addr
Teilauswahl
Eine Reihe zusammenhängender Bits kann ausgewählt werden und wird als Teilauswahl bezeichnet . Es gibt zwei Arten von Teilauswahlen, eine mit einer konstanten Teilauswahl und eine andere mit einer indizierten Teilauswahl.
reg [31:0] addr;
addr [23:16] = 8'h23; // bits 23 to 16 will be replaced by the new value 'h23 -> constant part-select
Eine variable Teilauswahl ermöglicht eine effektive Verwendung in Schleifen, um Teile des Vektors auszuwählen. Obwohl das Startbit variiert werden kann, muss die Breite konstant sein.
[<start_bit> +: <width>] // part-select increments from start-bit [<start_bit> -: <width>] // part-select decrements from start-bit
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
Simulationsprotokoll ncsim> run data[8*0 +: 8] = 0xfe // ~ data [8*0+8 : 8*0] data[8*1 +: 8] = 0xca // ~ data [8*1+8 : 8*1] data[8*2 +: 8] = 0xce // ~ data [8*2+8 : 8*2] data[8*3 +: 8] = 0xfa // ~ data [8*3+8 : 8*3] data[7:0] = 0xfe data[15:8] = 0xca data[23:16] = 0xce data[31:24] = 0xfa ncsim: *W,RNQUIE: Simulation is complete.
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 expression ordering
end
endmodule
Verilog