vcs仿真 提供 死循环debug 的参数 +vcs+loopreport+10000 +debug_access_all

环境中出现死循环会报如下错误:

Error-[VCS LOOP DETECTED] Infinite loop in simulation
Detected an infinite loop in the simulation at time 2199114829 ps.
Details written to"loop-info-91947.log,loop-info-verbose-91947.log"

在 单独的sv module 中测试,代码如下:

module test_loop();
   integer A;
   while(1) A++;
endmodule

仿真该module 卡住,添加上述编译选项并未报错。chatgpt解析:
这是一个静态代码,可能会被vcs优化或者卡死,所以不会触发loopreport。
所以在编写循环时,建议开始结束前后添加打印,并且确认有合理的退出机制。

=================================================
关于退出机制的编程规范,建议避免深层嵌套,提高代码可读性和可维护性:

// 错误示例:嵌套过深
if (condition1) begin
  if (condition2) begin
    // ... 
  end
end

// 正确示例:提前返回
if (!condition1) return;
if (!condition2) return;
// 主逻辑

对于该示例的测试代码如下:

module test_sv_return();
  intial begin
      test_run_time(0,0);
      test_run_time(0,1);
      test_run_time(1,0);      
  end
  function test_run_time(input a, b);
      $display(time, "function start");
      if(~(a|b) return;
      if(a)  $display(time, "cond 1");
      if(b)  $display(time, "cond 2");         
      $display(time, "function end");           
  endfunction
endmodule

//打印结果如下:
//0function start
//0function start
//cond 1
//0function done
//0function start
//cond 2
//0function done

以前以为return 语句只能用在函数的最后一行,但是实际上是逻辑的最后一行。满足return语句之后,后面的代码都不会执行。突然理解了为什么有些代码没看到 wuwuwuwu