在一些设备中嵌有处理器的计算电路设计摆出难于测试、仿真以及调试的问题。这种嵌入式系统典型情况下没有用于与编程者、汇编器或可写程序存储器相对接的设施。因此测试和开发工程师通常不能直接访问所设计的目标系统。
引入电路内仿真(In-circuit emulation ICE)来解决此难题。主机程序开发系统在脐带电缆(umbilical cable)末端装备有特殊的处理器。为此,个人计算机(PC)可以装备有适配器插座(pod)。然后把这种电缆插入目标嵌入式系统的处理器插槽中。然后ICE开发系统的输入/输出(I/O)、存储器、汇编器、编译器和图形用户接口都可以由工程师来使用,使得可以在实际目标硬件中测试程序。目标系统中的所有I/O、程序存储器、数据存储器、CPU寄存器和外围设备都可由主机开发系统访问并修改。
因此ICE的重要资源是目标访问,特别是检查并改变寄存器和存储器内容的能力。断点允许当出现确定事件时使程序执行停止,并且是另一重要的调试资源。能够在所定义的位置和情况下停止程序执行能够完全分析程序怎样进行、进行到哪以及它怎样影响目标系统。仿真器还可以使用断点来实现单步操作,其使工程师能够一次一条指令地执行目标程序。
ICE开发系统及其支持设备和软件是昂贵的。它们还高度专门化到在每个目标嵌入式系统中所使用的特定处理器,并且必须为每种类型,购买适配器和特殊软件。另外,需要专用的芯片级逻辑来对接到外部仿真器。通常它,是由仿真器公司或嵌入式微处理器的供应商所提供的IP。这种额外费用增加到IC开发费用预算中。
可以使用仿真器来控制并测试计算机电路板、它们的处理器、存储器或总线接口。一旦受到控制,那么仿真器就加载并运行诊断测试以便调试目标硬件和软件。密集装配的板上的测试接入对处理器仿真器来说并不是问题,不过真正的处理器必须配有插槽以便允许替换。在板开发中广泛地使用仿真器,但是现在提高的处理器速度使它们是不切实际的。
ROM存储器仿真器插入插槽中以便代替引导ROM,并且插入用于处理器正常引导代码的诊断程序代码。这种插槽接口是双向的,使得被测部件(unit-under-test UUT)可以与测试器通信。但是为了引导ROM区,ROM仿真器不能诊断处理器。如果ROM是被焊接的,那么需要修改产品设计电路。
总线仿真器可以被连接到总线槽或边缘连接器,这样就能够经由读取/写入总线周期来测试接入UUT的各个电路和功能了。对于测试诸如VME和PCI之类的插入式总线卡,它们是很有用的。
总线仿真器可以被连接到总线槽或边缘连接器,这样就能够经由读取/写入总线周期来测试接入UUT的各个电路和功能了。对于测试诸如VME和PCI之类的插入式的总线卡,它们是很有用的。
联合测试行动小组(JTAG)接口最初被设计成用于克服在小型化组件上的测试接入问题。所定义的串行接口被称为测试接入端口(TAP)。它使用五个数据和时间引脚来访问内置于每个组件的I/O引脚中的菊花链式(daisy-chained)的移位寄存器。这样就能够为寻找错误而对一连串适应JTAG的组件进行“边界扫描”。
JTAG协议已经被微处理器和数字信号处理器(DSP)制造商扩展,以便为硬件和软件开发者提供板载调试设施。这种帮助克服了由外部仿真器所遭遇的典型30MHz速度屏障。销售商对JTAG的特定扩展典型情况下具有2-3个附加信号线路以及以及用于控制处理器核心的增强指令集。具有可买到的调试接口的CPU包括IntelPentium处理器、Intel XScaleTM微体系结构处理器、MotorolaTM、IBM、PowerPCTM、AMD、MIPS和ARM处理器系列。IEEE还公布了用于调试接口的IEEE ISTO-5001。
调试接口已经具有各种商标名称,例如Motorola的后台调试模式(background debug mode BDM)、AMD的硬件调试工具(hardwaredebug tool HDT)以及Motorola/IBM的共用片上处理器(common on-chip processor COP)。BDM接口类似于JTAG,但是信号线路和协议不同。
这种接口最初是为设计工程师而开发出来的,但是也可以实现功能测试解决方案。设计成使用处理器的调试接口的测试和诊断装备在UUT上只需要大约六个到十个测试点。这种访问在大部分板设计中都可以被实现,实现方式是在CPU116和插槽之间放置内插器,当焊接CPU时使用非常简单的钉床(bed of nail),或者充分利用由一些板制造商所提供的JTAG取出头。
任何总线体系结构UUT可以被分成诸如桥、RAM、视频控制器和I/O控制器之类的功能块。每个功能块包含存储器或I/O寄存器阵列。测试程序使用由处理器制造商所提供的扩展JTAG调试功能来顺序地访问这些寄存器,建立完全测试。
低级功能包括停止/开始处理器、读取/写入存储器、读取/写入通用寄存器、读取/写入I/O、断点、单步代码和代码痕迹。这些功能的组合适应把测试代码下载到UUT,控制并监视测试代码执行,并且从UUT存储器收集测试结果。
例如,读取/写入功能可以测试RAM,所述RAM也检验中间总线。I/O控制器这样被测试,通过把输出向回循环到输入(这和在网络接口控制器的情况一样),或者利用附于板的连接器的外部设备产生/测量信号。一些测试系统包括I/O仿真部件,这样就不需要附着真正的外围设备了。
如果目标设备CPU不是同步类型的,那么会遇到费用更高和复杂性更大的问题。需要专门的接口来处理异步时钟的嵌入式处理器。
所有这种成本联合起来就会使目标系统的生产成本太过昂贵。制造成本可能攀升得如此之高以致几乎不可能产品会以获得合理利润所需要的价格点取得成功。
所需要的就是:用于调试异步嵌入式处理器的专门嵌入式体系结构,其可以不依靠外部销售商的IP或硬件来降低仿真和测试的成本。
图1图示了本发明的仿真系统实施例,并且这里由通用附图标记100来指代。仿真系统100包括经由标准化5引脚的JTAG接口106连接到目标设备104的普通个人计算机(PC)102。(1)TCK/时钟引脚使内部状态机操作同步。(2)在TCK的上升沿采样TMS/模式选择引脚以便确定下一状态。(3)在TCK的上升沿采样TDI/数据输入引脚并且当内部状态机处于正确状态时将其移入到目标设备104的测试或程序设计逻辑中。(4)TDO/数据输出引脚表示从目标设备104的测试或程序设计逻辑移出的数据并且当内部状态机处于正确状态时在TCK的下降沿上有效。并且(5)TRST/复位引脚当被驱动为低时复位内部状态机。
在PC102上所包括并操作的软件工具能够经由仿真硬件接口来控制目标设备的仿真行为。调试软件定义了用于对接仿真器软件环境的各个功能以致于使它可以与目标设备相交互。例如:读取/写入RAM(DATA,IDATA,XDATA);读取/写入特定功能寄存器(specialfunction register SFR);读取/写入程序代码;初始化、重新初始化、复位/停止目标硬件;读取/写入程序计数器;获取/设置寄存器;STOP、单步操作(single STEP)和RUN目标执行;以及设置/清除断点。
目标设备104是单片集成电路(IC)并且包括被连接到仿真接口110的JTAG测试接入端口(TAP)控制器108。可以用来自仿真接口的调试代码和寄存器信息来代替来自代码存储器112的程序代码。经由JTAG TAP106和TAP控制器108从PC102下载这种调试代码及其它控制信息。数据存储器114经由专用总线连接到异步微控制器(CPU)116。例如,CPU116可以是Intel类型的80C51微型计算机。
仿真接口110包括JTAG接口118、配置(EMU_CFG)寄存器120、仿真数据寄存器(EMU_DR)122、断点(EMU_BP)寄存器124、指令寄存器(EMU_IR)126、程序计数器(EMU_PC)寄存器128和仿真(EMU)控制器130,以及用于在仿真代码或来自代码存储器112的正常程序代码之间切换的总线多路复用器132。EMU_IR126包含在处于EMU外部模式时要由CPU116执行的8位指令。当出现停止(STOP)或断点时,EMU_PC寄存器128存储代码地址的当前18位值。它由仿真器使用来通过强迫跳到程序计数器地址来恢复系统。EMU断点寄存器124存储两个18位指令地址,操作者想要微控制器116在此地址中断执行并停止。
EMU_DR122规定由PC102对存储器112和114中的8位数据的外部检查。在EMU外部模式中,命令异步微控制器116把数据从存储器和内部寄存器移动到EMU_DR寄存器122中。然后,可以通过JTAG接口118读出EMU_DR122。
表I定义了在EMU_CFG寄存器120中所使用的九个位。
表-I
Bit |
符号 |
描述 |
EMU_CFG.9 |
Stop_V |
由仿真接口110设置为″1″用以表明当前指令完成并且来自仿真PC102的Stop命令已经被接受。该设备将进入冻结模式。当离开冻结模式时由仿真接口110复位。 |
EMU_CFG.8 |
DR_V |
当CPU116已经完成一个到DR中的写操作时由仿真接口110设置为″1″。由JTAG设置为″0″。 |
EMU_CFG.7 |
BP2_V |
由仿真接口110设置为″1″用以表明命中当前代码地址和BP2寄存器(124的子集)的命中。 |
EMU_CFG.6 |
BP1_V |
由仿真接口110设置为″1″用以表明命中当前代码地址和BP1寄存器(124的子集)的命中。 |
EMU_CFG.5 |
DIR |
定义指令来源。如果为″0″,那么指令来自内部存储器。如果为″1″,那么指令来自EMU_IR。 |
EMU_CFG.4 |
IE |
在进入EMU冻结模式之前包含CPU的中断启用位的值。在进入EMU内部模式之前把此值恢复到中断控制器寄存器中。 |
EMU_CFG.3 |
STEP |
在其上升沿,强迫CPU116执行一条指令并且重新进入EMU冻结模式。其在所述指令末尾由HW复位。 |
EMU_CFG.2 |
Stop |
在其上升沿,在当前指令末尾停止CPU116并且进入EMU冻结模式。必须由JTAG复位。 |
EMU_CFG.1 |
ON |
如果为″1″,那么存储器访问仲裁器会在提供由CPU116所请求的指令之前检测DIR位值。如果为″0″,那么存储器管理总是从内部存储器取出。 |
EMU_CFG.0 |
NRST |
在其下降沿,除仿真接口110和JTAG之外,芯片会进入复位状态。在其上升沿,正常系统控制部件将启动复位延迟计数器。 |
包括一种高效的硬件算法,用于经由JTAG-TAP标准接口106利用在PC102上所运行的外部调试软件来控制CPU116。这种体系结构实现了仿真增强系统的所有优点,而不会使CPU116的性能降级。它体现了在就面积和设计时间而言的最低成本之间的平衡。这种方法也很适合用于具有独立的指令和数据地址空间的异步微处理器应用(例如Harvard体系结构)。当目标微处理器是存储器系统总线主控制器时,它还可以应用于其中数据和指令共享一个地址空间的系统,如在冯诺依曼体系结构中。
图2表示仿真接口模式过程,并且这里由通用附图标记200来指代。所述仿真可以由PC102来控制,EMU CFG寄存器120中的各个位可由PC102写入并读取,并且由过程200来检查并部分修改。表I提供了以下在描述过程200中所使用的程序位符号。
过程200从新的程序指令请求开始,例如由CPU116经由指令开始信号和代码地址总线开始。步骤202进行检查以查看EMU_ON标志(EMU_CFG.1)是否被设置,意味着仿真模式开启。如果是的话,那么步骤204检查DIR&Start_instr标志(EMU_CFG.5)。如果为真的话,那么步骤206把代码地址(代_add)拷贝到EMU_PC寄存器128中,实际上为用于CPU116的无条件程序跳转。步骤208保存CPU的中断启用位。步骤210禁止CPU中断和监视计时器(watch dog timerWDT)。步骤212设置IR_V=“0”。步骤214循环直到IR_V变为真。步骤216向CPU116发送指令寄存器EMU_IR以便执行继而循环返回到步骤202。
如果步骤202导致EMU_ON为假,那么步骤218允许正常程序指令从代码存储器112顶部经由多路复用器132路由到CPU116以便正常执行。换句话说,CPU116的每个指令周期都进行仿真模式测试。与此相关的开销就传播时间而言可以非常小,原因在于实行仿真指令的决定可以用硬件来实现。
如果步骤204发现DIR&Start_instr标志不为真,那么步骤220恢复IEN.7并且禁止WDT。步骤222查看是否要求单步操作(STEP)(EMU_CFG.3)。如果是的话,那么步骤224向CPU116发送下一指令。方向被设置为假并且步骤被设置为真,例如DIR=0(EMU_CFG.8)并且STEP=0(EMU_CFG.3)。控制返回到步骤202。
如果步骤222是假,例如STEP=0,那么步骤228检查断点匹配,例如第一断点BP1(EMU_CFG.6)和第二断点BP2(EMU_CFG.7)。如果断点匹配,那么步骤230把方向设置为真(EMU_CFG.8),并且断点值被设置为真,例如DIR=1并且BPV=1。控制返回到步骤202。
如果步骤228为假,例如没有断点,那么步骤232检查停止和开始指令(EMU_CFG.9)。如果是的话,那么步骤236把方向设置为真,并且停止值被设置为真,例如DIR=1并且STOPV=1。如果不是的话,那么在步骤234向CPU116发送一个字节。控制返回到步骤202。
本发明的实施例认识到当不需要实时调试时,可以减少专用于仿真的IC焊盘的数目,并且那些焊盘可以使用廉价的串行接口。为了测试目的,标准的JTAG测试接入端口已经存在于许多现代IC设备中,并且典型情况下就硅面积、封装、设计而言不会向当前设计增加进一步的成本。在PC102上所运行的软件可以经由JTAG接口控制仿真接口中的寄存器,所述寄存器位由硬件用来控制与CPU116的各个交互。
当有必要初始化或结束硬件目标时,由PC102上的软件工具调用初始化(INIT)、重新初始化(RE-INIT)和目标复位功能。这种例程包括PC到JTAG接口的任何初始化,以及仿真接口110的配置寄存器的初始化。EMU_reset命令向EMU_CFG.NRST位写入“0”。这强迫复位除JTAG控制器108和仿真接口110之外的整个芯片。在向EMU_CFG.NRST位重新写入“1”之前,在EMU复位之后必须设置各个其它位以便控制CPU116。例如,EMU_CFG.EMU_ON=1用于使EMU_HW能够控制代码总线,并且EMU_CFG.DIR=1用于设置源于JTAG的代码。
包括RUN、STOP和STEP仿真控制。当复位标志(NRST)被再次写入“1”并且完成内部芯片复位序列时,就立即进入EMU冻结模式,CPU116会试图再次启动。但是发现EMU ON并且DIR位等于“1”,仿真接口110会在指令地址0x0000冻结CPU116,只是在取出阶段期间,进入EMU冻结模式。在此阶段中,可以重新配置仿真接口110的寄存器,定义断点地址或外部指令。也可以在已经执行当前指令之后修改指令的方向。由仿真接口110为每个当前操作读取DIR位,并且只在下一新的指令开始时再次处理所述DIR位。
当PC102上的仿真软件让CPU116执行并且向EMU_CFG.IR_V位写入“1”时进入EMU外部模式。这将使被传递到CPU116的指令寄存器126的内容有效以便被执行(EMU内部模式)。
在由CPU116所请求的每条新指令开始时,仿真接口110会检查EMU_CFG寄存器120中的EMU-ON和DIR位。如果DIR位仍然是一,那么仿真接口110会自动地复位DR_V位以便使指令寄存器无效并且进入EMU冻结模式。
利用此握手机制,外部仿真器可以使其操作与目标设备104内的事件同步。轮询IR_V位直到它变为“0”,如在步骤212,仿真PC102会知道CPU116何时被冻结。把IR_V设置为“1”会使CPU116经由EMU_IR寄存器126具有当前指令。
为了防止在EMU外部模式期间进入中断状态,仿真接口110暂时地禁止所有中断,并且复位相关联的中断控制器中的全局中断启用位。类似地,当CPU116处于仿真模式中时,使任何监视计时器停止活动。
全局中断启用位的原始值被保存到EMU CFG.IE位中并且每当进入EMU内部模式时被恢复到中断控制器中。
对于EMU内部模式来说,如果在新的指令开始时DIR位是“0”,那么目标设备104会根据EMU CFG.STEP位的值而进入EMU内部步进模式或EMU内部标准模式。
在EMU内部步进模式中,从内部存储器只向CPU116提供一个完整指令。仿真接口110然后把代码地址总线值拷贝到EMU-PC寄存器中,为下一周期把DIR位设置为“1”,把全局中断启用位拷贝到EMU CFG.IE中并且把STEP位复位为0。
在第二种情况中,EMU内部标准模式,执行会从内部存储器全速运行直到接收了STOP命令。这通过向EMU CFG.STOP写入“1”或直到遇到断点来实现。然后,仿真接口110把代码地址总线值拷贝到EMU-PC寄存器中,为下一周期把DIR位设置为“1”,把全局中断启用位拷贝到EMU_CFG中,并且把EMU V.STOP V(停止有效位)设置为“1”,或者把EMU V.BP1 V/BP2 V(断点有效位)设置为“1”。
PC102上的仿真软件工具优选只经由CPU116间接读取/写入访问到所有数据/代码存储空间中。由于CPU116是异步的,并且存储器的多路复用访问可能会减慢过程执行,所以不希望仿真接口110直接访问代码和数据存储器112和114。当CPU116处于仿真状态时可以经由仿真接口执行任意的代码。访问任何种类的嵌入式存储器(RAM、闪速和寄存器)通过运行例程以便把存储内容移动到可从JTAG访问的仿真硬件寄存器中,来使用CPU116进行数据往复。
尽管已经描述并图示了本发明的特定实施例,然而这并不意在限制本发明。对那些本领域技术人员来说,修改和改变无疑是显而易见的,并且旨在只由所附权利要求的范围来限定本发明。