【问题标题】:Indexing vectors and arrays with +: [duplicate]用 + 索引向量和数组:[重复]
【发布时间】:2013-08-05 20:56:34
【问题描述】:

我在 SystemVerilog 中看到了这样的代码:

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

索引这个向量时我应该如何理解+:

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

【问题讨论】:

    标签: system-verilog


    【解决方案1】:

    描述和示例可以在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]

    左边的值总是起始索引。右边的数字是宽度,必须是一个正常数。 +- 表示选择比起始索引更高或更低的索引值的位。

    假设address 是小端([msb:lsb])格式,那么if(address[2*pointer+:2]) 相当于if({address[2*pointer+1],address[2*pointer]})

    【讨论】:

    • 那么如果我们使用 a_vect[15 -: 32] 会发生什么?
    • @umayneverknow 我不记得 LRM 是否提到了拍摄场景中发生的事情。应该解决/错误与a_vect[15 : -16] 相同。试一试就知道了
    • 无法阻止自己评论 a_vect[ 0 +: 8]b_vect[ 0 +: 8] 都解析为 a_vect[7:0]b_vect[7:0],具体取决于定义 a_vect 和 b_vect 的方式。现在如果你问我,这令人困惑
    【解决方案2】:

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

    x +: N,向量的起始位置由 x 给出,你从 x 开始计数 up N.

    还有

    x -: N,在这种情况下,起始位置是 x,你从 x 向下计数 N。

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

    它有几个好处 -

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

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

    【讨论】:

    • 谢谢。但是,如果我们想将 x 和 N 都保留为变量怎么办。我们将如何实现它?
    • @vineeshvs 你能举个例子吗?
    • 我正在考虑保留两个循环,其中 x 和 N 作为变量(比如从 0 15 或其他东西)。但我认为这是不允许的。
    猜你喜欢
    • 2010-10-24
    • 2016-03-20
    • 2016-03-31
    • 2017-06-27
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    相关资源
    最近更新 更多