Я вижу код в SystemVerilog, который имеет что-то вроде этого:
if(address[2*pointer+:2])
do_something;
Как я должен понимать +:
при индексировании этого вектора?
Я обнаружил, что он называется срезом бит, но я не могу найти объяснения.
Я вижу код в SystemVerilog, который имеет что-то вроде этого:
if(address[2*pointer+:2])
do_something;
Как я должен понимать +:
при индексировании этого вектора?
Я обнаружил, что он называется срезом бит, но я не могу найти объяснения.
Описание и примеры можно найти в 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]})
Это еще один способ указать диапазон битового вектора.
x +: N, начальная позиция вектора задается по x и вы подсчитываете от x на N.
Существует также
x -: N, в этом случае стартовая позиция равна x и вы отсчитываете от x по N.
N - константа, а x - выражение, которое может содержать итераторы.
У него есть несколько преимуществ -
Это делает код более удобочитаемым.
Вы можете указать итератор при ссылках на битовые фрагменты, не получив ошибку "не может иметь непостоянное значение".