用于执行部件模块级验证的寄存器分配与释放方法及部件与流程

文档序号:16262653发布日期:2018-12-14 21:42阅读:187来源:国知局
用于执行部件模块级验证的寄存器分配与释放方法及部件与流程

本发明涉及微处理器验证领域,具体涉及一种用于执行部件模块级验证的寄存器分配与释放方法及部件。

背景技术

近年来,随着制造工艺的改进,微处理器设计的复杂度越来越高,微处理器功能验证已成为微处理器设计流程中的瓶颈。微处理器设计的复杂度决定了微处理器的验证不可能一蹴而就,因此通常会采用层次化的方法进行,典型的微处理器验证层次分为模块级、内核级和芯片级。微处理器的执行部件作为模块级验证对象的规模合适且功能基本完整,与其他模块的边界和接口比较清晰,因此在做内核级验证之前,会先进行模块级验证。微处理器的执行部件包括整数运算部件、浮点运算部件和访存部件等,这些部件通常只负责操作数准备完成后具体操作的执行,操作数的准备包括取指、译码、寄存器分配与释放等是在其他部件完成的。为了尽可能真实的模拟微处理器中指令的执行情况,同时也为了对执行部件进行充分的验证,执行部件的模块级验证环境中需要完成操作数的准备工作,其中就包括寄存器的分配和释放。

在微处理器执行部件模块级验证中常用的寄存器分配和释放的方法步骤如下:1)通过复杂的计算,得出当前可分配的空闲寄存器号;2)监控流水线输入信号,当检测到流水线需要分配寄存器号时,进行寄存器号的分配;3)监控流水线输出信号,当检测到寄存器号可释放时,直接释放该寄存器;4)通过复杂的计算,得出流水线后端未监测到的可释放的寄存器号并释放。但是,上述方法存在的缺点包括:1)计算量大,分配及释放的效率低。在执行部件的流水线中,操作数保存在物理寄存器中,为了确保指令的正确执行,需要在验证环境中确保分配进流水线的寄存器号必须唯一,因此在流水线前端进行寄存器分配时,需通过复杂的计算得出当前可分配的寄存器号;为了提高微处理器设计中流水线的执行效率,现代微处理器设计通常采用乱序的流水线结构,且为了提高流水线效率,源寄存器号一般不会带至流水线后端,这就导致在流水线后端只能监测到部分可释放寄存器号,且不知道该寄存器号来自哪个操作,因此需通过复杂的计算才能释放掉操作占用的所有寄存器号。2)可扩展性、通用性较差。不同的微处理器设计中,物理寄存器的设计可能存在大小和数量等不同,如采用上述方法需要对验证环境的代码进行较大的改动。



技术实现要素:

本发明要解决的技术问题:针对现有技术的上述问题,提供一种计算量小、可扩展性好、通用性强、分配和释放效率高的用于执行部件模块级验证的寄存器分配与释放方法及部件。

为了解决上述技术问题,本发明采用的技术方案为:

一种用于执行部件模块级验证的寄存器分配与释放方法,实施步骤包括:

1)预先构造以自然数为索引的空闲寄存器队列、以操作名称为索引的合并队列以及以寄存器号为索引的映射队列;所述空闲寄存器队列的队列大小与待测设计中的寄存器数目一致,将所有待分配的寄存器号保存至该队列中,每个寄存器号占用一项;所述合并队列中每项也是一个队列,该队列用于保存各操作占用的所有寄存器号,每个操作占用合并队列的一项;所述映射队列用于保存占用寄存器号的操作名称,每个寄存器号占用一项;

2)在验证环境中实时监控流水线前端的输入信号以及流水线后端的输出信号,当在流水线前端监测到某操作需要分配寄存器号时,跳转执行步骤3);当在流水线后端监测到某个寄存器号可以释放时,跳转执行步骤4);

3)从所述空闲寄存器队列中取出一个或多个寄存器号,存入所述合并队列中,并将对应的操作名称存入所述映射队列中进行标记;跳转执行步骤2);

4)先根据寄存器号查询所述映射队列找到待释放寄存器号对应的操作名称,再根据操作名称查询所述合并队列找到该操作占用的所有寄存器号,将该操作占用的所有寄存器号添加到所述空闲寄存器队列中,同时删除所述映射队列、合并队列中的相应信息。

