一种在ICE中实现CallStack功能的方法与流程

文档序号:13207444阅读:265来源:国知局
一种在ICE中实现Call Stack功能的方法与流程

本发明属于在线仿真器的技术领域,特别涉及用于增加芯片仿真器callstack功能的方法。



背景技术:

芯片内核的堆栈会在函数调用退出,中断进入退出等情况下发生变化。用户在使用ice开发调试芯片应用程序的过程中,如果ice能够记录堆栈的变化情况,并且向pc上位机用户返回堆栈发生变化时候的pc,ir,woek,status等内核的关键寄存器的话,用户就可以通过上位机的callstack窗口查看到芯片内核的运行状态,从而定位追踪到程序中异常的函数调用,中断调用等导致芯片堆栈溢出的问题。

例如专利申请201611020255.x公开了一种一种ice自动化测试系统及测试方法,所述测试系统包含上位机和下位机两大部分,所述上位机使用脚本作为测试系统的中央控制台,所述下位机包含:dut和tb测试板;所述上位机和下位机通过api接口进行通信。本发明所实现的自动化测试系统和测试方法,能实现所有ice支持型号的数字功能测试,减少测试人力的投入,很大程度上减少了手动操作,大大缩短了测试流程。并且自动化输出测试日志,方便测试人员快速发现问题,进而修复芯片设计。

然而该专利申请并没有芯片仿真器的callstack功能,无法实现对用户程序调用函数,无法实现下位机对cpu堆栈的监控。



技术实现要素:

基于此,因此本发明的首要目地是提供一种在ice中实现callstack功能的方法,该方法能够通过callstack功能,记录程序运行过程中堆栈级数变化时候的pc值,实现下位机对cpu堆栈进行监控。

本发明的另一个目地在于提供一种在ice中实现callstack功能的方法,该方法能够从芯片底层内核出发,增加对内核的监控电路和上发堆栈数据给上位机的通信电路和通信协议的控制,结构清晰,效果良好,为用户开发芯片用户程序提供了一种可靠的保障手段。

为实现上述目的,本发明的技术方案为:

一种在ice中实现callstack功能的方法,其特征在于该方法芯片内核运行过程中,利用callstack控制模块对内核中的sp(堆栈级数寄存器)进行监控,当内核堆栈发生变化时,将pc(指令计数寄存器),work(工作寄存器),status(状态寄存器)等同步到fpga全局时钟后,同步映射到callstack控制模块中的内核信号堆栈中,该方法能够对内核的堆栈进行监控,同时不能影响内核的运行。

进一步,具体为:当内核圧栈时,同步圧栈;在内核出栈时,同步出栈;在这个过程中,callstack控制模块能记录堆栈级数,当堆栈溢出(含圧栈溢出和出栈溢出)时,停止内核信号堆栈的变化,并记录下溢出时候的pc,返回给上位机,供用户定位到堆栈溢出时候的代码处。

所述callstack控制模块包括有内核信号同步模块、内核信号堆栈模块及堆栈读取控制模块,所述内核信号同步模块连接于内核信号堆栈模块,内核信号堆栈模块连接于堆栈读取控制模块,堆栈读取控制模块,受仿真模块控制,负责间堆栈中的数据按照协议顺序通过仿真模块返回给上位机。

内核信号同步模块是将内核关键信号引出到内核信号同步模块后,对这些信号进行同步处理,包含以下过程:

(1)堆栈变化请求信号产生:

在fpga全局时钟fclk下,将内核堆栈级数寄存器sp打一拍产生sp_r,通过组合逻辑判断,即可产生push(圧栈)和pop(出栈)信号了。当sp变大的时候,圧栈情况发生,圧栈请求级数加一,依次从push1到pushn;当sp变小的时候,出栈情况发生,出栈请求级数减一,依次从popn到pop1。当sp级数已达栈顶的时候,只能出栈,如果继续圧栈,将产生圧栈溢出请求信号push_ovfl;当sp级数已达栈底的时候,只能压栈,如果继续出栈,将产生出栈溢出请求信号pop_ovfl。

(2)内核关键信号延迟:

在后续的圧栈处理模块中,将使用push1~pushn和pop1~popn请求对内核关键信号进行采样,于是,需要对内核中的pc,work,status(包含但不限于,其他用户认为有必要的内核信号都可以监控)等信号进行延迟保持处理,将相关信号在fclk时钟域下打两拍处理,经过这个处理,如果内核时钟与fpga全局时钟异步的话也可以被同步。

