使用+编制索引向量和数组:

DOS*_*DOS 24 system-verilog

我在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的直接示例:

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
Run Code Online (Sandbox Code Playgroud)

如果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]})

  • 我无法阻止自己评论 `a_vect[ 0 +: 8]` 和 `b_vect[ 0 +: 8]` 根据方式都解析为 `a_vect[7:0]` 和 `b_vect[7:0]`其中定义了a_vect和b_vect。如果你问我的话,这真是**令人困惑** (2认同)

shp*_*ekh 19

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

X +:N,载体的开始位置设为x时,你计数由N从X

还有

X - :N,在这种情况下,起始位置是x,你算从X由N.

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

它有几个好处 -

  1. 它使代码更具可读性.

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