упакованные и распакованные векторы в системе Verilog

StackOverflow https://stackoverflow.com/questions/477646

  •  20-08-2019
  •  | 
  •  

Вопрос

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

node [range_hi:range_lo]x;

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

node y[range_hi:range_lo];

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

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

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

Это было полезно?

Решение

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

  

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

Другие советы

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

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.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top