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) beginif (condition2) begin// ... end
end// 正确示例:提前返回
if (!condition1) return;
if (!condition2) return;
// 主逻辑
对于该示例的测试代码如下:
module test_sv_return();intial begintest_run_time(0,0);test_run_time(0,1);test_run_time(1,0); endfunction 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