为什么要用事件驱动?事件驱动,其意义就是当信号值变化时才去计算该信号作为输入信号的元件(即扇出元件)。如果一个元件的输入端的值均未变化,则该元件没有必要计算。
  为了表示信号波形和元件延迟的作用,模拟程序建立一个虚拟的模拟时钟(Simulation clock)。起始点是0时刻。时间量可以是有单位的量,如纳秒(ns, 10-9秒)、皮秒(ps, 10-12秒),也可以是没有单位的相对量。
  注意模拟时钟不是计算机中的内部时钟,而是由模拟程序设置的用于记录和控制模拟运行过程的虚拟的一个特殊变量。在开始模拟时,模拟时钟的值为0。模拟时钟的时间量是根据元件延迟模型决定的,在后面的模拟算法过程中可以进一步理解。没有单位的时间量常把非门的延迟时间或其他某一个时间量定为一个单位。其他元件的延迟设为该单位的倍数。目前常用的时间单位为纳秒。
  模拟过程从零时刻开始。首先把外部输入激励信号作为原始的事件,驱动相关元件的功能计算。计算得到的元件输出端的信号值并不是当前时刻的值,有一定的延迟,是将来时刻的值,我们称之为将来值,模拟器需要把这些将来值的发生时刻和信号值记录下来。一般情况下,不能在得到将来值的时候确定其是否是一个跳变,即不能说该将来值构成一个新的事件。为了与事件的概念进行区分,我们采用事项处理(transaction)这个术语。等到将来时刻到来时,原来的将来值就成为当前值。在模拟时钟处于某一时刻时,只有当前值起作用。其结果是实现各元件的并行处理。
  事项处理有三个要素:信号节点指针、信号值、事项处理发生时间,记为
      e = ( s, v, t )
  其意义为:信号s将要在将来的 t 时刻得到值v。在实际模拟程序中,时间t可以用绝对时间表示,也可以用相对时间表示。本章为了讲述方便,不失一般性,以下都用绝对时间表示
  记录和管理事项处理采用时间映射的链表。每一时刻的事项处理各排成一个链表,各个时刻排成一个时间队列表(TQ表)。由于事项处理映射到了时间队列中,挂在时间结点的事项处理节点中只有信号节点指针和信号值两个域。
  当延迟时间为任意整数值时,时间队列表常常用链表实现。当延迟时间为实数值时,常常不用时间队列表,而直接将事项处理节点按发生时刻进行排序。每个事项处理节点中还需要包含时间域。

  图3.8为时间映射的事项处理链表示意图。
图3.8 时间映射的事项处理链表示意图

  当某一时刻所有当前事项处理都处理完毕,即这些事项处理相关的元件都计算完毕,则把当前事项处理从时间队列表中删除。后面的时间结点就成了当前时间,其结果是时钟向前走了一步。
  
注意:1.某一时刻所有事项处理完毕后,当前的事项处理链表即被删除。因而,事项处理表中只有将来时刻的新值纪录,而没有前面任何时刻发生的事项纪录。注意这一点是很重要的。后面我们会看到,对于一个信号的事项处理节点,从当前时刻到其该事项处理发生的时刻之间的时间总是小于该信号的延迟时间。2.所谓"时钟走了一步"的含义为模拟时钟变量由原来的值变为新的时间节点的时间值,即时间增加了一个增量。3. 同一个模拟周期的过程中, 模拟时钟不动, 无论处理多少个时间, 无论各元件的运行用多长的时间, 模拟时刻始终处在同一个点上, 只有从一个模拟周期走到下一模拟周期时, 时钟才向前走一步。