我偶然发现了这样写的代码:
事件a是循环@b;
从此事件中删除“循环”对行为没有任何影响。
这里的循环是什么意思?
谢谢
来自 e LRM:
"表示一个事件的一个周期。没有指定显式采样事件,这表示默认采样事件的一个周期。指定一个采样事件,循环等效于“@sampling-event @any”。您可以使用循环表达式覆盖从上下文中获取的默认采样事件。”
它的用途如下:
some_tcm() @clk is {
message(LOW, "This is synced at clock");
wait @rise_async;
message(LOW, "This is synced at the first clk after rise_async");
wait cycle @rise_async;
message(LOW, "This is synced exactly at rise_async");
stop_run();
};
some_tcm()
指定@clk
为采样事件。假设您有另一个异步事件@rise_async
,它将在时钟边沿之间触发。如果你做一个简单wait @rise_async
的 TCM 将等到@clk
after的第一个触发@rise_async
(实际上是 a @rise_async @clk
)。如果您执行 a wait cycle @rise_async
,那么您已经覆盖了采样事件,并且 TCM 将完全等待直到@rise_async
发生。
“事件 a 是循环 @b;” 是响应事件触发的技巧,但在当前刻度结束时这样做。例如,如果我们执行“on b”,下面的代码将打印“hello world”,而不是“world hello”。
event b;
event a is cycle @b;
foo() is {
emit b;
message(NONE, "hello");
};
on a {
message(NONE, "world");
};