2013-08-05 4 views
16

는이 같은 뭔가가 SystemVerilog에있는 코드를보고 오전 :인덱싱 벡터와 배열 :

if(address[2*pointer+:2]) 
    do_something; 
나는 +:이 벡터를 색인 할 때 알아야 어떻게

?

비트 조각이라고 부르는 것을 발견했지만 그에 대한 설명을 찾을 수 없습니다.

+2

이것은 우리가 a_vect 사용하는 경우 http://stackoverflow.com/questions/17778418 – dwikle

답변

39

설명 및 예는 IEEE Std 1800-2012 § 11.5.1 "벡터 비트 선택 및 부분 선택 주소 지정"에서 찾을 수 있습니다. 첫 번째 IEEE 모양은 IEEE 1364-2001 (Verilog) §입니다. 4.2.1 "벡터 비트 선택 및 부분 선택 주소 지정". sel 7이다 dword[8*(0) +: 8] == dword[7:0]
경우 0

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 경우

항상 좌측 시작 인덱스 값이 다음은 LRM에서 직접 예이다. 오른쪽의 숫자는 너비이며 양수 상수 여야합니다. +-은 더 높은 또는 더 낮은 인덱스 값의 비트 다음에 시작 인덱스를 선택합니다. address 가정

는 리틀 엔디안이다 ([MSB : LSB]) 포맷은 다음 if(address[2*pointer+:2])if({address[2*pointer+1],address[2*pointer]})

+0

의 근처 중복 그래서 어떤 일이 일어날 것입니다 [15 - 32]를? – umayneverknow

+0

@umayneverknow LRM이 테이크 시나리오에서 어떤 일이 일어 났는지 언급했는지 기억이 안납니다. 'a_vect [15 : -16]'과 같은 오류를 해결해야합니다. 그것을 시도하고 알아보십시오. – Greg

15

이 동등한 것은 비트 벡터의 범위를 지정하는 다른 방법이다. N,이 경우 : - :

은 + X N, 벡터의 시작 위치는 x로 제공하고 N으로 X에서 최대 를 계산되어

또한

X가 시작 위치가 x이고 이 x에서 N까지으로 계산됩니다.

N은 반복자를 포함 할 수있는 표현식입니다.

  1. 그것은 코드를 더 쉽게 읽을 -

    그것은 혜택의 몇 가지가 있습니다.

  2. "상수 값을 가질 수 없음"오류없이 비트 슬라이스를 참조 할 때 반복기를 지정할 수 있습니다.