SystemVerilog foreach 语法,用于循环遍历多维数组的低维
Posted
技术标签:
【中文标题】SystemVerilog foreach 语法,用于循环遍历多维数组的低维【英文标题】:SystemVerilog foreach syntax for looping through lower dimension of multidimensional array 【发布时间】:2014-06-01 22:02:35 【问题描述】:循环遍历多维数组的低维的标准方法是什么?较高的维度是固定的。
在以下示例中:
automatic int i = 2;
foreach (my_req[i][j]) begin // <-- WARNING
$display("i:%0d,j:%0d", i, j);
end
我看到了警告:
** Warning: testbench.sv(16): (vlog-LRM-2897) Using non-standard foreach loop variable list syntax.
EDA Playground 上的完整代码示例:http://www.edaplayground.com/x/nh
【问题讨论】:
【参考方案1】:你可以这样做:
$display("Loop through i=2");
begin
automatic int i = 2;
foreach (my_req[,j]) begin // notice the "," before j
$display("i:%0d,j:%0d", i, j);
end
end
EDA Playground 上的工作代码:http://www.edaplayground.com/x/2Qn
【讨论】:
@dave_59 @Tudor VCS 接受foreach (array[0][j])
但不接受 automatic int h = 0; foreach (array[,j])
提供错误消息为 Error-[NYI] Not Yet Implemented bus.sv, 318 功能尚不支持:Foreach 省略可变尺寸维度之前的循环变量
另外 Questa 也不支持动态数组:在遍历动态数组时不能省略循环变量【参考方案2】:
警告是为了让您知道您正在编写的代码可能与其他模拟器不兼容。
我确实知道有一次,另一个模拟器接受了foreach (array[i][j])
,其中i
以前没有定义为与foreach(array[i,j])
相同的意思,并且该语法与您尝试执行的操作不兼容。
正确的语法是foreach (my_req[,j])
【讨论】:
foreach (array[,j])
格式是 LRM 的一部分吗?如果有,在哪里?我可以找到提到的任何内容。很棒的功能,只是希望它是标准的一部分。
@Greg:在 18.5.8.1,语法 18-7(Foreach 迭代约束语法)中,loop_variables
可以以逗号开头,不一定是标识符:foreach ( ps_or_hierarchical_array_identifier [ loop_variables ] ) constraint_set loop_variables ::= [ index_variable_identifier ] , [ index_variable_identifier ]
啊,我错过了,因为它是用 BNF(Backus-Naur 形式)编写的。以上是关于SystemVerilog foreach 语法,用于循环遍历多维数组的低维的主要内容,如果未能解决你的问题,请参考以下文章
《SystemVerilog验证-测试平台编写指南》学习 - 第2章 数据类型
systemverilog中module与program的区别