2013-08-05 68 views
16

我看到SystemVerilog中一個代碼有這樣的事情:索引矢量和陣列,+:

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

我應該如何理解+:索引這個載體是什麼時候?

我發現它被稱爲位切片,但我找不到解釋。

+2

這是一個近乎重複的http://stackoverflow.com/questions/17778418 – dwikle

回答

39

描述和示例可在IEEE Std 1800-2012 §中找到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,則

值向左總是的起始索引。右邊的數字是寬度,必須是正數。 +-指示選擇較高或較低索引值的位,然後選擇起始索引。

假設address是在小端([MSB:LSB])格式,然後if(address[2*pointer+:2])if({address[2*pointer+1],address[2*pointer]})

+0

那麼如果我們使用a_vect [15 - :32]會發生什麼? – umayneverknow

+0

@mayneverknow我不記得LRM是否提到了在場景中發生的事情。應該解決/錯誤與'a_vect [15:-16]'相同。嘗試一下,找出答案 – Greg

15

這相當於是另一種方式,以指定的位向量的範圍內。

X + N,向量的起始位置設爲x時,你通過N.從X計數

還有

X - :N,在這種情況下,開始位置是x,並且您計數下降由x除以N.

N是常數,x是可以包含迭代器的表達式。

它有幾個好處 -

  1. 它使代碼更易讀。

  2. 您可以在引用位切片時指定迭代器而不會收到「不能有非常數值」的錯誤。