我是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 的值执行第一个或第二个表达式。谁能解释一下这个操作。还请说明最后一条语句是如何合成的,因为整个代码都在一个始终块内并且具有正沿时钟。提前致谢。
我是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 的值执行第一个或第二个表达式。谁能解释一下这个操作。还请说明最后一条语句是如何合成的,因为整个代码都在一个始终块内并且具有正沿时钟。提前致谢。
非阻塞赋值在时间步开始时计算RHS表达式, 并将LHS 更新安排在时间步结束时进行。
在 Verilog 中,有一个定义良好的事件队列,如下所示。对于每个时间戳,所有区域都被评估。如果当前时间戳中有要执行的事件,则触发它们。一旦当前时间戳的所有事件都被触发,那么只有模拟时间向前移动。
在这里,所有表达式的RHS 在时钟 posedge的时间戳开始时进行评估。因此, 、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 ,
A ,
D and
K` 的值同时更新。
我在EDAPlayground上做了一个示例代码。波形可能会有所帮助。
就最后一条语句而言,我猜它会创建一个以 mux(使用 Select=G
和 Inputs as nand(A,D)
, xor(A,D)
)作为输入的翻牌。