我正在看一段SystemVerilog代码,其中有类似于这样的内容:
if(address[2*pointer+:2])
do_something;
当我索引这个向量时,如何理解+:
?
我发现这被称为比特切片,但我找不到关于它的解释。
我正在看一段SystemVerilog代码,其中有类似于这样的内容:
if(address[2*pointer+:2])
do_something;
当我索引这个向量时,如何理解+:
?
我发现这被称为比特切片,但我找不到关于它的解释。
参见IEEE Std 1800-2017第11.5.1节“向量位选择和部分选择寻址”中的描述和示例。首次出现于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,则 dword[8*(7) +: 8] == dword[63:56]
。+
和-
表示选择比起始索引更高或更低索引值的位。address
以小端([msb:lsb])格式给出,则 if(address[2*pointer+:2])
等同于 if({address[2*pointer+1],address[2*pointer]})
。这是另一种指定比特向量范围的方法。
x +: N,向上从 x 开始计数 N 的数量作为向量的起始位置。
还有
x -: N,此时起始位置是 x,您通过从 x 开始向下计数 N 个数来指定 vector。
N 是一个常数,x 是可以包含迭代器的表达式。
它有几个好处 -
它使代码更易读。
您可以在引用位切片时指定迭代器,而不会出现“不能有非常量值”的错误。
a_vect[15 : -16]
一样解决/出错。试一下,看看结果如何。 - Grega_vect[ 0 +: 8]
和b_vect[ 0 +: 8]
都会根据a_vect和b_vect的定义方式解析为a_vect[7:0]
和b_vect[7:0]
。如果你问我,这真是令人困惑。 - Prashant