所述内核信号堆栈模块,第一级圧栈请求push1有效时,将pc、work、status圧栈第一级堆栈,依次类推,第一级圧栈请求pushn有效时,将pc、work、status圧栈第n级堆栈。

第n级出栈请求popn有效时,将pc、work、status从第n级堆栈取出,依次类推,第1级出栈请求pop1有效时,将pc、work、status从第1级堆栈取出。

圧栈自栈底至栈顶;出栈自栈顶至栈底。

增加堆栈溢出现场记录功能,当此时堆栈级数已到第一级栈底的时候,如果sp继续出栈,pop_ovfl请求有效,则将pc、work、status压入第n+1级堆栈,并且对整个堆栈进行保护,不再允许堆栈变化,以记录出栈溢出现场;当此时堆栈级数已到第n级栈顶的时候,如果sp继续压栈,push_ovfl请求有效,则将pc、work、status压入第n+2级堆栈,并且对整个堆栈进行保护,不再允许堆栈变化,以记录压栈溢出现场。

堆栈读取控制模块:为与ice原有通信协议协同,增加堆栈读取控制模块,该模块具体目的是完成对堆栈数据发送的顺序、位宽整理,和增加包头包尾等操作。

本发明能够在ice仿真过程中,实现下位机对cpu堆栈进行监控,记录程序运行过程中堆栈级数变化时候的pc值,并在单步、断点等停下来后,上发给上位机,通过上位机显示,用户可以快速定位call、return和中断等导致堆栈发生变化的代码处,从而能快速找到程序的异常跳转。

记录并报出堆栈溢出错误,包括push(圧栈)溢出和pop(出栈)溢出,向上位机返回堆栈溢出时候的pc,用户可以直接定位到堆栈溢出时候的代码处,迅速定位堆栈溢出错误,并且可按需求可以记录返回内核work,status和其他诸如中断控制,sram控制,flash控制,外设控制等各种关键的特殊功能寄存器在堆栈变化时候的数值,供用户掌握堆栈发生变化时芯片运行的环境现场,以定位用户调试过程中遇到的项疑难问题。

callstack功能相当于将ice全速运行的过程透明化,用户可以在断点(包括数据断点)停下时查看到程序运行的过程记录,快速判断程序的跳转是否符合预期,堆栈的变化是否异常,拓展了用户调试程序的手段,使得cpu的运行更加透明可追溯,程序跳转及中断过程更加明晰,对用户调试大型复杂程序意义重大。

附图说明

图1是本发明所实施的callstack总体架构框图。

图2是本发明所实施的堆栈变化请求信号产生框图。

图3是本发明所实施的内核关键信号同步实现电路的电路图。

图4是本发明所实施的堆栈结构图。

图5是本发明所实施的堆栈读取流程图。

图6是本发明所实施一种具体实现的堆栈结构图。

图7是图6所实现的callstack数据包结构图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

在ice中实现callstack功能的方法,其特征在于该方法芯片内核运行过程中,利用callstack控制模块对内核中的sp(堆栈级数寄存器)进行监控,当内核堆栈发生变化时,将pc(指令计数寄存器),work(工作寄存器),status(状态寄存器)等同步到fpga全局时钟后,同步映射到callstack控制模块中的内核信号堆栈中,该方法能够对内核的堆栈进行监控,同时不能影响内核的运行。

进一步,具体为:当内核圧栈时,同步圧栈;在内核出栈时,同步出栈;在这个过程中,callstack控制模块能记录堆栈级数,当堆栈溢出(含圧栈溢出和出栈溢出)时,停止内核信号堆栈的变化,并记录下溢出时候的pc,返回给上位机,供用户定位到堆栈溢出时候的代码处。

所述callstack控制模块包括有内核信号同步模块、内核信号堆栈模块及堆栈读取控制模块,所述内核信号同步模块连接于内核信号堆栈模块,内核信号堆栈模块连接于堆栈读取控制模块,堆栈读取控制模块,受仿真模块控制,负责间堆栈中的数据按照协议顺序通过仿真模块返回给上位机。

内核信号同步模块是将内核关键信号引出到内核信号同步模块后,对这些信号进行同步处理,如图2所示,包含以下过程:

(1)堆栈变化请求信号产生:

在fpga全局时钟fclk下,将内核堆栈级数寄存器sp打一拍产生sp_r,通过组合逻辑判断,即可产生push(圧栈)和pop(出栈)信号了。当sp变大的时候,圧栈情况发生,圧栈请求级数加一,依次从push1到pushn;当sp变小的时候,出栈情况发生,出栈请求级数减一,依次从popn到pop1。当sp级数已达栈顶的时候,只能出栈,如果继续圧栈,将产生圧栈溢出请求信号push_ovfl;当sp级数已达栈底的时候,只能压栈,如果继续出栈,将产生出栈溢出请求信号pop_ovfl。

