verilog总是清空灵敏度列表

时间:2014-07-22 01:05:12

标签: verilog

always clk <= #5 !clk;

似乎这不起作用并得到一个“内存不足”#34; VCS错误

这背后的原因是什么?我觉得VCS无法摆脱它为clk安排的事件。但不知道为什么?

2 个答案:

答案 0 :(得分:1)

您收到“内存不足”错误,因为它是一个非阻塞的无限循环,将未来事件添加到调度程序。

always在功能上等同于initial while(1)(无限循环)。 <= #5不消耗时间,它会在将来安排更新。没有时间阻止循环中的延迟。

如果没有时间阻塞延迟,模拟器将在同一时间步中继续执行相同的循环。模拟将不会移动到下一个时间步,直到当前时间步中的所有操作完成或暂停。最终模拟器将耗尽内存并出错。如果检测到无限循环,某些模拟器可能会提前退出。

通常,使用LHS延迟和阻塞语句生成时钟。例子:

reg clk = 1'b1; // or 1'b0
always #5 clk = !clk;

reg clk;
initial begin
  clk = 1'b1; // or 1'b0
  forever #5 clk = !clk;
end

答案 1 :(得分:0)

我得到&#34;内存不足&#34; VCS和Incisive都有错误。

在LHS上延迟更为常规:

reg clk = 0;
always #5 clk <= !clk;