事件触发器可以在 verilog 中合成吗?

Is event trigger synthesizable in verilog?

我正在尝试在我的代码中使用事件触发 (->)。这个会合成吗?

always @(posedge clk) begin
count <= count + 1;
-> x;
end

always @(x) flag = 1;

这只是一个示例代码。我想做的是,每当计数中发生事件时,我都想让旗帜高,否则它应该保持低位。在我的例子中,计数值每 7 个时钟周期增加一次。我可以为此使用事件触发吗?如果不是,我该怎么做才能满足我的要求?

有些软件也许可以合成它,但它不是一个好的代码。如果你这样做,你的代码就不是同步的。 为了同步,所有 «always» 语句必须在 clk 的同一边缘切换。

您不应该在可综合代码中这样做。虽然某些工具可能能够创建等效的逻辑,但几乎总是应该使用替代方案。比如你的代码可以改写为:

always @(posedge clk) begin
  count <= count + 1;
  -> x;
end

always @(count) flag = 1;

如果工具选择支持,您可以在模拟中执行的任何事情都可以被合成。但是大多数RTL综合工具不支持这个。

在简单的情况下,您可以用任务调用(或 SystemVerilog 中的 void 函数调用)替换事件触发器。

 always @(posedge clk) begin
  count <= count + 1;
  x;
end
task x;
flag <= 1;
endtask