Python 评估事件调度-Verilog分层事件队列

Python 评估事件调度-Verilog分层事件队列,python,verilog,fpga,hdl,Python,Verilog,Fpga,Hdl,我试图用Python实现一个简单的基于事件的Verilog模拟器,但实际上我很难在规范中找到一些细节(IEEE 1364-2005第11节) 假设我刚刚在clk上执行了一个更新事件,它现在获得了新的值1(之前为0)。根据规范,这要求我为敏感流程安排“评估事件” 我是否必须将always@(posedge clk)块的评估安排为活动或非活动事件?我猜后者是正确的 或者说,更一般地说。基本上所有事件都安排为非活动事件,但以下情况除外: 非阻塞分配更新为非阻塞分配事件 作为活动事件的连续分配 非常

我试图用Python实现一个简单的基于事件的Verilog模拟器,但实际上我很难在规范中找到一些细节(IEEE 1364-2005第11节)

假设我刚刚在
clk
上执行了一个更新事件,它现在获得了新的值1(之前为0)。根据规范,这要求我为敏感流程安排“评估事件”

我是否必须将
always@(posedge clk)
块的评估安排为活动或非活动事件?我猜后者是正确的

或者说,更一般地说。基本上所有事件都安排为非活动事件,但以下情况除外:

  • 非阻塞分配更新为非阻塞分配事件
  • 作为活动事件的连续分配

非常感谢

默认情况下,所有内容都在活动区域运行。例外情况如下:

  • #0个阻塞分配位于非活动区域
  • 非阻塞分配在NBA区域
  • $monitor、$strobe和PLI/VPI在监视器区域中
通过在任何现有模拟器中运行以下程序,我们可以证明
@
发生在活动区域:

intx;
初始开始
$monitor(“从$monitor:x是%0d”,x);
#0 x=5;//非活动事件
x=3;//活动事件(非活动事件后)
#1; // 转到下一时间戳
叉
#0 x=7;//非活动事件
x=11;//活动事件
参加
#0/非活动区域
#0 x=2;//非活动事件
x=5;//活动事件

我有一篇旁白,但是下面的博文和它的前辈们对verilog和VHDL中的调度进行了有趣的阅读。。。出于好奇,你的项目的目标是什么?如果您试图使用Python进行FPGA开发,我想您已经看到了,并且?@Chiggs MyHDL和我的关系实际上很僵硬;-)因此,我试图复制它,但采用了不同的方法(更少的魔力,更面向用户的对象)@Alex,因此您试图简化MyHDL,并因此查看Verilog调度。有趣:-)非常感谢你的回答!但我并没有完全信服,也没有与之抗争。如果按照您描述的方式处理事件,test2的结果应该是不可预测的?示例是确定性的。NBA区域在返回活动区域之前分配所有计划的非阻塞值。
@(posedge clk)
阻塞了
test2@Alex,我已经扩展了我的答案,解释了您的测试用例。原始示例不是确定性的。请参阅EDA操场上的代码,并注意GPLCver的行为与其他模拟器的不同。NBA转clk发生后,Verilog可能会也可能不会立即触发clocked always阻塞。您最初的问题是:@Greg说,@事件将安排在活动区域。但是,您不能对该事件和其他现有活动事件的评估顺序做出任何假设。这就解释了为什么您在这个注释部分中的示例是不确定的。
From @* $display: x is 3
 From $monitor: x is 3
 From @* $display: x is 11
 From @* $display: x is 7
 From @* $display: x is 5
 From @* $display: x is 2
 From @* $display: x is 4
 From $monitor: x is 4
Iteration:0
  Active: <----- This is region is executing
      clk$tmp = eval(1)
      test$tmp = eval(1)
  Inactive:
  NBA:
      clk = clk$tmp
      test = test$tmp
Iteration:1
  Active:
  Inactive:
  NBA: <----- This is region is executing
      clk = clk$tmp
      test = test$tmp
      Active.schedule( eval( "@(posedge clk)" )
Iteration:2
  Active: <----- This is region is executing
      eval( "@(posedge clk)" )
      Active.schedule( "test2$tmp = eval(test)" )
      NBA.schedule( "test2 = test2$tmp" )
  Inactive:
  NBA:
Iteration:3
  Active: <----- This is region is executing
      test2$tmp = eval(test)
  Inactive:
  NBA:
      test2 = test2$tmp
Iteration:4
  Active:
  Inactive:
  NBA: <----- This is region is executing
      test2 = test2$tmp
Iteration:5 --> next simulation cycle