我在 SystemVerilog 中看到了这样的代码:
if(address[2*pointer+:2])
do_something;
+:
索引这个向量时我应该如何理解?
我发现它被称为位切片,但我找不到关于它的解释。
我在 SystemVerilog 中看到了这样的代码:
if(address[2*pointer+:2])
do_something;
+:
索引这个向量时我应该如何理解?
我发现它被称为位切片,但我找不到关于它的解释。
描述和示例可以在IEEE Std 1800-2017 § 11.5.1 “向量位选择和部分选择寻址”中找到。第一个 IEEE 出现是 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]
左侧的值始终是起始索引。右边的数字是宽度,必须是一个正常数。+
and-
表示选择比起始索引更高或更低的索引值的位。
假设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 是一个可以包含迭代器的表达式。
它有几个好处——
它使代码更具可读性。
您可以在引用位片时指定迭代器,而不会出现“不能具有非常量值”错误。