Векторы

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