我看到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