一种微处理器的软件模拟器的事件队列的管理方法及系统的制作方法

文档序号:8339357阅读:227来源:国知局
一种微处理器的软件模拟器的事件队列的管理方法及系统的制作方法
【技术领域】
[0001]本发明涉及微处理器的模拟技术,尤其涉及一种微处理器的软件模拟器的事件队列的管理方法及系统。
【背景技术】
[0002]在进行微处理器设计时,通常都要先使用软件模拟器来对各种备选方案进行评估。通过对各个部件进行软件建模,精确地模拟微处理器的功能和时序,可以较快地发现设计中的缺陷和谬误。
[0003]在模拟过程中,那些需要精确模拟时序的部件将产生大量的、具有一定触发延迟的操作。例如,访存部件频繁地发出数据缓存访问的操作,该操作发出后,经过2个周期到达数据缓存控制器。如果要访问的数据在数据缓存中,则该数据将在12个时钟周期后返回给访存部件。
[0004]为简化描述,此类操作都可以使用一个四元组0〈P,T, L, O表示。该四元组的意义为:类型为T的操作请求由部件P产生,经过L个周期后,部件C将收到该操作请求并进行相应的处理。
[0005]为方便处理,可以将上述四元组进行了一下变形,变换成E〈P,T,A,C〉。新四元组的意义如下:类型为T的操作请求由部件P产生,在时钟周期A中,部件C将收到该操作请求并进行处理。可以将这个四元组E称为一个“事件”。
[0006]模拟过程中生成的大量四元组事件都被存储到一个或者多个事件队列中。
[0007]模拟器在每个周期模拟过程开始时,首先检查事件队列,通过比较当前时钟周期数和事件队列中四元组事件中的时钟周期A,找出所有应在本周期内触发的事件,并调用该事件的部件C进行相应的处理。
[0008]模拟过程中产生的四元组事件E的数量,与模拟规模及对部件时序模拟精度要求有关。当进行大规模模拟(例如片上多核模拟),并对各部件时序精度要求较高时,每周期产生和消亡的事件数量将十分惊人。
[0009]要在一个庞大的事件队列中快速找出所有应在某个周期内触发的事件并非易事。若事件队列实现方法效率不高,那么大量的模拟时间将会被耗费在对事件队列的处理上,这将严重影响软件模拟器的运行效率。
[0010]现有技术中,事件队列的实现方式较多。
[0011]第一种事件队列的实现方式,是使用数组作为事件队列。对于事件插入方法,是将新生成的事件E〈p,T, A, C>直接添加到数组尾部。对于事件查找方法,是从事件队列头开始,依次向后查找整个数组,找出并触发所有应在本周期触发的事件。而对于事件剔除方法,则是将已经触发过的事件状态置为“无效”。
[0012]但是,使用数组作为事件队列的方式,存在着一些不足。
[0013]第一,事件队列大小无法预先得知。如果预先开辟的数组过大,则比较浪费内存资源;如果预先开辟的数组过小,则当产生的事件数量超过事件队列最大容量时,模拟过程将停顿。
[0014]第二:查询效率较低。当数组十分巨大时,从数组头开始向后依次找出并触发应该在本周期内触发的事件,这种查询的效率是十分低下的。针对这种情况,一种改进方法是定时清理数组事件,将某些已经发生过的事件从数组中剔除,只保留数组中的有效事件,这样可以压缩数组长度,但频繁的数组移动将带来较大的系统开销。
[0015]第二种事件队列的实现方式,是使用线性链表作为事件队列。对于事件插入方法,是新生成的事件E〈P,T, A, C>直接被插入到线性链表尾部。对于事件查找方法,是从线性链表头开始依次向后查找整个链表,找出并触发所有应该在本周期内触发的事件。而对于事件剔除方法,则是将已经触发的事件从线性链表中剔除。
[0016]但是,使用线性链表作为事件队列的方式,也存在着一些不足。
[0017]第一:对于事件剔除而言,由于每次查到一个事件时,这种方法就将该事件从链表中剔除,从而线性链表长度小于第一种方法中的数组长度,从这个角度看本方法的查找效率高于前述使用数组作为事件队列的实现方式。但是,当链表长度较大时,查询效率仍然很低。
[0018]第二:每次向线性链表插入事件节点时,需临时向系统申请内存空间;每次从线性链表中剔除事件时,也需要释放该事件节点占用的内存空间。而内存空间的申请与释放都由操作系统控制,需要进行系统调用和一系列的内核处理过程才能完成,这个过程十分耗时。由于在模拟过程中每周期都产生和消亡大量事件,因此,这种频繁的申请/释放内存的操作将严重影响模拟器运行效率。
[0019]第三种事件队列的实现方式,是使用堆或者二叉树作为事件队列。
[0020]虽然堆排序或者二叉树排序算法的性能要优于前面两种方法的查找性能,但是,堆或者二叉树这种结构并不适合用于实现事件队列。这主要是因为每个时钟周期内都会有大量的事件插入事件队列,同时又有大量的事件从事件队列中被剔除。在每次有新事件插入或剔除时,都需要对堆或者二叉树进行调整,以保证堆或者二叉树的特性,这就会严重影响模拟器的运行效率。这种频繁调整的代价,要远远大于其高性能搜索算法所带来的好处。因此,虽然可以使用,但使用堆或者二叉树来实现事件队列的应用并不普遍。

