我是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的值,将执行第一个或第二个表达式。任何人都可以解释这个操作。还请说明最后一个语句是如何合成的,因为整个代码都在一个始终块内并且具有正边沿时钟。提前谢谢。
答案 0 :(得分:1)
非阻止作业评估 RHS 表达式 开始时间步并安排 LHS更新,以便在时间步结束时进行。< / p>
在Verilog中,有一个定义良好的事件队列,如下所示。对于每个时间戳和,每个时间戳都会评估所有区域。如果在当前时间戳中有任何事件要执行,那么它们将被触发。一旦当前时间戳的所有事件都被触发,那么只有模拟时间向前移动。
这里,所有表达式的 RHS在时钟的时间戳的时间戳的开头进行评估。因此,B^C
,E&F
,H|J
,G ? ~&{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
,输入为G
,nand(A,D)
)作为输入的翻牌。