1

我是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 的值执行第一个或第二个表达式。谁能解释一下这个操作。还请说明最后一条语句是如何合成的,因为整个代码都在一个始终块内并且具有正沿时钟。提前致谢。

4

1 回答 1

1

非阻塞赋值时间步开始时计算RHS表达式, 并将LHS 更新安排在时间步结束时进行

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

事件区域

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

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

G ,A andD are not updated in active region. Hence, while calculating the value ofK , the previous values ofG ,A andD are taken in the Active region. Then, all the veriables;G ,A ,D andK` 的值同时更新。

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

就最后一条语句而言,我猜它会创建一个以 mux(使用 Select=G和 Inputs as nand(A,D), xor(A,D))作为输入的翻牌。

于 2016-11-14T07:32:23.990 回答