2013-08-05 78 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. 您可以在引用位切片时指定迭代器而不会收到“不能有非常数值”的错误。