首页 百科知识 5.3.3进程的执行

5.3.3进程的执行

时间:2022-10-15 百科知识 版权反馈
【摘要】:零延时信号赋值称为零延时事件。所有进程的执行被分为了两个阶段:执行阶段,信号值更新阶段。注意,在执行阶段,顺序语句严格按语句先后次序顺序执行,但从仿真时钟上看,所有语句又都是发生在该进程被激活的同一时刻;信号值更新阶段是在所有被激活的进程执行完毕后。WAIT语句结束进程的执行阶段,进入信号更新阶段,进程挂起,依照队列中的事件排列更新信号值,在仿真时钟到达1ns时,信号s的值更新为1,到2ns时,s的值更新为2。

5.3.3 进程的执行

(1)多进程并发

在构造体中可以没有进程,也可以有一个或多个进程。当构造体中有多个进程时,这些进程是并行执行的,只要满足某个进程的激活条件,这个进程就被激活。通过信号的传递,来实现各个PROCESS进程之间的通信。如例5-7所示。

【例5-7】多进程的执行示例

img139

上例中,z是连接两个进程的桥梁。

(2)进程的处理机制

当进程被激活时,进程顺序语句块内的语句是严格按语句先后次序来执行的,但从仿真时钟上看,所有语句又都是发生在该进程被激活的同一时刻。对于顺序语句块内的信号赋值语句,其延时时间都是从进程激活的同一时刻算起的。

由于信号表征的是电路中真实存在的互连线,对信号的赋值是存在延时的,信号延时分为零延时、传播延时、惯性延时,依据延时类型的不同,进程的处理机值也略有不同。

进程中零延时事件的处理

在信号赋值中,若没有写入延时表达式,则称为零延时。零延时信号赋值称为零延时事件。虽然被称为零延时,但实际上依然存在一个“无限小”的传播延时,即Δ延时。在仿真中,为了在进程中体现这一点,进程中所有信号的“值”的更新并不是立即更新的,而是在所有被激活进程的零延时信号赋值语句的表达式运算执行完毕后,再经Δ延时后更新的。如图5.2所示。

由图5.2可以看到,在初始化阶段,所有进程执行一遍,然后仿真时间刻度随着程序的执行前进。所有进程的执行被分为了两个阶段:执行阶段,信号值更新阶段。注意,在执行阶段,顺序语句严格按语句先后次序顺序执行,但从仿真时钟上看,所有语句又都是发生在该进程被激活的同一时刻;信号值更新阶段是在所有被激活的进程执行完毕后。仿真周期只有所有被激活的进程执行完毕、信号值更新完毕后,才会结束当前仿真周期,进入下一个仿真周期,仿真时间前进,否则,仿真时间会停留在该时刻。

img140

图5.2 进程中零延时事件的处理机制

例5-8给出了零延时的应用实例。

【例5-8】进程中零延时事件的处理

img141

img142

例5-8中,有两个进程子结构P1和P2,假定a、b、c、d四个输入全为“0”,初始化时,执行P1和P2,使得y和z也是“0”,在100ns时,a发生变化变为“1”,两个进程P1、P2均被激活,进入进程执行阶段,同时计算y的新值“(a AND b)OR z ”和z的新值“tmp:=a XOR b,tmp OR d”,随后Δ延时后,更新y和z的值,这个仿真周期结束;仿真时间进入到100ns+Δ时刻,在新的仿真周期内,“z”的变化再次激活进程P1,执行P1中的语句,y的值再次更新,新的仿真周期结束。在不同仿真时刻,y、tmp和z的值如下:

img143

但是,由于Δ是无限小时间,所以在波形上看,在100ns时y和z都变为“1”。

如果tmp不是变量而是信号,如例5-9所示,那么在相同情况下,当a由“0”变为“1”后,y和z的值会全然不同。

【例5-9】零延时信号赋值对进程的影响

img144

img145

在这个程序中,在不同仿真时刻,y和z的值如下:

img146

注意,在执行阶段,信号的值是没有更新的,故在P2的执行阶段“tmp OR d”用的是tmp的旧值“0”,所以在信号更新阶段,z的值是“0”。例5-8和例5-9唯一的差别就是tmp在例5-8中是变量,而在例5-9中是信号,但两个程序的执行结果全然不同。

进程中传播延时事件的处理

带有传播延时的信号赋值称为传播延时事件。

在一个进程中,可能某一信号被先后赋值多次,对于传播延时事件,当进程被激活时,对信号的每次赋值及相应的更新时间,都将作为一个待处理的传播事件,在该信号的驱动器中进行排队。如例5-10所示。

【例5-10】进程中传播延时事件的处理

img147

例5-10的进程在仿真0时刻开始执行,执行第一个语句后,信号s的驱动器中存入一个传播延时事件,如注释中所示,即(1ns,1)。执行完第二个语句之后,驱动器中又增加一个传播延时事件,即(1ns,1),(2ns,2)。WAIT语句结束进程的执行阶段,进入信号更新阶段,进程挂起,依照队列中的事件排列更新信号值,在仿真时钟到达1ns时,信号s的值更新为1,到2ns时,s的值更新为2。

【例5-11】传播延时事件被冲掉的例子

img148

例5-11中,信号s先后三次顺序赋值,当进程被激活时,由于第三次赋值的传播延时事件(2ns ,2)先发生,第二次赋值的传播延时事件(3ns,3)被冲掉了,在信号值更新阶段,信号驱动器中只保留两个传播延时事件,即(1ns,1),(2ns,2),依照队列中的事件排列更新信号值,在仿真时钟到达1ns时,信号s的值更新为1,到2ns时,s的值更新为2。

进程中惯性延时事件的处理

带有惯性延时的信号赋值称为惯性延时事件。

惯性延时的特性决定了信号驱动器中只能保存一个处理事项。如例5-12所示。

【例5-12】进程中惯性延时事件的处理

img149

例5-12中,信号s也是先后三次赋值,当进程被激活时,由于信号驱动器中只能保存一个惯性延时事件,所以第二个惯性延时事件(2ns,2),冲掉了第一个惯性延时事件(1ns,1),但第三个惯性延时事件(3ns,2),却未能冲掉第二个惯性延时事件。这是因为第三次赋值与第二次赋值所赋之值相同,表现在第二次赋值后信号s的“信号源”保持未变,以惯性延时的定义,第二次赋值依然有效,而第三次赋值没有意义。进程碰到WAIT语句,执行阶段结束。在信号值更新阶段,信号驱动器中有一个传播延时事件,即(2ns,2),在仿真时钟到达2ns时,s的值更新为2。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