优选地,步骤3)的详细步骤包括:

3.1)判断所述空闲寄存器队列中是否有空闲的寄存器号可分配,若存在则跳转执行步骤3.2);否则,跳转重新执行步骤3.1);

3.2)从所述空闲寄存器队列中取出一个寄存器号;

3.3)将取出的寄存器号存入所述合并队列中;

3.4)将取出的寄存器号所占用寄存器的操作名称存入所述映射队列中;

3.5)判断是否满足操作所需寄存器号数量,如果已经满足操作所需寄存器号数量,则跳转执行步骤2);否则,跳转执行步骤3.2)。

优选地,步骤4)的详细步骤包括:

4.1)根据寄存器号查询所述映射队列查找待释放寄存器号对应的操作名称,如果查找成功则跳转执行步骤4.2);否则,结束并跳转执行步骤4.7);

4.2)根据待释放寄存器号对应的操作名称查询所述合并队列找到该操作占用的所有寄存器号,如果查找成功则跳转执行步骤4.3);否则,结束并跳转执行步骤4.7);

4.3)根据操作名称查询所述合并队列找到该操作占用的所有寄存器号;

4.4)将该操作占用的所有寄存器号添加到所述空闲寄存器队列中;

4.5)删除所述合并队列中的相应信息;

4.6)删除所述映射队列中的相应信息;

4.7)跳转执行步骤2)。

本发明还提供一种用于执行部件模块级验证的寄存器分配与释放部件,包括以自然数为索引的空闲寄存器队列、以操作名称为索引的合并队列、以寄存器号为索引的映射队列以及分配与释放管理单元;所述空闲寄存器队列的队列大小与待测设计中的寄存器数目一致,将所有待分配的寄存器号保存至该队列中,每个寄存器号占用一项;所述合并队列中每项也是一个队列,该队列用于保存各操作占用的所有寄存器号,每个操作占用合并队列的一项;所述映射队列用于保存占用寄存器号的操作名称,每个寄存器号占用一项;所述分配与释放管理单元被编程以执行本发明前述用于执行部件模块级验证的寄存器分配与释放方法的步骤2)~步骤4)。

和现有技术相比,本发明具有下述有益效果:

1)运算量小、效率高。本发明不需要经过复杂运算,只需实时监控并修改队列中内容,即可模拟微处理器设计中真实的寄存器分配与释放行为,运算量较小,分配和释放效率较高。

2)通用性强。在微处理器其他执行部件的模块级验证中,以及其他微处理器的执行部件模块级验证中,都可采用本发明方法来进行寄存器的分配与释放。

3)可扩展性好。如果待测设计的寄存器设计变化,只需修改空闲寄存器队列大小并将所有的寄存器号加入该队列即可,无需复杂的修改与调试,可扩展性好。

附图说明

图1为本发明实施例方法的基本流程示意图。

图2为本发明实施例中空闲寄存器队列的结构示意图。

图3为本发明实施例中合并队列的结构示意图。

图4为本发明实施例中映射队列的结构示意图。

图5为本发明实施例中寄存器分配的流程示意图。

图6为本发明实施例中寄存器释放的流程示意图。

具体实施方式

参见图1,本实施例用于执行部件模块级验证的寄存器分配与释放方法的实施步骤包括:

1)预先构造以自然数为索引的空闲寄存器队列、以操作名称为索引的合并队列以及以寄存器号为索引的映射队列;所述空闲寄存器队列的队列大小与待测设计中的寄存器数目一致,将所有待分配的寄存器号保存至该队列中,每个寄存器号占用一项;所述合并队列中每项也是一个队列,该队列用于保存各操作占用的所有寄存器号,每个操作占用合并队列的一项;所述映射队列用于保存占用寄存器号的操作名称,每个寄存器号占用一项;

2)在验证环境中实时监控流水线前端的输入信号以及流水线后端的输出信号,当在流水线前端监测到某操作需要分配寄存器号时,跳转执行步骤3);当在流水线后端监测到某个寄存器号可以释放时,跳转执行步骤4);

3)从所述空闲寄存器队列中取出一个或多个寄存器号,存入所述合并队列中,并将对应的操作名称存入所述映射队列中进行标记;跳转执行步骤2);

