使用+:对vector和数组进行索引
我在SystemVerilog中看到有这样的代码:
if(address[2*pointer+:2]) do_something;
我应该如何理解+:
索引这个向量?
我发现它被称为位切片,但我找不到解释。
说明和示例可以在IEEE Std 1800-2012§11.5.1 “向量位select和部分select寻址”中find。 IEEE的第一次出现是IEEE 1364-2001(Verilog)第4.2.1节“向量位select和部分select寻址”。 这里是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,那么dword[8*(7) +: 8] == dword[63:56]
左边的值总是起始索引。 右边的数字是宽度,必须是正数。 +
和-
表示select较高或较低索引值的位,然后select起始索引。
假设address
是小尾数([msb:lsb])格式,那么if(address[2*pointer+:2])
等于if({address[2*pointer+1],address[2*pointer]})
这是指定位向量范围的另一种方法。
x +:N,向量的起始位置由x给出,你从x 向上计数N.
也有
x – :N,在这种情况下,起始位置是x,并且您从x开始倒数N.
N是一个常数,x是一个可以包含迭代器的expression式。
它有几个好处 –
-
它使代码更具可读性。
-
您可以在引用位切片时指定迭代器,但不会得到“不能有非常数值”的错误。