为了账号安全,请及时绑定邮箱和手机立即绑定

用+索引向量和数组:

用+索引向量和数组:

Qyouu 2019-08-03 07:03:42
用+索引向量和数组:我在SystemVerilog中看到了这样的代码:if(address[2*pointer+:2])   do_something;我该如何理解+:当索引这个向量的时候?我发现它被称为比特切片,但我找不到任何解释。
查看完整描述

3 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

描述和示例可在IEEE STD 1800-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

如果sel是0dword[8*(0) +: 8] == dword[7:0]
如果sel是7dword[8*(7) +: 8] == dword[63:56]

左边的值总是起始索引。右边的数字是宽度,必须是正数。这个+-指示要选择较高或较低索引值的位数,然后选择起始索引。

假设address是以小Endian([msb:lsb])格式,然后if(address[2*pointer+:2])等于if({address[2*pointer+1],address[2*pointer]})




查看完整回答
反对 回复 2019-08-05
?
白板的微信

TA贡献1883条经验 获得超3个赞

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

x+:n,向量的起始位置由x给出,然后计数。向上从x乘N.

也有

x-:n,在这种情况下,起始位置是x,然后计数。向下从x乘N.

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

它有几个好处-

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

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



查看完整回答
反对 回复 2019-08-05
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

我忍不住说a_vect[ 0 +: 8]b_vect[ 0 +: 8]双方决心a_vect[7:0]b_vect[7:0]取决于定义a_Vect和b_Vect的方式。那就是令人困惑如果你问我

查看完整回答
反对 回复 2019-08-05
  • 3 回答
  • 0 关注
  • 258 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信