Векторы
Verilog представляет возможность работы как с отдельными объектами (скалярами), так и с их наборами – векторами.
Объявление wire
или reg
без спецификации диапазона считается шириной в 1 бит и является скалярным. Если указан диапазон, то wire
или reg
становятся многобитовыми (вектором).
Провод
Регистр
Диапазон дает возможность обращаться к отдельным битам в векторе. Диапазон указывается двумя константами компиляции, разделёнными символом :
в порядке от номера старшего бита к младшему.
Обращение к элементам вектора происходит через оператор []
. Помимо отдельных элементов можно адресоваться к непрерывной части элементов.
Синтаксис
[<start_bit> +: <width>] // выборка значений в сторону увеличения индекса
[<start_bit> -: <width>] // выборка значений в сторону уменьшения индекса
Пример 1 с иллюстрацией
reg [7:0] a;
a == 8'bxxxxxxxx
a[0] = 1;
a == 8'bxxxxxx1x
a[3] = 0;
a == 8'bxxxx0x1x
a[8] = 1;
// illegal : bit 8 does not exist in addr
a[7:4] = 4'hC;
a == 8'b11000x1x
Пример 2
module vectorized_tb;
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
Результат исполнения
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
Last updated