Индексирование векторов и массивов с помощью +:

Я вижу код в SystemVerilog, который имеет что-то вроде этого:

if(address[2*pointer+:2])
  do_something;

Как я должен понимать +: при индексации этого вектора?

Я обнаружил, что это называется битовой нарезкой, но я не могу найти этому объяснение.


person DOS    schedule 05.08.2013    source источник


Ответы (2)


Описание и примеры можно найти в IEEE Std 1800-2017 11.5.1. «Векторная адресация с выбором бита и выбором части». Первое появление IEEE - это IEEE 1364-2001 (Verilog) 4.2.1 «Адресация с выбором вектора и выбором части». Вот прямой пример из LRM:

logic [31: 0] a_vect;
logic [0 :31] b_vect;
logic [63: 0] dword;
integer sel;
a_vect[ 0 +: 8] // == a_vect[ 7 : 0]
a_vect[15 -: 8] // == a_vect[15 : 8]
b_vect[ 0 +: 8] // == b_vect[0 : 7]
b_vect[15 -: 8] // == b_vect[8 :15]
dword[8*sel +: 8] // variable part-select with fixed width

Если sel равно 0, то dword[8*(0) +: 8] == dword[7:0]
Если sel равно 7, то dword[8*(7) +: 8] == dword[63:56]

Значение слева всегда является начальным индексом. Число справа является шириной и должно быть положительной константой. + и - указывают на выбор битов более высокого или более низкого значения индекса, чем начальный индекс.

Предполагая, что address находится в формате с прямым порядком байтов ([msb:lsb]), тогда if(address[2*pointer+:2]) эквивалентно if({address[2*pointer+1],address[2*pointer]})

person Greg    schedule 05.08.2013
comment
Итак, что произойдет, если мы используем a_vect[15 -: 32]? - person umayneverknow; 01.11.2017
comment
@umayneverknow Я не помню, упоминал ли LRM, что происходит в сценарии взятия. Должен разрешить/ошибиться так же, как a_vect[15 : -16]. Попробуйте и узнайте - person Greg; 02.11.2017
comment
Не мог удержаться от комментария, что a_vect[ 0 +: 8] и b_vect[ 0 +: 8] оба разрешаются в a_vect[7:0] и b_vect[7:0] в зависимости от способа определения a_vect и b_vect. Если вы спросите меня, это сбивает с толку - person Prashant; 11.03.2019

Это еще один способ указать диапазон битового вектора.

x +: N, начальная позиция вектора задается x, и вы считаете вверх от x на N.

Есть также

x -: N, в этом случае начальная позиция равна x, и вы считаете вниз от x на N.

N — константа, а x — выражение, которое может содержать итераторы.

У него есть пара преимуществ -

  1. Это делает код более читабельным.

  2. Вы можете указать итератор при обращении к битовым срезам без получения ошибки «не может иметь непостоянное значение».

person shparekh    schedule 05.08.2013
comment
Спасибо. Но что, если мы хотим сохранить и x, и N в качестве переменных. Как мы будем это реализовывать? - person vineeshvs; 26.05.2021
comment
@vineeshvs, можешь привести пример? - person shparekh; 07.07.2021
comment
Я думал о том, чтобы сохранить два цикла с x и N в качестве переменных (скажем, от 0 до 15 или что-то в этом роде). Но я думаю, что это не разрешено. - person vineeshvs; 08.07.2021