Scalaire et vecteur Verilog
Verilog doit représenter des bits individuels ainsi que des groupes de bits. Par exemple, un élément séquentiel à un seul bit est une bascule. Or un élément séquentiel 16 bits est un registre pouvant contenir 16 bits. A cet effet, Verilog a scalaire et vecteur filets et variables.
Scalaire et Vecteur
Un filet ou reg
la déclaration sans spécification de plage est considérée comme ayant une largeur de 1 bit et est un scalaire . Si une plage est spécifiée, alors le net ou reg
devient une entité multibit connue sous le nom de vecteur .
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
La plage donne la possibilité d'adresser des bits individuels dans un vecteur. Le bit le plus significatif du vecteur doit être spécifié comme valeur de gauche dans la plage tandis que le bit le moins significatif du vecteur doit être spécifié sur la droite.
wire [msb:lsb] name;
integer my_msb;
wire [15:0] priority; // msb = 15, lsb = 0
wire [my_msb: 2] prior; // illegal
Un réseau de 16 bits appelé priorité sera créé dans l'exemple ci-dessus. Notez que le msb et lsb doit être une expression constante et ne peut pas être remplacée par une variable. Mais il peut s'agir de n'importe quelle valeur entière - positive, négative ou nulle ; et le lsb la valeur peut être supérieure, égale ou inférieure à la valeur msb.
Sélections de bits
Tout bit d'une variable vectorisée peut être sélectionné individuellement et se voir attribuer une nouvelle valeur, comme indiqué ci-dessous. C'est ce qu'on appelle un bit-select . Si le bit-select est hors limites ou si le bit-select est x ou z , alors la valeur renvoyée sera 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
Part-sélectionne
Une plage de bits contigus peut être sélectionnée et est connue sous le nom de part-select . Il existe deux types de sélections de partie, une avec une sélection de partie constante et une autre avec une sélection de partie indexée.
reg [31:0] addr;
addr [23:16] = 8'h23; // bits 23 to 16 will be replaced by the new value 'h23 -> constant part-select
Le fait d'avoir une sélection de partie variable permet de l'utiliser efficacement dans des boucles pour sélectionner des parties du vecteur. Bien que le bit de départ puisse varier, la largeur doit être constante.
[<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
Journal de simulation 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.
Erreurs courantes
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