如果有 2 个 always 块,哪个块将首先执行

If there are 2 always blocks which block will be executed first

我是 verilog 的新手,我有一个问题

假设我在一个模块中有 2 个 always 块,哪个块将首先执行,或者它们将同时执行。如果是这样,r1 的值是多少。例如

module example(clk);
input clk;
reg r1;
always @ (posedge clk)
  r1 <= 1'b0;
always @ (posedge clk)
  r1 <= 1'b1;
endmodule

TIA

两个always块将同时并行,所以禁止在两个always块中分配相同的reg。在模拟中它可能是未定义的,它不会综合。

两个always块创建了两个并行执行的进程。两个进程都将阻塞等待上升 clk 事件。当该事件发生时,两个进程都将安排恢复。然而,Verilog/SystemVerilog 模拟器使用事件队列序列化所有应该同时发生的事情。您无法预测哪个进程先被调度;这是一个模拟竞争条件。实际上,一个特定版本的模拟器总是会先选择一个进程,然后再选择另一个进程,因此您总是会看到相同的结果。但是,如果您切换到不同的工具,甚至更改工具中的某些选项以进行调试或优化,结果可能会发生变化。

这取决于工具。不应在两个不同的 always 块中为单个 reg 分配值。