【问题标题】:Non blocking statements with delays有延迟的非阻塞语句
【发布时间】:2019-09-01 23:13:15
【问题描述】:
always@(a)
begin
#1 t<=a;
#1 c<=t;
end

我正在用下面给出的测试台分析上面的verilog代码

   a=0;
#5 a=1;
#5 a=0;
#5 a=1;
#5;

这是我的分析: 从上面的测试台我可以看出'a'是一个总长度为20ns的时钟信号,OFF和ON时间分别为5ns。在第0 ns,'a'从X变为0。所以总是块被触发。因为块内的第一条语句有 1ns 的内部延迟,它等待 1ns。在 1ns 编译器知道它是非阻塞语句之后,所以只会进行评估而不是赋值。因此“a”值将被存储为临时并并行执行第二个语句。因为第二个也有内部延迟,它等待 1ns .然后评估完成。由于两个评估都完成了,现在将进行分配。

    time   a   t   c
    0ns    0   x   x
    1ns    0   x   x
    2ns    0   x   x
    3ns    0   0   x
    4ns    0   0   x

这个分析正确吗?

【问题讨论】:

  • “与实际输出相比,我的分析是错误的” 在这种情况下,我建议您先告诉我们您的分析是什么。在那之前,我们无法告诉你哪里出了问题。
  • (x) 在此代码中,假设“a”最初从 x 更改为 0。所以总是会触发块。在执行第一条语句时编译器会知道它是非阻塞语句,因此“a”的值被分配了临时变量但尚未分配给“t”。因为它是非阻塞的,所以它并行执行第二个语句。但是第二个语句有 1ns 的内部延迟,所以在 1ns 之后它执行。也就是说,'t' 被评估。所以仅在这两个评估之后,'t'和'a'的最终分配将发生。我的分析在这里吗?
  • 请将您的文字添加到问题中(使用下方的“编辑”按钮)您意识到将t 排除在敏感列表之外是不正常的吗?
  • 我完全重写了问题

标签: verilog


【解决方案1】:

不,事实并非如此,非阻塞分配的工作方式与您描述的不同。

您是对的,非阻塞语句的实际分配被推迟,“稍后”执行。但是“稍后”是什么时候?

当没有更多未完成的阻塞事件时处理“非阻塞”事件。但在处理延迟之前。因此,一旦模拟器发现它必须处理您的#1,它就会首先处理所有非阻塞分配,然后才开始处理延迟。
这意味着即使在它开始之前#1 延迟t 已经收到a 的值。

Verilog 标准有一整章描述了各种“动作”的执行顺序。

【讨论】:

  • 感谢您的回答。我在哪里可以阅读有关阻塞和非阻塞语句调度标准的更多信息。因为我想更多地了解阻塞和非阻塞语句中指定的内部和内部延迟。任何最好的epdf??
  • 我很久以前就下载了 System-Verilog 3.1a 标准。尝试找到它并查看第 14 节。
  • SystemVerilog 3.1 标准已过时 15 年。您可以在ieeexplore.ieee.org/document/8299595免费下载最新版本
  • 刚试过:IEEE 要求提供电子邮件等。它可能是免费的,但你首先要放弃你的隐私......不,谢谢。
【解决方案2】:

always 块重新编写成单独的行并稍微移动begin/end 块的位置可能会有所帮助。这对行为没有影响,因为一切都是按顺序执行的。

always // instantiate a procedural block
      begin
      @a  // blocking event delay waits for a change on -a-
      #1  // blocking time delay waits for 1 time unit
      t <= a; // non-blocking assignment 
              // uses the current value of -a- one time unit after it changed
              // and schedules an assignment to t
      #1 // blocking time delay waits for 1 time unit
         // since there is no more active things to do -a- gets updated
      c <= a; // uses the updated value of t and schedules an assignment to c
      end // now 2 time units after -a- was first changed
          // goes back to the top of the block and waits for another change 
          // on -a-.

请注意,在执行块时发生的 a 上的任何更改都会丢失。这是一个很好的presentation on non-blocking assignments

【讨论】:

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