【问题标题】:Non blocking Statements execution in verilog在verilog中执行非阻塞语句
【发布时间】:2023-04-01 21:58:02
【问题描述】:

我是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 hdl register-transfer-level


    【解决方案1】:

    非阻塞赋值计算 RHS 表达式 时间步的开始安排LHS更新发生在时间步的结束

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-02-05
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多