使用+:对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式。

它有几个好处 –

  1. 它使代码更具可读性。

  2. 您可以在引用位切片时指定迭代器,但不会得到“不能有非常数值”的错误。