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语法

SystemVerilog基本语法总结(下)

《SystemVerilog验证-测试平台编写指南》学习 - 第2章 数据类型

systemverilog中module与program的区别

求systemverilog vimrc 高亮方法(要代码)

如果未设置某个宏,则阻止systemverilog编译