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

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

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

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

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

Ответ 1

Описание и примеры можно найти в IEEE Std 1800-2012 & sect; 11.5.1 "Выделение векторного бита и выбор адреса". Первое появление IEEE - IEEE 1364-2001 (Verilog) & sect; 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]})

Ответ 2

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

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

Существует также

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

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

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

  • Это делает код более удобочитаемым.

  • Вы можете указать итератор при ссылках на битовые фрагменты, не получив ошибку "не может иметь непостоянное значение".