“究竟是什么?”;“当前模拟时间”;Verilog中的事件队列?
考虑以下示例:“究竟是什么?”;“当前模拟时间”;Verilog中的事件队列?,verilog,system-verilog,system-verilog-assertions,iverilog,Verilog,System Verilog,System Verilog Assertions,Iverilog,考虑以下示例: module test; reg a; initial begin a = 1'b0; a <= 1'b1; $display(a); end endmodule 模块测试; 注册a; 初始开始 a=1'b0; averilog模拟周期比您当前的解释更复杂。对您的问题的简短回答是,$monitor不会等待当前周期结束,而是显示其消息,然后继续执行该过程(从而触发$display)而是简单地安排消息在任何因变量(在本例中仅为a)发生变化的模拟周期结束时显示
module test;
reg a;
initial begin
a = 1'b0;
a <= 1'b1;
$display(a);
end
endmodule
模块测试;
注册a;
初始开始
a=1'b0;
averilog模拟周期比您当前的解释更复杂。对您的问题的简短回答是,$monitor
不会等待当前周期结束,而是显示其消息,然后继续执行该过程(从而触发$display
)而是简单地安排消息在任何因变量(在本例中仅为a
)发生变化的模拟周期结束时显示;这是一种非常特殊(相当过时)的方法,可以在模拟过程中监控信号的变化$display
但是会立即执行,从而打印当时的a
。因此,另一种看待它的方式类似于非阻塞分配(verilog模拟周期比您当前的解释更复杂。您的问题的简短回答是,$monitor
不会等待当前周期的结束,显示其消息,然后继续执行流程(从而在之后触发$display
),而是简单地安排消息在任何因变量(在本例中仅为a
)发生变化的模拟周期结束时显示;这是一种非常特殊的(而且相当过时)监控模拟过程中信号变化的一种方法。$display
会立即执行,从而打印当时的a
。因此,另一种方法类似于非阻塞分配(Verilog模拟是事件驱动的。event是Verilog变量(或命名事件)值的变化.模拟分步骤进行
一个步骤从放置在事件队列上的输入事件开始。由于求值而产生的每一个新的值更改都会创建新的事件并添加到队列中。当队列为空(没有更多活动事件)时,模拟结束。每一个这样的步骤都会提前模拟时间
步骤本身被划分为多个区域,这些区域使用标准中定义的算法执行
对于verilog 2K,大致有3个主要区域:
阻塞分配区域。Verilog执行事件队列计划的所有程序块,并对新的阻塞分配事件作出反应。它只是计划稍后执行的nbas事件。所有阻塞事件完成后,它进入下一个区域
非阻塞分配区域。在这里,它执行对计划nba事件作出反应的所有块。它将把ba和nba事件都放在队列上。当所有nba都完成时,如果有ba事件和do all over,它可能返回区域“1”
monitor/strobe zone——这是$monitor(和$strob)工作时的区域。它在ba和nba区域都完成(不再有事件)后得到执行
在您的情况下,a=1
在阻塞分配区域中执行。该值将持续到该区域结束。$display
也将在此区域中执行。因此,它将看到'a==0'的值
aVerilog模拟是事件驱动的。事件是Verilog变量(或命名事件)值的更改。模拟分步骤完成
一个步骤从放置在事件队列上的输入事件开始。由于求值而产生的每一个新的值更改都会创建新的事件并添加到队列中。当队列为空(没有更多活动事件)时,模拟结束。每一个这样的步骤都会提前模拟时间
步骤本身被划分为多个区域,这些区域使用标准中定义的算法执行
对于verilog 2K,大致有3个主要区域:
阻塞分配区域。Verilog执行事件队列计划的所有程序块,并对新的阻塞分配事件作出反应。它只是计划稍后执行的nbas事件。所有阻塞事件完成后,它进入下一个区域
非阻塞分配区域。在这里,它执行对计划nba事件作出反应的所有块。它将把ba和nba事件都放在队列上。当所有nba都完成时,如果有ba事件和do all over,它可能返回区域“1”
monitor/strobe zone——这是$monitor(和$strob)工作时的区域。它在ba和nba区域都完成(不再有事件)后得到执行
在您的情况下,a=1
在阻塞分配区域中执行。该值将持续到该区域结束。$display
也将在此区域中执行。因此,它将看到'a==0'的值
a
module test;
reg a;
initial begin
a = 1'b0;
a <= 1'b1;
$display(a);
$monitor(a);
end
endmodule
module test;
reg a;
initial begin
a = 1'b0;
a <= 1'b1;
$monitor(a);
$display(a);
end
endmodule