使用 +: 对向量和数组进行索引

35

我正在看一段SystemVerilog代码,其中有类似于这样的内容:

if(address[2*pointer+:2])
  do_something;

当我索引这个向量时,如何理解+:

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

2个回答

81

参见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]})

如果我们使用 a_vect[15 -: 32] 会发生什么? - umayneverknow
@umayneverknow 我不记得 LRM 是否提到了在 take 场景中会发生什么。应该与 a_vect[15 : -16] 一样解决/出错。试一下,看看结果如何。 - Greg
2
我忍不住要评论一下,a_vect[ 0 +: 8]b_vect[ 0 +: 8]都会根据a_vect和b_vect的定义方式解析为a_vect[7:0]b_vect[7:0]。如果你问我,这真是令人困惑 - Prashant

28

这是另一种指定比特向量范围的方法。

x +: N,向上从 x 开始计数 N 的数量作为向量的起始位置。

还有

x -: N,此时起始位置是 x,您通过从 x 开始向下计数 N 个数来指定 vector。

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

它有几个好处 -

  1. 它使代码更易读。

  2. 您可以在引用位切片时指定迭代器,而不会出现“不能有非常量值”的错误。


谢谢。但是,如果我们想要保留x和N作为变量,我们该如何实现呢? - vineeshvs
@vineeshvs,你能提供一个例子吗? - shparekh
我曾考虑使用x和N作为变量来保留两个循环(例如从0到15或其他值)。但我认为这是不允许的。 - vineeshvs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接