我在我的模块中添加了一个时钟发生器,现在模拟永远不会完成。
always #10 clk = ~clk;
为什么在完成所有initial
代码后SIM卡无法完成?
module test;
reg clk;
initial begin
clk = 0;
$display("Hello");
end
always #10 clk = ~clk;
endmodule
在EDA Playground上的Sim结果:http://www.edaplayground.com/s/4/15
答案 0 :(得分:2)
当您使用always
阻止时,您需要在$finish
个某个区块中使用initial
语句来完成SIM卡。
固定代码:
module test;
reg clk;
initial begin
clk = 0;
$display("Hello");
$finish(); // <-- FIX
end
always #10 clk = ~clk;
endmodule
Sim结果在此处:http://www.edaplayground.com/s/4/16
也就是说,如果您的环境中还有一个SystemVerilog program
,那么在initial
块中的所有program
代码完成后,SIM卡将自动完成。来自IEEE 1800-2012标准的第24.3节:
当程序中的所有初始程序都达到目的时, 该程序应立即终止所有后代线程 该计划的初始程序。如果至少有一个 至少一个程序块内的初始程序,整个程序 模拟应通过对
$finish
的隐式调用终止 系统任务在所有线程及其所有后代之后立即执行 线程源自所有程序中的所有初始过程 结束了。
答案 1 :(得分:1)
initial
和always
之间没有根本区别:always
只是initial forever
。只要计划将来执行任何事情,模拟将继续(除非明确停止);你的陈述不断重新安排时钟分配,因此sim永远不会停止。关于initial
确实存在 nothing 特别之处:它甚至不能保证在任何always
块之前运行。
这不是一个SV问题(我对此一无所知),但我有兴趣看到VL关于在初始代码完成时自动完成sim的评论。这会破坏Verilog的兼容性,我有兴趣看到一个确认这个的LRM参考。