【发明内容】

[0021]本发明所要解决的技术问题是为了克服现有技术中微处理器的软件模拟器的事件队列的效率低下的不足。
[0022]为了解决上述技术问题,本发明的实施例首先提供了一种微处理器的软件模拟器的事件队列的管理方法,包括:将事件队列存储在循环数组中;所述循环数组中包含多个表项,每个表项对应所述软件模拟器的一个时钟周期;将所述循环数组中的每个表项与预设的线性链表一一对应,每个表项的头指针和尾指针分别指向对应线性链表的头元素和尾元素;每个线性链表存储应该在对应表项所代表的时钟周期内触发的事件;将全局周期指针指向当前时钟周期所对应的表项;当一个时钟周期模拟结束后,将所述全局周期指针前进一个表项。
[0023]优选地,根据所述软件模拟器模拟过程中生成的事件的最大触发延迟时钟周期确定所述循环数组的大小。
[0024]优选地,该方法包括:在查找事件时,检测所述全局周期指针指向的当前表项;若所述全局周期指针所指向的当前表项内的头指针不为空,则按序触发头指针指向的线性链表中的所有事件。
[0025]优选地,该方法包括:在插入新事件时,根据所述新事件的触发周期确定所述新事件所对应的目标表项;将所述新事件插入到所述目标表项所对应的线性链表中。
[0026]优选地,该方法包括:从所述事件队列中剔除的事件节点存储在预设的空闲池中。
[0027]优选地,该方法包括:在插入新事件时,检查所述空闲池;所述空闲池为空时,申请内存并根据所述新事件的触发周期确定所述新事件所对应的目标表项,将所述新事件插入到所述目标表项所对应的线性链表中;所述空闲池不为空时,从所述空闲池的头指针处取出一个空闲事件节点存储所述新事件。
[0028]优选地,该方法包括:当前时钟周期的模拟结束后,将所述当前时钟周期对应表项所对应的线性链表从头部摘除并链入所述空闲池的尾部,并将所述当前时钟周期对应表项的头指针和尾指针置为空。
[0029]本发明的实施例还提供了一种微处理器的软件模拟器的事件队列的管理系统,包括:存储单元,设置为将事件队列存储在循环数组中;所述循环数组中包含多个表项,每个表项对应一个所述软件模拟器的一个时钟周期;对应单元,设置为将所述循环数组中的每个表项与预设的线性链表一一对应,每个表项的头指针和尾指针分别指向对应线性链表的头元素和尾元素;每个线性链表存储应该在对
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1