【问题标题】:systemverilog unpacked array concatenationsystemverilog 解压数组连接
【发布时间】:2020-03-24 19:31:26
【问题描述】:

我正在尝试创建一个像这样的解包数组:

logic [3:0] AAA[0:9];

我想将此数组初始化为以下值:

AAA = '{1, 1, 1, 1, 2, 2, 2, 3, 3, 4};

为了提高效率,我想使用重复结构,但那是事情分崩离析的时候。 这是不可能的,还是我写得不对?任何帮助表示赞赏。

AAA = { '{4{1}}, '{3{2}}, '{2{3}}, 4 };

【问题讨论】:

    标签: system-verilog


    【解决方案1】:

    首先,您使用的构造实际上称为复制运算符。这可能会在您以后的搜索中帮助您,例如在 the SystemVerilog LRM 中。

    其次,您在最后一个代码块中使用了数组连接,而不是数组赋值(注意缺少的撇号')。 LRM 在第 10.10.1 节(未打包的数组连接与数组分配模式的比较)中给出了以下(简单)示例来解释差异:

    int A3[1:3];
    A3 = {1, 2, 3}; // unpacked array concatenation
    A3 = '{1, 2, 3}; // array assignment pattern
    

    LRM 在同一节中说

    ...未打包的数组连接禁止复制、默认和 显式类型,但它们提供了额外的灵活性 由任意混合的元素和数组组成一个数组值。

    int A9[1:9]; 
    A9 = {9{1}}; // illegal, no replication in unpacked array concatenation
    

    让我们也看看替代方案:数组赋值。在同一部分,LRM 提到

    ...分配模式中的项目可以使用语法复制,例如'{ n{element} },并且可以默认使用default: 语法。但是,数组赋值模式中的每个元素项都必须与目标数组的元素类型相同。

    如果将其转换为数组赋值(通过添加撇号),您的代码实际上会转换为:

    AAA = '{'{1,1,1,1}, '{2,2,2}, '{3,3}, 4};
    

    这意味着 SystemVerilog 解释器只会看到 4 个元素,并且会抱怨分配中的元素太少。

    在第 10.9.1 节(数组分配模式)中,LRM 对此进行了如下说明:

    连接大括号用于构造和解构简单的位向量。类似的语法用于支持数组的构造和解构。 表达式应逐个元素匹配,大括号应与数组尺寸匹配。每个表达式项应在分配给数组中相应元素类型的上下文中进行评估。

    [...]

    类似于复制的语法(参见 11.4.12.1)也可以用于数组分配模式。 每个复制应代表一个完整的单一维度。

    为了帮助解释上面引用中的粗体文本,LRM 给出了以下示例:

    int n[1:2][1:3] = '{2{'{3{y}}}}; // same as '{'{y,y,y},'{y,y,y}}
    

    【讨论】:

    • 好的。非常感谢您的详细回答。这是非常有见地的。所以在纯文本中不可能做我想做的事,对吗?这意味着我被搞砸了。 :-)
    • 如果您的代码不需要可合成,您可以尝试 dave_59 的解决方案。
    【解决方案2】:

    我有另一个解决方案,但我不确定它是否可以合成。流媒体运营商会在这里工作吗?我实际上是在获取一个打包的数组文字并将其流式传输到数据结构 AAA 中。我已经把它放在EDA Playground

    module tb;
    
      logic [3:0] AAA[0:9];
    
      initial begin
        AAA = { >> int {
          {4{4'(1)}},
          {3{4'(2)}},
          {2{4'(3)}},
          4'(4)
        } };
        $display("%p",AAA);
      end
    
    endmodule
    

    输出:

    Compiler version P-2019.06-1; Runtime version P-2019.06-1;  Mar 25 11:20 2020
    '{'h1, 'h1, 'h1, 'h1, 'h2, 'h2, 'h2, 'h3, 'h3, 'h4} 
               V C S   S i m u l a t i o n   R e p o r t 
    Time: 0 ns
    CPU Time:      0.580 seconds;       Data structure size:   0.0Mb
    Wed Mar 25 11:20:07 2020
    Done
    

    【讨论】:

      【解决方案3】:

      您不能对解压的数组元素进行任意复制。

      如果你的代码不需要合成,你可以做

      module top;
        typedef logic [3:0] DAt[];
      
        logic [3:0] AAA[0:9];
      
        initial begin
          AAA = {DAt'{4{1}}, DAt'{3{2}}, DAt'{2{3}}, 4};
          $display("%p",AAA);
        end
      endmodule
      

      【讨论】:

      • 好的。谢谢你的建议。不幸的是,代码必须是可综合的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多