(2)内核关键信号延迟:

如图3所示,在后续的圧栈处理模块中,将使用push1~pushn和pop1~popn请求对内核关键信号进行采样,于是,需要对内核中的pc,work,status(包含但不限于,其他用户认为有必要的内核信号都可以监控)等信号进行延迟保持处理,将相关信号在fclk时钟域下打两拍处理,经过这个处理,如果内核时钟与fpga全局时钟异步的话也可以被同步。

内核信号堆栈模块,:

第一级圧栈请求push1有效时,将pc、work、status圧栈第一级堆栈,依次类推,第一级圧栈请求pushn有效时,将pc、work、status圧栈第n级堆栈。

第n级出栈请求popn有效时,将pc、work、status从第n级堆栈取出,依次类推,第1级出栈请求pop1有效时,将pc、work、status从第1级堆栈取出。

圧栈自栈底至栈顶;出栈自栈顶至栈底。

增加堆栈溢出现场记录功能,当此时堆栈级数已到第一级栈底的时候,如果sp继续出栈,pop_ovfl请求有效,则将pc、work、status压入第n+1级堆栈,并且对整个堆栈进行保护,不再允许堆栈变化,以记录出栈溢出现场;当此时堆栈级数已到第n级栈顶的时候,如果sp继续压栈,push_ovfl请求有效,则将pc、work、status压入第n+2级堆栈,并且对整个堆栈进行保护,不再允许堆栈变化,以记录压栈溢出现场;如图4所示。

堆栈读取控制模块:为与ice原有通信协议协同,增加堆栈读取控制模块,该模块具体目的是完成对堆栈数据发送的顺序、位宽整理,和增加包头包尾等操作。图5所示为堆栈读取的基本流程。

图6、图7所示,为本发明所具体实现的一种方式所采用的堆栈结构图和callstack数据包结构图。在本施例中,芯片内核的pc位宽为16bit,sp堆栈级数为8,通信单位为1byte(8bit)。

结合图6所示,为配合通信单位位宽,将pc分成高八位和低八位两部分进行圧栈。

在通信控制模块,先生成callstack数据包,如图7所示,通过ice原有通信路径上发给上位机。

其中,callstack数据包中:

1.整个数据包为256byte,未使用的作为保留位以供后续拓展使用,保留位数值为0xff。

2.堆栈对应级数无圧栈的,则pc高八位及低八位均为0xff。

3.堆栈无溢出,则第九级和第十级pc高八位及低八位均为0xff。

4.堆栈如果溢出了,则按照出栈溢出或者压栈溢出分别将溢出时候的pc压入第九级或第十级堆栈,并且对整个堆栈进行保护,不能再压栈出栈,记录溢出时候的堆栈现场。

5.上位机根据第九,十级堆栈的数据来判断堆栈是否溢出(这两级堆栈数据不全为0xff则说明堆栈溢出),通过弹窗打印信息,告诉用户堆栈溢出异常。

6.最后4byte依次发送0xa5,0x5a,0xba,0xff作为tracebuffer和callstack数据包标志。

因此,本发明能够在ice仿真过程中,实现下位机对cpu堆栈进行监控,记录程序运行过程中堆栈级数变化时候的pc值,并在单步、断点等停下来后,上发给上位机,通过上位机显示,用户可以快速定位call、return和中断等导致堆栈发生变化的代码处,从而能快速找到程序的异常跳转。

记录并报出堆栈溢出错误,包括push(圧栈)溢出和pop(出栈)溢出,向上位机返回堆栈溢出时候的pc,用户可以直接定位到堆栈溢出时候的代码处,迅速定位堆栈溢出错误,并且可按需求可以记录返回内核work,status和其他诸如中断控制,sram控制,flash控制,外设控制等各种关键的特殊功能寄存器在堆栈变化时候的数值,供用户掌握堆栈发生变化时芯片运行的环境现场,以定位用户调试过程中遇到的项疑难问题。

callstack功能相当于将ice全速运行的过程透明化,用户可以在断点(包括数据断点)停下时查看到程序运行的过程记录,快速判断程序的跳转是否符合预期,堆栈的变化是否异常,拓展了用户调试程序的手段,使得cpu的运行更加透明可追溯,程序跳转及中断过程更加明晰,对用户调试大型复杂程序意义重大。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

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