упакованные и распакованные векторы в системе Verilog - PullRequest
27 голосов
/ 25 января 2009

Глядя на некоторый код, который я поддерживаю в System Verilog, я вижу некоторые сигналы, которые определены следующим образом:

node [range_hi:range_lo]x;

и другие, которые определены следующим образом:

node y[range_hi:range_lo];

Я понимаю, что x определяется как упакованный, а y определяется как неупакованный. Однако я понятия не имею, что это значит.

В чем разница между упакованными и неупакованными векторами в System Verilog?

Редактировать: Отвечая на ответ @ Empi, почему разработчик оборудования, пишущий на SV, должен заботиться о внутреннем представлении массива? Бывают ли случаи, когда я не должен или не использовать упакованные сигналы?

Ответы [ 5 ]

14 голосов
/ 25 января 2009

Эта статья дает более подробную информацию об этой проблеме: http://electrosofts.com/systemverilog/arrays.html, особенно раздел 5.2.

Упакованный массив - это механизм для разделения вектора на подполя, к которому можно удобно обращаться как к элементам массива. Следовательно, упакованный массив гарантированно будет представлен как непрерывный набор битов. Распакованный массив может или не может быть представлен таким образом. Упакованный массив отличается от неупакованного массива тем, что, когда упакованный массив отображается как первичный, он обрабатывается как один вектор.

5 голосов
/ 12 апреля 2012

Прежде чем узнать, что такое упакованные и распакованные массивы, давайте также посмотрим, как узнать, что это за массив, просто по их объявлению. Упакованные массивы имеют имя объекта перед объявлением размера. Например:

bit [3][7] a;

Распакованный массив имеет имя объекта после объявления размера. Например:

bit a[3];

Упакованный массив создает память, а распакованный - нет. Вы можете получить доступ / объявить распакованный массив так же, как это

reg unpacked_array [7:0] = '{0,0,0,0,0,0,0,1};

Вы можете смешивать как упакованные, так и распакованные массивы, чтобы создать многомерную память. Например:

bit [3:0][7:0]a[2:0].

Создает массив из 4 (т. Е. 4 * 8) байтов с глубиной 3.

2 голосов
/ 07 сентября 2016

Упакованные массивы в основном используются для эффективного использования памяти, когда мы записываем [3: 0] [7: 0] A [4: 0], что означает, что в 32-битных ячейках памяти 4 среза, каждый из 8 бит, упакован для формирования 32 бит. Значение справа означает, что есть 5 таких срезов.

0 голосов
/ 24 сентября 2018

bit[3:0] a -> упакованный массив Упакованный массив может использоваться как полный массив (a='d1) или просто как часть массива (a[0]='b1)

bit a [3:0] -> распакованный массив Распакованный массив нельзя использовать как a[0]='b1, его нужно использовать как полный a={8{'b1}}

0 голосов
/ 05 декабря 2017

Распакованные массивы дадут вам больше ошибок при компиляции, чем упакованные массивы.

По этой причине я вижу распакованные массивы в определениях портов модулей. Компилятор выдаст ошибку, если размеры сигнала не совпадают с портом с распакованными массивами. С упакованными массивами он обычно просто идет вперед и связывает вещи как можно лучше, не выдавая ошибки.

...