verilog中的非阻塞语句执行

时间:2016-11-13 20:44:36

标签: verilog hdl register-transfer-level

我是verilog的新手,有人可以解释一下这些陈述是如何执行的。

always@(posedge clock) begin
A <= B ^ C;
D <= E & F;
G <= H | J;
K <= G ? ~&{A,D} : ^{A,D}
end

据我所知,右侧首先被执行。因此,首先计算A,D,G,K的值。在计算K的值时,根据G的值,将执行第一个或第二个表达式。任何人都可以解释这个操作。还请说明最后一个语句是如何合成的,因为整个代码都在一个始终块内并且具有正边沿时钟。提前谢谢。

1 个答案:

答案 0 :(得分:1)

  

非阻止作业评估 RHS 表达式   开始时间步安排 LHS更新,以便在时间步结束时进行。< / p>

在Verilog中,有一个定义良好的事件队列,如下所示。对于每个时间戳和,每个时间戳都会评估所有区域。如果在当前时间戳中有任何事件要执行,那么它们将被触发。一旦当前时间戳的所有事件都被触发,那么只有模拟时间向前移动。

Event regions

这里,所有表达式的 RHS在时钟的时间戳的时间戳的开头进行评估。因此,B^CE&FH|JG ? ~&{A,D} : ^{A,D}的值将在内部评估并存储在模拟器中。

此后,随着模拟进展到相同时间戳的NBA区域, LHS会更新。

G , A and D are not updated in active region. Hence, while calculating the value of K , the previous values of G , A and D are taken in the Active region. Then, all the veriables; G {的值{1}} , D , K`同时更新。

我在EDAPlayground上创建了一个示例代码。波形可能会有所帮助。

就上一个声明而言,我猜它会创建一个带有mux(使用Select = and,输入为Gnand(A,D))作为输入的翻牌。