System verilog 使用+索引向量和数组:

System verilog 使用+索引向量和数组:,system-verilog,System Verilog,我在SystemVerilog中看到一段代码,其内容如下: if(address[2*pointer+:2]) do_something; 在索引此向量时,我应该如何理解+:呢 我发现它被称为位切片,但我找不到关于它的解释。描述和示例可在§11.5.1向量位选择和部分选择寻址中找到。第一次出现的IEEE是IEEE 1364-2001 Verilog§4.2.1矢量位选择和部分选择寻址。以下是LRM的一个直接示例: 如果sel为0,则dword[8*0+:8]==dword[7:0] 如果s

我在SystemVerilog中看到一段代码,其内容如下:

if(address[2*pointer+:2])
  do_something;
在索引此向量时,我应该如何理解+:呢


我发现它被称为位切片,但我找不到关于它的解释。

描述和示例可在§11.5.1向量位选择和部分选择寻址中找到。第一次出现的IEEE是IEEE 1364-2001 Verilog§4.2.1矢量位选择和部分选择寻址。以下是LRM的一个直接示例:

如果sel为0,则dword[8*0+:8]==dword[7:0] 如果sel为7,则dword[8*7+:8]==dword[63:56]

左边的值始终是起始索引。右边的数字是宽度,必须是正常量。+和-表示选择高于或低于起始索引的索引值的位


假设地址为小端[msb:lsb]格式,则ifaddress[2*指针+:2]等效于if{address[2*指针+1],address[2*指针]}

这是指定位向量范围的另一种方法

x+:N,向量的起始位置由x给出,从x开始向上算N

还有

x-:N,在这种情况下,起始位置是x,从x开始倒数N

N是常数,x是可以包含迭代器的表达式

它有几个好处-

它使代码更具可读性

您可以在引用位片时指定迭代器,而不获取不可能有非常量值错误的值


那么,如果我们使用向量[15-:32],会发生什么呢?@umayneverknow我不记得LRM是否提到了take场景中会发生什么。应与向量[15:-16]一样解决/纠正错误。试试看,发现我无法阻止自己评论说a_vect[0+:8]和b_vect[0+:8]都解析为a_vect[7:0]和b_vect[7:0],这取决于a_vect和b_vect的定义方式。现在,如果你问我,这是令人困惑的。但是,如果我们想把x和N都作为变量呢。我们将如何实施它?
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