4)先根据寄存器号查询所述映射队列找到待释放寄存器号对应的操作名称,再根据操作名称查询所述合并队列找到该操作占用的所有寄存器号,将该操作占用的所有寄存器号添加到所述空闲寄存器队列中,同时删除所述映射队列、合并队列中的相应信息。

如图2所示,本实施例中构造了以自然数为索引的空闲寄存器队列freetag_q,队列大小为64项,与待测设计中的寄存器数目一致,将所有待分配的寄存器号保存至该队列中,每个寄存器号占用一项,即freetag_q[0]=tag_0、freetag_q[1]=tag_1、……、freetag_q[63]=tag_63。

如图3所示,本实施例中构造了以操作名称为索引的合并队列taglist_q,合并队列中每项也是一个队列(busytag_q),该队列用于保存各操作占用的所有寄存器号,每个操作占用taglist_q的一项,每个操作占用的寄存器号占用busytag_q中的一项或多项。

如图4所示,本实施例中构造了以寄存器号为索引的映射队列tagmap_q所示,该队列用于保存占用寄存器号的操作名称,每个寄存器号占用一项。

如图5所示,步骤3)的详细步骤包括:

3.1)判断所述空闲寄存器队列中是否有空闲的寄存器号可分配,若存在则跳转执行步骤3.2);否则,跳转重新执行步骤3.1);

3.2)从所述空闲寄存器队列中取出一个寄存器号;

3.3)将取出的寄存器号存入所述合并队列中;

3.4)将取出的寄存器号所占用寄存器的操作名称存入所述映射队列中;

3.5)判断是否满足操作所需寄存器号数量,如果已经满足操作所需寄存器号数量,则跳转执行步骤2);否则,跳转执行步骤3.2)。

本实施例中,当在流水线前端监测到uop_0需要分配寄存器号时,首先根据uop_0的实际情况从空闲队列中取出两个寄存器号tag_0和tag_1(本实施例中uop_0仅需要两个寄存器);然后将uop_0所占用的寄存器号tag_0和tag_1存入taglist_q中的uop_0项中;最后将tag_0和tag_1对应的操作名称uop_0存入tagmap_q中进行。

如图6所示,步骤4)的详细步骤包括:

4.1)根据寄存器号查询所述映射队列查找待释放寄存器号对应的操作名称,如果查找成功则跳转执行步骤4.2);否则,结束并跳转执行步骤4.7);

4.2)根据待释放寄存器号对应的操作名称查询所述合并队列找到该操作占用的所有寄存器号,如果查找成功则跳转执行步骤4.3);否则,结束并跳转执行步骤4.7);

4.3)根据操作名称查询所述合并队列找到该操作占用的所有寄存器号;

4.4)将该操作占用的所有寄存器号添加到所述空闲寄存器队列中;

4.5)删除所述合并队列中的相应信息;

4.6)删除所述映射队列中的相应信息;

4.7)跳转执行步骤2)。

本实施例中,当在流水线后端监测到tag_0可以释放时,首先根据寄存器号tag_0查询tagmap_q,找到tag_0对应的操作名称为uop_0;然后根据uop_0查询taglist_q,找到该操作占用的所有寄存器号为tag_0和tag_1;将该操作占用的所有寄存器号tag_0和tag_1添加到freetag_q中;最后删除taglist_q[uop_0]、tagmap_q[tag_0]和tagmap_q[tag_1]。在流水线后端监测到tag_1可释放时,根据寄存器号tag_1查询tagmap_q,发现该队列中tag_1的相关信息不存在,说明该寄存器号已释放,无需再次进行释放。

此外,本实施例还提供一种用于执行部件模块级验证的寄存器分配与释放部件,包括以自然数为索引的空闲寄存器队列、以操作名称为索引的合并队列、以寄存器号为索引的映射队列以及分配与释放管理单元;所述空闲寄存器队列的队列大小与待测设计中的寄存器数目一致,将所有待分配的寄存器号保存至该队列中,每个寄存器号占用一项;所述合并队列中每项也是一个队列,该队列用于保存各操作占用的所有寄存器号,每个操作占用合并队列的一项;所述映射队列用于保存占用寄存器号的操作名称,每个寄存器号占用一项;所述分配与释放管理单元被编程以执行本实施例用于执行部件模块级验证的寄存器分配与释放方法的步骤2)~步骤4),在此不再赘述。

以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1