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

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

node [range_hi:range_lo]x;

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

node y[range_hi:range_lo];

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

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

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

5 ответов


эта статья дает более подробную информацию об этой проблеме: 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-битных местах памяти 4slices каждый из 8 бит упакован, чтобы сформировать 32 бит. Значение правой стороны означает, что есть 5 таких срезов.


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

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


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

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