# Векторы

Verilog представляет возможность работы как с отдельными объектами (скалярами), так и с их наборами – векторами.

Объявление `wire` или `reg` без спецификации диапазона считается шириной в 1 бит и является скалярным. Если указан диапазон, то `wire` или `reg` становятся многобитовыми (вектором).

|         | Скалярные значения                                                                                                                                                                                         | Векторные значения                                                                                                                                                                                      |
| ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Провод  | ![](https://1605996681-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FkhrUYO4h2JjjaxSLXUTQ%2Fuploads%2Fgit-blob-520cade55c671cc3e8fc82da4f29425c769318a4%2Fscalar-wire.png?alt=media) | ![](https://1605996681-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FkhrUYO4h2JjjaxSLXUTQ%2Fuploads%2Fgit-blob-de0e37597b4b43ddb13eb88ed4d902fe090392f0%2Fvec-wire.png?alt=media) |
| Регистр | ![](https://1605996681-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FkhrUYO4h2JjjaxSLXUTQ%2Fuploads%2Fgit-blob-a3deab83b73a107018d375f80d59a6a4020dd21d%2Fscalar-reg.png?alt=media)  | ![](https://1605996681-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FkhrUYO4h2JjjaxSLXUTQ%2Fuploads%2Fgit-blob-96e1cb351572e7754158f5334ddb0cbaecc2afc8%2Fvec-reg.png?alt=media)  |

Диапазон дает возможность обращаться к отдельным битам в векторе. Диапазон указывается двумя константами компиляции, разделёнными символом `:` в порядке от номера старшего бита к младшему.

Обращение к элементам вектора происходит через оператор `[]`. Помимо отдельных элементов можно адресоваться к непрерывной части элементов.

*Синтаксис*

{% code overflow="wrap" lineNumbers="true" %}

```verilog
[<start_bit> +: <width>] // выборка значений в сторону увеличения индекса
[<start_bit> -: <width>] // выборка значений в сторону уменьшения индекса
```

{% endcode %}

*Пример 1 с иллюстрацией*

<table><thead><tr><th width="256.4000244140625">Код</th><th>Хранение</th></tr></thead><tbody><tr><td><code>reg [7:0] a;</code></td><td><code>a == 8'bxxxxxxxx</code></td></tr><tr><td><code>a[0] = 1;</code></td><td><code>a == 8'bxxxxxx1x</code></td></tr><tr><td><code>a[3] = 0;</code></td><td><code>a == 8'bxxxx0x1x</code></td></tr><tr><td><code>a[8] = 1;</code></td><td><code>// illegal : bit 8 does not exist in addr</code></td></tr><tr><td><code>a[7:4] = 4'hC;</code></td><td><code>a == 8'b11000x1x</code></td></tr></tbody></table>

*Пример 2*

{% code overflow="wrap" lineNumbers="true" %}

```verilog
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
```

{% endcode %}

*Результат исполнения*

{% code overflow="wrap" lineNumbers="true" %}

```log
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
```

{% endcode %}
