我在SystemVerilog中看到一个代码如下:
if(address[2*pointer+:2])
do_something;
Run Code Online (Sandbox Code Playgroud)
我应该如何理解+:
索引此向量的时间?
我发现它被称为位切片,但我无法找到它的解释.
Gre*_*reg 53
描述和示例可以在IEEE Std1800-2012§11.5.1 "向量位选择和部分选择寻址"中找到.首次IEEE外观是IEEE 1364-2001(Verilog)§4.2.1"向量位选择和部分选择寻址".以下是LRM的直接示例:
Run Code Online (Sandbox Code Playgroud)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]
If 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]})
shp*_*ekh 19
这是指定位向量范围的另一种方法.
X +:N,载体的开始位置设为x时,你计数了由N从X
还有
X - :N,在这种情况下,起始位置是x,你算下从X由N.
N是常量,x是可以包含迭代器的表达式.
它有几个好处 -
它使代码更具可读性.
您可以在引用位片时指定迭代器,而不会出现"不能具有非常量值"错误.