我看到SystemVerilog中一個代碼有這樣的事情:索引矢量和陣列,+:
if(address[2*pointer+:2])
do_something;
我應該如何理解+:
索引這個載體是什麼時候?
我發現它被稱爲位切片,但我找不到解釋。
我看到SystemVerilog中一個代碼有這樣的事情:索引矢量和陣列,+:
if(address[2*pointer+:2])
do_something;
我應該如何理解+:
索引這個載體是什麼時候?
我發現它被稱爲位切片,但我找不到解釋。
描述和示例可在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]})
那麼如果我們使用a_vect [15 - :32]會發生什麼? – umayneverknow
@mayneverknow我不記得LRM是否提到了在場景中發生的事情。應該解決/錯誤與'a_vect [15:-16]'相同。嘗試一下,找出答案 – Greg
這相當於是另一種方式,以指定的位向量的範圍內。
X + N,向量的起始位置設爲x時,你通過N.從X計數了
還有
X - :N,在這種情況下,開始位置是x,並且您計數下降由x除以N.
N是常數,x是可以包含迭代器的表達式。
它有幾個好處 -
它使代碼更易讀。
您可以在引用位切片時指定迭代器而不會收到「不能有非常數值」的錯誤。
這是一個近乎重複的http://stackoverflow.com/questions/17778418 – dwikle