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