systemverilog 解包数组串联

dsu*_*ula 5 system-verilog

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

logic [3:0] AAA[0:9];
Run Code Online (Sandbox Code Playgroud)

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

AAA = '{1, 1, 1, 1, 2, 2, 2, 3, 3, 4};
Run Code Online (Sandbox Code Playgroud)

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

AAA = { '{4{1}}, '{3{2}}, '{2{3}}, 4 };
Run Code Online (Sandbox Code Playgroud)

Sil*_*602 6

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

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

int A3[1:3];
A3 = {1, 2, 3}; // unpacked array concatenation
A3 = '{1, 2, 3}; // array assignment pattern
Run Code Online (Sandbox Code Playgroud)

LRM 在同一部分中表示

...解压缩的数组串联禁止复制、默认和显式键入,但它们提供了从元素和数组的任意组合组成数组值的额外灵活性。

int A9[1:9]; 
A9 = {9{1}}; // illegal, no replication in unpacked array concatenation
Run Code Online (Sandbox Code Playgroud)

我们还可以看看另一种选择:数组赋值。在同一部分中,LRM 提到

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

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

AAA = '{'{1,1,1,1}, '{2,2,2}, '{3,3}, 4};
Run Code Online (Sandbox Code Playgroud)

这意味着 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}}
Run Code Online (Sandbox Code Playgroud)