Verilog 带延迟的非阻塞语句

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

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

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

这个分析正确吗?

不,不是这样,非阻塞分配的工作原理与您描述的不同

您是对的,非阻塞语句的实际赋值是延迟的,在“以后”执行。但“以后”是什么时候

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


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

始终
块重新写入单独的行,并明显移动
开始/结束
块的位置可能会有所帮助。这对行为没有影响,因为一切都是按顺序执行的

    time   a   t   c
    0ns    0   x   x
    1ns    0   x   x
    2ns    0   x   x
    3ns    0   0   x
    4ns    0   0   x
始终//实例化过程块
开始
@//阻塞事件延迟等待-a上的更改-
#1//阻塞延时等待1个时间单位

t“与实际产出相比,我的分析是错误的”在这种情况下,我建议您首先告诉我们您的分析是什么。在此之前,我们无法告诉您哪里出了问题。(x)在这段代码中,假设“a”最初从x更改为0。所以总是会触发块。当执行第一个语句时,编译器会知道它是非块语句,因此“a”的值被临时变量赋值,但尚未赋值给“t”。由于它是非阻塞的,所以并行执行第二条语句。但第二条语句的内部延迟为1ns,所以在1ns之后执行。也就是说,对“t”进行评估。因此,仅在这两次评估之后,“t”和“a”的最终赋值将发生。我的分析就在这里吗?请将您的文本添加到问题中(使用下面的“编辑”按钮)您意识到将
t
从敏感度列表中排除是不正常的吗?我完全重写了问题谢谢您的回答。在哪里可以阅读有关阻塞和非阻塞语句调度条件的更多信息。因为我想更多地了解阻塞和非阻塞语句中指定的内部和内部延迟。任何最好的epdf??我很久以前下载了系统Verilog 3.1a标准。试着找到它,看看第14节。SystemVerilog 3.1标准已经过时15年了。你可以免费下载最新的版本:IEEE要求电子邮件等。它可能是免费的,但你首先必须放弃你的隐私。。。不,谢谢。
    time   a   t   c
    0ns    0   x   x
    1ns    0   x   x
    2ns    0   x   x
    3ns    0   0   x
    4ns    0   0   x
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-.