专利名称:设计在cpu里的利用映像寄存器组支持“非侵入性”调试的方法
技术领域:
本发明涉及一种设计在CPU里的利用映像寄存器组支持“非侵入性”调试的方法。
背景技术:
微处理器的调试接口是在处理器的开发系统上配置软件/硬件调试功能,通过处理器提供的硬件接口监视、跟踪、改变CPU内部的状态。随着软件/硬件系统复杂程度的提高,和缩短开发时间的需求,提供一个高效的、功能完善的调试接口对于提高系统开发的效率是非常重要的。
到目前为止已经有一些策略可以支持嵌入式软件的开发和调试,方案大致可以划分为两类软件和硬件。软件的策略是通过在目标器件的ROM中装入监视程序,监视程序允许将目标代码串行地下载到RAM中,供给CPU执行。这种方法可以实现基本的CPU监视和系统运行控制,如单步调试、设置软件断点等。通过监视程序的方法存在的缺点是不能用软件断点来调试存入ROM中的代码,而且对于存储映像是“侵入性”的。
硬件的策略是通过在CPU中集成相关的硬件电路,如跟踪单元、硬件断点单元、跳转目标地址FIFO等硬件电路,通过JTAG接口监视、跟踪并改变CPU的状态。这种方法的弥补了软件策略的缺点,并且允许系统开发人员监视目标系统的所有工作情况。硬件策略的实现的一种方法是在需要观测的电路周围插入扫描链,从而允许CPU外部通过JTAG接口设置CPU的工作状态,或者通过JTAG接口读取CPU的工作状态。这种做法的不足之处在于需要将扫描链单元安插于关键路径上,从而限制了CPU的性能提高;另外,随着CPU微结构复杂程度的提高,需要通过延长扫描链的方法来访问待观察的CPU内部状态,因此,这种方法也增加了硬件设计的难度;同时,当调试主机需要得到下一条指令时,需要在增加额外的数据通道来保存下一条指令的代码。
发明内容
本发明的目的是提供一种设计在CPU里的利用映像寄存器组支持“非侵入性”调试的方法。
它的步骤如下1)当CPU进入调试模式的时候,执行单元负责将PC寄存器的内容送入PC寄存器映像;控制寄存器组将系统状态寄存器的内容送入CPU状态寄存器映像中;2)当CPU进入调试模式时,调试模块提取下一条指令代码;3)当CPU处于调试模式时,允许CPU不退出调试模式通过指令寄存器映像执行调试主机给出的指令,将调试控制/状态寄存器设置为指令的源操作数或者目标操作数;4)当CPU退出调试模式时,通过设置PC寄存器映像来设置指令执行的起始地址,通过CPU状态寄存器映像设置程序运行的状态。
本发明的优点是这个机制的逻辑含量并不高,对CPU芯片的大小的影响很小,因而不会增加CPU芯片的成本。而且本发明的逻辑不在CPU的时序关键路径上,不影响CPU的运行最高频率。同时,这个机制可伸缩性强,当CPU微结构复杂度提高之后,只需要增加相应的影响寄存器来观察CPU的内部状态,而不会提高CPU设计的复杂度。
图1显示了典型调试系统的结构框图;图2是本发明的含有调试模块的CPU内部结构框图;图3a是本发明的PC寄存器映像和指令寄存器映像使用原理图;图3b是本发明中操作数寄存器映像和调试控制/状态寄存器映像的原理图;图4是本发明中CPU进入调试模式时数据的流向5是本发明中CPU不退出调试模式执行指令的流程图具体实施方式
本发明基本特点在于使用映像寄存器组支持“非侵入性”的调试,其实现方法概括如下1)在CPU的调试模块中定义一组特殊数据通道的映像寄存器,包括指令寄存器映像、操作数寄存器映像、PC寄存器映像、调试控制/异常状态寄存器映像、CPU状态寄存器映像;2)调试主机通过JTAG结构来设置该映像寄存器组,并且JTAG接口读取该映像寄存器组而得知CPU的信息;3)当CPU进入调试模式时,CPU直接将下一条指令的地址保存到PC寄存器映像;将CPU状态寄存器保存到调试模块中的CPU状态寄存器映像;4)当CPU进入调试模式之后,为了不增加额外的硬件开销,将由调试模块控制指令高速缓存,取得下一条指令代码,保存在指令寄存器映像中;如果访问指令告诉缓存产生异常,将异常写入调试控制/异常状态寄存器;5)CPU可以不退出调试模式执行调试主机给出的指令时,此时,需要通过指令寄存器映像来设置CPU将要执行的指令;同时,调试模块负责产生响应的控制信号,使得执行单元完成该指令之后,让CPU维持在调试模式下,而不执行其他的指令;5)当CPU不退出调试模式执行调试主机给出的指令时,通过调试控制/状态寄存器将操作数寄存器映像设置为源操作数还是目标操作数;6)退出调试模式时,通过设置该寄存器组中的PC寄存器映像来设置程序开始运行的起始地址;通过设置该寄存器组中的CPU状态寄存器映像来设置CPU运行的状态;本发明提出了一个新颖的设计方法来支持CPU硬件调试。为对本发明做更好的说明,本说明书将对CPU的调试系统做一个简短的介绍,并以它作为本发明的解析。但本发明对各种CPU具有通用性。图1显示了一个简化的调试系统结构框图。一个调试系统大致由高层调试工具单元33、调试主机单元34、协议转换器35、调试接口与调试逻辑单元17和待调试CPU单元1组成。单元33是调试系统与用户的接口,主要用于发出高层的调试命令;单元34是运行调试工具33的计算机,单元34允许发出单元33给出的高级调试命令,提供给底层的协议转换器;单元35是用于将单元34发出的高层命令转换为JTAG接口协议;下面对高层调试命令的执行过程做一个简短的介绍。其步骤可大致分为1)单元33发出高层调试指令,如设置断点、进行指令跟踪、检查通用寄存器组内容等命令交给单元34。
2)单元34将单元33发出的高层命令送到端口上。
3)单元35将单元34发出的指令转换到JTAG协议,通过目标调试系统的JTAG接口将单元34发出的高层命令串行地送入目标调试系统的相关寄存器中。
4)单元1根据单元35发出的命令,执行相关的指令或者命令,从而完成一条高层调试命令的执行。
在目标调试系统中,为了让调试主机能够通过JTAG接口访问到单元1的运行结果并且能够控制单元1的运行状态,通常的做法是将扫描链安插在需要观察的数据通道周围,使得调试主机的命令可以通过JTAG接口串行地输入到这些特殊数据通道,并且可以通过JTAG接口将数据通道的内容串行地送入调试主机。这种做法需要将扫描链单元放置在CPU的关键路径上,从而延长了关键路径的时延,限制了CPU性能的提高。
映像寄存器组在本发明中定义为能够给调试主机提供一些重要的CPU信息的,但不会对程序正常运行造成映像的一组寄存器。映像寄存器组的使用是本发明的关键。本发明的具体实施例可以参见图2、图3a、图3b。本发明所需要的逻辑单元包括方框19和部分方框36的逻辑,参见图2和图3a。它包括1)一组CPU特殊寄存器的映像寄存器19,包括指令寄存器映像单元20、调试控制/状态寄存器映像单元21、CPU状态寄存器映像单元22、PC寄存器映像单元23、操作数寄存器映像单元24;2)一个地址选择器单元8;3)一个指令选择器单元28;4)一个与门单元37。
为了讨论方便,将图2细分为图3-a和图3-b如图3-a所示,为了不增加额外的硬件开销来取得下一条指令代码,本发明通过在进入调试模式时,由调试模块直接访问并控制指令提取单元的方法来取得下一条指令代码,如图4所示,其实现的步骤可概括为1)执行单元响应调试模块的调试请求,并清空指令退出FIFO中的指令;2)执行单元将指令退出FIFO最后一个入口中保存的下一条指令的PC拷贝到调试模块中的PC寄存器影响中;同时CPU将进入调试模式时的CPU状态拷贝到调试模块中的CPU状态寄存器映像;3)调试模块将下一条指令PC送给指令提取单元,由其中的内存保护单元确定访问该地址时候允许,并且确定假如访问允许,该地址是否可缓冲;4)如果不允许访问该地址,将访问指令存储区的异常写入调试控制/异常状态寄存器;5)如果允许访问,并且该地址可缓冲,从指令高速缓存中提取指令,否则,从主存中提取指令。
其具体的硬件操作过程如下由调试模块单元17发起调试请求,单元3在接受到调试请求之后,完成单元16中最后一条指令的执行,将单元16的FIFO其他入口的指令清空,同时响应调试请求,进入调试模式。当单元17收到单元16的调试响应之后,由单元3将下一条指令的地址保存到单元23;单元23收到下一条指令的PC之后,将该PC发送给单元36,同时发出要求访问指令高速缓存或者主存的要求。
单元10会对根据当时CPU的状态,判断单元23地址的内容是否不可缓冲,而且判断访问单元23的地址是否会产生访问拒绝异常。如果该地址属于被保护地址范围之内,访问该地址可能会产生异常,在这种情况下,单元36将该异常写入单元21中,同时,单元20中保存的指令映像不是下一条指令代码。调试主机可以通过分析单元21中的内容得知单元20中的值是否是合法的,发生这种情况时,如果调试主机需要知道下一条指令的代码,需要由调试主机设置相关的CPU状态,同时,需要再将下一条指令的PC发射给单元36以取得下一条指令代码。
如果访问该地址不会产生异常,单元10将判断该地址的内容是否可缓冲如果该地址的内容是可以缓冲的,那么该地址对应的指令一定在单元13中,可以直接将该指令送给单元20;如果该地址的内容是不可缓冲的,那么该地址对应的指令不在单元13中,需要由单元36从单元7中取得,将该指令送给单元20。所以,信号12将控制单元15选择哪个指令送给单元20和单元2。
本发明允许CPU不退出调试模式执行指令,此时,调试主机通过指令寄存器映像设置将要执行的指令,如图5所示,这种方法的步骤可概括为1)调试主机通过JTAG接口设置相关的映像寄存器;2)调试主机发出不退出调试模式执行指令的命令;3)调试模块将调试主机设置的指令发送给指令译码单元;4)指令执行单元根据调试模块中的调试控制/异常状态寄存器来确定使用操作数寄存器映像还是寄存器文件作为源操作数;5)执行单元完成指令的执行,同时使CPU保持在调试模式下,等待调试主机发出下一条命令;6)执行单元根据调试模块中的调试控制/异常状态寄存器来确定时候将指令执行结果发送给操作数寄存器映像;7)调试模块根据调试主机的命令串行输出相应的寄存器使得调试主机能够观察到CPU的状态。
其具体的硬件操作过程如下调试系统允许CPU不退出调试模式执行指令,这种方式被用于读取CPU的状态,设置CPU运行的状态,或者设置调试模块的一些参数,如跟踪指令的条数、设置断点地址等。当CPU不退出调试模式执行指令时,需要执行的指令由调试主机给出,该指令只允许在调试模式下面执行,由于将单元23的地址送给单元36提取下一条指令代码时,CPU也已经处于调试模式状态下,需要产生逻辑区分这种状态,单元37产生控制单元28选择哪个指令送给单元2,信号29用于指示CPU正处于调试模式的状态,信号30用于指示CPU进入调试模式时,单元36正在提取单元23地址的指令。所以经过单元37之后,只有在调试模式下,并且单元36不在提取单元23地址的指令时,才执行单元20的指令。
如图3-b所示,CPU不退出调试模式执行指令时,信号26将控制将单元24作为源操作数寄存器还是目标操作数寄存器。信号26置位时,CPU不退出调试模式执行调试主机给出的下一条指令的过程中,将单元24作为单元3的一个源操作数。调试系统通过单元24可以进行设置CPU控制寄存器组的状态、设置CPU通用寄存器组的状态、设置存储器的内容等操作。信号26清除时,CPU不退出调试模式执行调试主机给出的下一条指令的过程中,将单元24作为单元3的目标操作数的映像,单元3将指令执行的结果回写到单元5的同时写入单元24。调试系统可以通过单元24进行读取CPU的状态、读取存储器的内容等操作。
当CPU需要退出调试模式执行程序时,调试主机可以通过单元22设置CPU的状态寄存器,同时,调试主机需要通过单元23设置退出调试模式之后,程序执行的起始地址。
综上所述,采用本发明的设计方法,在调试模块中引入特殊数据通道的映像寄存器组,对于CPU的运行是“非侵入”的;从上述的描述可以看出,安插的映像寄存器组都不在CPU的关键路径上,不会限制CPU性能的提高;同时,该实现方案具有很强的可伸缩性,当CPU微结构复杂度增加之后,只需要扩展相应的待观察的寄存器与相关的逻辑。
权利要求
1.一种设计在CPU里的利用映像寄存器组支持“非侵入性”调试的方法,其特征在于,它的步骤如下1)当CPU进入调试模式的时候,执行单元从指令发射FIFO中提取下一条指令的PC,送入PC寄存器映像;控制寄存器组直接将系统状态寄存器的内容送入CPU状态寄存器映像中;2)当CPU进入调试模式时,调试模块负责发起提取下一条指令,调试控制/状态寄存器将保存访问数据存储区发生的异常;3)当CPU处于调试模式时,允许CPU不退出调试模式通过指令寄存器映像执行调试主机给出的指令,将由调试控制/状态寄存器控制操作数寄存器映像设置为指令的源操作数或者目标操作数;4)当CPU退出调试模式时,通过设置PC寄存器映像来设置指令执行的起始地址,通过CPU状态寄存器映像设置程序运行的状态。
2.根据权利要求1所述的一种设计在CPU里的支持“非侵入性”调试的方法,其特征在于所说的调试模块提取下一条指令代码是由调试模块接管指令高速缓存(I-Cache)和主存,根据进入调试模式时的下一条指令的PC取得下一条指令代码。
3.根据权利要求2所述的一种设计在CPU里的支持“非侵入性”调试的方法,其特征在于所说的根据进入调试模式时的下一条指令的PC取得下一条指令代码是将下一条指令的地址送给指令提取单元,由内存保护单元确定该位于地址的指令是否可缓冲,如果该地址的指令可缓冲,则由指令提取单元从指令高速缓存中提取该指令,然后将该指令存于调试模块的指令映像寄存器中
4.根据权利要求2所述的一种设计在CPU里的支持“非侵入性”调试的方法,其特征在于所说的根据进入调试模式时的下一条指令的PC取得下一条指令代码是将下一条指令的地址送给指令提取单元,由内存保护单元确定该位于地址的指令是否可缓冲,如果该地址的指令不可缓冲,则由指令提取单元从主存中提取该指令,然后将该指令存于调试模块的指令映像寄存器中
5.根据权利要求2所述的一种设计在CPU里的支持“非侵入性”调试的方法,其特征在于所说的根据进入调试模式时的下一条指令的PC取得下一条指令代码是将下一条指令的地址送给指令提取单元,由内存保护单元确定是否允许指令提取单元该访问地址,如果该地址的指令不允许访问,内存保护单元产生访问异常,存于调试模块中的调试控制/状态寄存器中,调试主机若观察到该信号,表明存于指令映像寄存器中的指令码不是正确的进入调试模式的下一条指令。
6.根据权利要求1所述的一种设计在CPU里的支持“非侵入性”调试的方法,其特征在于所说的将调试控制/状态寄存器设置为指令的源操作数或者目标操作数是当调试模块中的调试控制/状态寄存器中的控制位置位时,将操作数寄存器映像作为源操作数,此时CPU不在从寄存器文件中读取源操作数。
7.根据权利要求1所述的一种设计在CPU里的支持“非侵入性”调试的方法,其特征在于所说的由调试控制/状态寄存器控制操作数寄存器映像设置为指令的源操作数或者目标操作数是当调试模块中的调试控制/状态寄存器中的控制位清除时,将操作数寄存器映像作为指令执行的目标操作数,此时指令执行结束,将执行结果写回的同时,拷贝指令的执行结果到操作数寄存器映像
8.根据权利要求1所述的一种设计在CPU里的支持“非侵入性”调试的方法,其特征在于所说的允许CPU不退出调试模式执行指令是调试主机将需要执行的指令通过指令映像寄存器送给CPU执行,CPU执行完给定的指令之后,不再执行其他指令,等待调试主机的下一个命令。
9.根据权利要求8所述的一种设计在CPU里的支持“非侵入性”调试的方法,其特征在于所说的指令通过指令映像寄存器送给CPU执行,如果访问数据存储区出现异常时,将访问异常写入调试模块中的调试控制/状态寄存器中,表明访问数据存储区未成功。
全文摘要
本发明公开了一种设计在CPU里的利用映像寄存器组支持“非侵入性”硬件调试的方法。它是应用于嵌入式系统中支持“非侵入性”调试的一种设计方法。对于嵌入式系统的开发和调试具有重要的意义。这个设计的主要特点在于引入映像寄存器,来跟踪CPU的状态,或者通过映像寄存器,来设置CPU的状态。由于使用该映像寄存器不需要在CPU的内部电路中插入额外的扫描单元,不会对CPU的性能造成影响,同时,这种设计方法还具有很强的可伸展性,当CPU微结构复杂程度提高之后,如果需要观察响应的CPU内部状态,不会增加额外的硬件设计和软件设计的难度。
文档编号G06F9/00GK1472640SQ0311652
公开日2004年2月4日 申请日期2003年4月17日 优先权日2003年4月17日
发明者陈必龙, 王界兵, 严晓浪 申请人:杭州中天微系统有限公司