一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

跟踪电路、半导体装置、跟踪器及跟踪系统的制作方法

2022-06-01 15:13:29 来源:中国专利 TAG:


1.本说明书中公开的发明涉及一种跟踪电路。


背景技术:

2.对于包含执行程序操作的微处理器(例如cpu[中央处理单元])的lsi,人们常常希望从lsi外部跟踪程序操作,即,查看程序如何运行。
[0003]
其目的可能是多样的,可以是查找程序未能如意运行的原因,也可以是检查程序操作测试的代码覆盖率(检查测试是否覆盖整个代码)。
[0004]
为了满足这样的需求,有必要了解cpu是如何读取程序存储器中的指令代码的,即跟踪cpu内部的程序存储器中的读取地址。
[0005]
与上述讨论相关的现有技术的示例可见于下述专利文献1、2。
[0006]
现有技术文献
[0007]
专利文献
[0008]
专利文献1:日本授权专利第2727947号,说明书
[0009]
专利文献2:日本授权专利第3775462号,说明书


技术实现要素:

[0010]
发明要解决的课题
[0011]
令人不便的是,根据专利文献1,需要在lsi的内部设有跟踪存储装置(跟踪存储器),或者需要将所有地址总线输出到lsi的外部。
[0012]
根据专利文献2,当执行分支指令时,由于仅将部分相关信息输出到外部,因而导致需要在lsi的外部进行分支目的地地址的解析。未能从多个分支目的地地址的候选中挑出一个分支目的地址使得跟踪变得不可能。
[0013]
鉴于本发明人遇到的上述问题,本说明书中公开的发明的目的在于,提供一种可以从半导体装置的外部容易且完全地跟踪程序存储器中的读取地址的跟踪电路。
[0014]
用于解决课题的手段
[0015]
根据本说明书中公开的一方面,一种跟踪电路,其与包括m位程序计数器的微处理器一起集成在半导体装置中,并且被配置为向外部输出跟踪时钟以及n位跟踪数据(其中,2≤n≤m)。所述跟踪电路被配置为:当所述程序计数器保持不变时,与所述跟踪时钟同步地,所述跟踪电路将所述跟踪数据设置为第一输出值;当所述程序计数器被增量时,与所述跟踪时钟同步地,所述跟踪电路将所述跟踪数据设置为第二输出值;并且当所述程序计数器被加载时,与所述跟踪时钟同步地,所述跟踪电路将所述跟踪数据设置为第三输出值,然后暂停所述微处理器中的状态机并分割输出在所述程序计数器中加载的分支目的地地址或中断目的地地址作为所述跟踪数据(第一配置)。
[0016]
上述第一配置的跟踪电路可以包括:状态生成器,其被配置为生成状态信号,该状态信号在所述程序计数器保持不变时具有所述第一输出值,在所述程序计数器被增量时具
有所述第二输出值,并且在所述程序计数器被加载时具有所述第三输出值;计数器,其被配置为当所述状态信号变为所述第三输出值时开始动作,并且当所述分支目的地地址或所述中断目的地地址的分割输出期间到期时停止动作;以及选择器,其被配置为当所述计数器不在动作时将所述状态信号选择为所述跟踪数据,并且当所述计数器在动作时将所述分支目的地地址或所述中断目的地地址的一部分选择为所述跟踪数据(第二配置)。
[0017]
在上述第二配置的跟踪电路中,所述状态生成器可以被配置为通过监测所述微处理器中的内部控制信号来生成所述状态信号(第三配置)。
[0018]
在上述第一至第三配置中任一配置的跟踪电路中,所述跟踪时钟可以是所述微处理器的驱动时钟(第四配置)。
[0019]
根据本说明书中公开的另一方面,一种半导体装置,其中集成有:上述第一至第四配置中任一配置的跟踪电路;以及微处理器,其被配置为通过将所述程序计数器的输出值用作读取地址从程序存储器中读取指令代码,并解码和执行所述指令代码(第五配置)。
[0020]
在上述第五配置的半导体装置中,所述微处理器可以具有管线架构(第六配置)。
[0021]
根据本说明书中公开的又一方面,一种跟踪器,其外部连接到上述第五或第六配置的半导体装置,并且被配置为与所述跟踪时钟同步地监测所述跟踪数据以模拟所述程序计数器,从而输出所述读取地址的跟踪结果(第七配置)。
[0022]
上述第七配置的跟踪器可以包括:模拟程序计数器;解码器,其被配置为:当所述跟踪数据被设置为所述第一输出值时,保持所述模拟程序计数器不变;当所述跟踪数据被设置为所述第二输出值时,对所述模拟程序计数器进行增量;并且当所述跟踪数据被设置为所述第三输出值时,对所述模拟程序计数器依次加载随后分割输入的所述分支目的地地址或中断目的地地址;锁存器,其被配置为除了在所述分支目的地地址或所述中断目的地地址的分割输入期间外,与所述跟踪时钟同步地获取所述模拟程序计数器的输出值作为确定值;以及跟踪存储器,其被配置为存储所述锁存器依次获取的所述确定值作为所述跟踪结果(第八配置)。
[0023]
根据本说明书中公开的又一方面,一种跟踪系统,包括:上述第五或第六配置的半导体装置;上述第七或第八配置的跟踪器;以及主机,其被配置为显示、存储以及解析所述跟踪结果(第九配置)。
[0024]
根据本说明书中公开的再一方面,一种跟踪程序,其在计算机上执行以通过使所述计算机的输入部、显示部、存储部以及运算部作为所述跟踪结果的接收、显示、存储及解析装置动作来使所述计算机作为上述第九配置的跟踪系统中的所述主机发挥功能(第十配置)。
[0025]
发明的效果
[0026]
根据本说明书中公开的跟踪电路,可以容易且完全地从半导体装置的外部跟踪程序存储器上的读取地址。
附图说明
[0027]
图1是示出跟踪系统的整体配置的图。
[0028]
图2是示出lsi的一配置例的图。
[0029]
图3是示出跟踪动作(lsi)的一例的图。
[0030]
图4是示出跟踪器的一配置例的图。
[0031]
图5是示出跟踪动作(跟踪器)的一例的图。
[0032]
图6是示出跟踪动作(系统整体)的一例的图。
[0033]
图7是示出程序代码的一例的图。
[0034]
图8是示出分支目的地地址的分割输入动作的图。
[0035]
图9是示出程序代码的执行结果的图。
具体实施方式
[0036]
《跟踪系统》
[0037]
图1是示出跟踪系统的整体配置的图。该配置例的跟踪系统x包括lsi 100、跟踪器200、以及主机300。
[0038]
lsi 100是包含cpu 110的半导体装置的一例。为了从外部容易且完全地跟踪cpu 110的程序操作(即,程序存储器中的读取地址),lsi 100具备向外部输出一个跟踪时钟“trace_clk”以及与之同步的n位(例如,n=2)的跟踪数据“trace_data”的功能(稍后详细描述)。
[0039]
跟踪器200是外部连接到lsi 100的适配器(调试工具)的一例。跟踪器200通过与跟踪时钟“trace_clk”同步地监测跟踪数据“trace_data”并模拟cpu 110的内部的程序计数器,来获取上述读取地址的跟踪结果“trace_result”(即,跟踪读取地址的结果)并将其输出到主机300(稍后详细描述)。跟踪器200与主机300之间的通信可以通过usb(universal serial bus,通用串行总线)等适当地实现。
[0040]
主机300从跟踪器200接收跟踪结果“trace_result”,并对其进行显示、存储、解析或以其他方式处理。例如,在将个人计算机用作主机300的情况下,可以预先准备要在个人计算机上运行的跟踪程序310,并将个人计算机的相关部分,即输入部(比如,usb端口)、显示部(比如,lcd[液晶显示器])、存储部(比如,hdd[硬盘驱动器]或ssd[固态驱动器])以及运算部(比如,cpu和dsp[数字信号处理器])可以分别用作接收、显示、存储和解析跟踪结果“trace_result”的装置。
[0041]
优选跟踪器200和跟踪程序310与lsi 100一起提供。
[0042]
《lsi》
[0043]
图2是示出lsi 100的一配置例的图。该配置例的lsi 100集成有跟踪电路120以及上述cpu 110。
[0044]
cpu 110是与驱动时钟clk(例如,100mhz)同步地执行编程动作的微处理器的一例。lsi 100包括状态机111、解码/执行器112、增量器113、分支目的地地址存储器114、选择器115、程序计数器116(pc)、以及程序存储器117。
[0045]
状态机111是管理cpu 110的状态转换的3位时序电路(逻辑电路),并且可以采取最多八个动作状态中的一个(比如,fetch(取出)、wait_keep(等待保持)、trace(跟踪)、以及pre_fetch(预取出))。trace状态是随着跟踪电路120的实现而新引入的状态之一。如稍后详细描述,在跟踪电路120分割输出加载在程序计数器116中的分支目的地地址或中断目的地地址时,状态机111在trace状态下暂停。
[0046]
解码/执行器112通过将程序计数器116的输出值“pc_reg”用作读取地址从程序存
储器117读取指令代码,并解码和执行那些指令代码。
[0047]
增量器113以预定的增量值对程序计数器116的输出值“pc_reg”进行增量并输出结果。
[0048]
分支目的地地址存储器114在从解码/执行器112输出的分支目的地地址或中断目的地地址被加载至程序计数器116时对其进行保持。
[0049]
选择器115根据从解码器/器112输出的内部控制信号(例如,pc加载指令“pc_load”和pc增量指令“pc_inc”)选择性地将增量器113的输出或分支目的地地址存储器114的输出输出至程序计数器116。
[0050]
例如,当pc_inc=“h”(pc增量的逻辑电平)时,增量器113的输出被选择性地输出至程序计数器116。结果,在cpu 110具有管线架构的配置中,与指令代码的解码和执行同时地,程序计数器116被增量。或者,在cpu 110不具有管线架构的配置中,在指令代码的解码和执行之后,程序计数器116被增量。
[0051]
相比之下,当pc_load=“h”(pc加载的逻辑电平)时,分支目的地地址存储器114的输出被选择性地输出至程序计数器116。从而,例如,在中断指令nmi(不可屏蔽中断)和irq(中断请求)、跳转指令jmp(绝对或相对)、子程序调用指令call以及返回指令ret和reti中任一个的执行导致状态pc_load=“h”的情况下,分支目的地地址或中断目的地地址被加载到程序计数器116中。
[0052]
程序计数器116是与驱动时钟clk同步动作的m位(例如,m=16)寄存器。程序计数器116的输出值“pc_reg”被用作程序存储器117中的读取地址。
[0053]
程序存储器117是存储cpu 110的指令代码的装置。根据读取地址(pc_reg)读取的指令代码由上述解码/执行器112解码和执行。
[0054]
跟踪电路120是向外部输出给跟踪器200一个跟踪时钟“trace_clk”以及与之同步的n位跟踪数据“trace_data”(其中,2≤n≤m;例如,n=2)的新型功能块。跟踪电路120包括状态生成器121、计数器122以及选择器123。
[0055]
作为上述跟踪时钟“trace_clk”,可以原样使用cpu 110的驱动时钟clk。
[0056]
状态生成器121与跟踪时钟“trace_clk”同步动作,并且状态生成器121监测cpu 110的内部控制信号(例如,pc加载指令“pc_load”和pc增量指令“pc_inc”)并生成2位状态信号“status”。
[0057]
具体地,状态信号“status”在程序计数器116保持不变时(pc_load=“l”,并且pc_inc=“l”)具有第一输出值“0d(00b)”,在程序计数器116被增量时(pc_inc=“h”)具有第二输出值“1d(01b)”,并且在对程序计数器116进行加载时(pc_load=“h)具有第三输出值“2d(10b)”。至于状态信号“status”的第四输出值“3d(11b)”,可以保留为保留值(未使用值)。
[0058]
计数器122是4位脉冲计数器。当状态信号“status”变为第三输出值“2d(10b)”时,即,当对程序计数器116进行加载时(即,当地址被加载到程序计数器116中时),计数器122开始跟踪时钟“trace_clk”的脉冲计数动作(即,开始对其计数)。当计数值“trace_count”达到预定值(例如,8d(1000b),即,当分支目的地地址或中断目的地地址的分割输出期间(稍后详细描述)到期时,计数器122结束脉冲计数动作并将其计数值“trace_count”重置为零。
[0059]
选择器123根据计数器122的动作状态(根据计数值“trace_count”是否为零)来选
择状态信号“status”或程序计数器116的输出值“pc_reg”(其中最大n位),并将其输出为跟踪数据“trace_data”。
[0060]
具体地,在计数器122暂停,即不动作(trace_count=0)的情况下,输出状态信号“status”作为跟踪数据“trace_data”。相比之下,在计数器122动作(trace_count≠0)的情况下,依次输出程序计数器116的输出值“pc_reg”(即,分支目的地地址或中断目的地地址的一部分)作为跟踪数据“trace_data”。
[0061]
为了完整地输出分支目的地地址或中断目的地地址作为跟踪数据“trace_data”,优选地,在计数器122动作(trace_count≠0)的情况下,cpu 110中的状态机111保持在暂停状态(trace状态)。
[0062]
根据如上所述地配置的跟踪电路120,可以通过极其简单的电路配置实现以下动作:当程序计数器116保持不变时,与跟踪时钟“trace_clk”同步地,将跟踪数据“trace_data”设置为第一输出值“0d(00b)”;当程序计数器116被增量时,与跟踪时钟“trace_clk”同步地,将跟踪数据“trace_data”设置为第二输出值“1d(01b)”;并且当对程序计数器116进行加载时,与跟踪时钟“trace_clk”同步地,将跟踪数据“trace_data”设置为第三输出值“2d(10b)”,然后,暂停cpu 110中的状态机111之后,加载到程序计数器116中的分支目的地地址或中断目的地地址被分割输出为跟踪数据“trace_data”。对此,将参照流程图在下面进行详细描述。
[0063]
《跟踪动作(在lsi)》
[0064]
图3是示出lsi 100(尤其,跟踪电路120)中的跟踪动作的一例的流程图。当跟踪动作开始时,在步骤s11中,检查程序计数器116是否已被增量(是否pc_inc=“h”)。如果检查结果为“否”,则流程进入步骤s12;如果检查结果为“yes”,则流程进入步骤s14。
[0065]
当步骤s11的检查结果为“否”时,在步骤s12中检查程序计数器116是否发生变化(是否发生分支或中断;是否pc_load=“h”)。这里,如果检查结果为“否”,则流程进入步骤s13;如果检查结果为“是”,则流程进入步骤s15。
[0066]
当步骤s12的检查结果为“否”时,则需要通知跟踪器200程序计数器116保持没变。从而,在步骤s13中,跟踪数据“trace_data”被设置为第一输出值“0d(00b)”。然后,流程返回到步骤s11。
[0067]
相比之下,当步骤s11的检查结果为“是”时,则需要通知跟踪器200程序计数器116已被增量。从而,在步骤s14中,跟踪数据“trace_data”被设置为第二输出值“1d(01b)”。然后,流程返回到步骤s11。
[0068]
另一方面,当步骤s12的检查结果为“是”时,则需要通知跟踪器200程序计数器116已被加载。从而,在步骤s15中,跟踪数据“trace_data”被设置为第三输出值“2d(10b)”。
[0069]
进一步地,当程序计数器116已被加载时,需要通知跟踪器200分支目的地地址或中断目的地地址。从而,在随后的步骤s16至s18中,执行分支目的地地址或中断目的地地址的分割输出(即,地址被分割输出)。
[0070]
具体地,首先,在步骤s16中,计数器122以跟踪时钟“trace_clk”开始脉冲计数动作,并且cpu 110中的状态机111也进入暂停状态(trace状态)。
[0071]
接着,在步骤s17中,与跟踪时钟“trace_clk”同步地,分支目的地地址或中断目的地地址的一部分被分割输出为跟踪数据“trace_data”。
[0072]
接着,在步骤s18中,检查计数器122的计数值“trace_count”是否达到预定值,即,分割输出期间的计数是否结束。
[0073]
例如,在程序计数器116的输出值“pc_reg”(即,所述分支目的地地址或中断目的地地址)为16位宽,跟踪数据“trace_data”为2位宽的配置中,输出分支目的地地址或中断目的地地址的所有位值需要至少八个脉冲的跟踪时钟“trace_clk”。
[0074]
如果步骤s18的检查结果为“否”,则流程返回到步骤s17,并继续分支目的地地址或中断目的地地址的分割输出。相比之下,如果检查结果为“是”,则流程进入步骤s19。
[0075]
在步骤s19中,计数器122的计数值“trace_count”被重置为零,并且cpu 110中的状态机111从暂停状态(trace状态)恢复。然后,流程返回到步骤s11,并且重复上述一系列动作。
[0076]
《跟踪器》
[0077]
图4是示出跟踪器200的一配置例的图。该配置例的跟踪器200包括解码器201、增量器202、选择器203、模拟程序计数器204、锁存器205、以及跟踪存储器206。
[0078]
解码器201与跟踪时钟“trace_clk”同步地监测跟踪数据“trace_data”,并控制跟踪器200的各个块(例如选择器203和锁存器205)。
[0079]
具体地,当跟踪数据“trace_data”为第一输出值“0d(00b)”时,解码器201保持模拟程序计数器204不变;当跟踪数据“trace_data”为第二输出值时,解码器201对模拟程序计数器204进行增量;当跟踪数据“trace_data”为第三输出值“2d(10b)”时,解码器201以使随后分割输入的分支目的地地址或中断目的地地址被依次加载到模拟程序计数器204的方式控制选择器203。
[0080]
解码器201还基于跟踪数据“trace_data”的监测结果生成确定值获取指示信号“fetch_inst”,并控制是否通过锁存器205获取模拟程序计数器204的输出值“pc_count”作为模拟pc确定值“dump_pc”。
[0081]
增量器202以预定增量值对模拟程序计数器204的输出值“pc_count”进行增量并输出结果。
[0082]
选择器203选择性地向模拟程序计数器204输出增量器113的输出值或模拟程序计数器204的输出值“pc_count”。
[0083]
具体地,当跟踪数据“trace_data”为第一输出值“0d(00b)”时,模拟程序计数器204会保持不变,模拟程序计数器204的输出值“pc_count”被选择性地输出至模拟程序计数器204。也可以通过禁止模拟程序计数器204的取出操作来保持模拟程序计数器204不变。
[0084]
相比之下,当跟踪数据“trace_data”为第二输出值“1d(01b)”时,模拟程序计数器204会被增量,增量器113的输出值被选择性地输出至模拟程序计数器204。
[0085]
另一方面,当跟踪数据“trace_data”为第三输出值“2d(10b)”,随后分割输入的分支目的地地址或中断目的地地址会被依次存储在模拟程序计数器204中,跟踪数据“trace_data”被选择性地输出至模拟程序计数器204。
[0086]
模拟程序计数器204是与跟踪时钟“trace_clk”同步地动作的m位(例如,m=16)寄存器,并且模拟cpu 110中的程序计数器116。
[0087]
所述锁存器205除了在分支目的地地址或中断目的地地址的分割输入期间(稍后详细描述)外,与跟踪时钟“trace_clk”同步地获取模拟程序计数器204的输出值“pc_
count”作为模拟pc确定值“dump_pc”。是否操作锁存器205基于确定值获取指示信号“fetch_inst”来决定。具体地,当fetch_inst=“h”时,允许锁存器动作;当fetch_inst=“l”时,禁止锁存器动作。
[0088]
跟踪存储器206将锁存器205依次获取的模拟pc确定值“dump_pc”存储为跟踪结果“trace_result”。至于跟踪结果“trace_result”,可以响应于来自主机300的请求根据需要输出,或者可以在每当缓冲预定量的数据时定期输出。
[0089]
根据上述的从lsi 100(尤其,跟踪电路120)向外部输出一个跟踪时钟“trace_clk”以及与之同步的n位(例如,n=2)跟踪数据“trace_data”,并且使用外部连接到lsi 100的跟踪器200模拟cpu 110中的程序计数器116的配置,无需在lsi 100中实现跟踪存储器。因此可以仅用少量引脚容易且完全地跟踪程序cpu 110的程序动作(读取地址),而不会增加lsi 100上的开销。
[0090]
可以说,为了跟踪与快速驱动时钟clk(例如,100mhz)同步地动作的cpu 110的程序动作,在与跟踪时钟“trace_clk”(即,驱动时钟clk)同步地动作的跟踪器200上,硬件处理可以说是必不可少的。
[0091]
《跟踪动作(在跟踪器)》
[0092]
图5是示出跟踪器200中的跟踪操作的一例的流程图。当跟踪操作开始时,首先,在步骤s21中,模拟程序计数器204输出值“pc_count”被初始化。
[0093]
例如,当在程序开始时启动跟踪时,考虑到程序计数器116的输出值“pc_reg”从零开始,模拟程序计数器204的输出值“pc_count”也可以被初始化为零。另一方面,在程序在中途启动跟踪时,必须在期望开始跟踪的地址处中断程序动作,并且在重新启动程序动作后,可以记录跟踪数据;从而可以将模拟程序计数器204的输出值“pc_count”初始化为上述程序动作被中断的地址。
[0094]
之后,在步骤s22中,检查从lsi 100输入的跟踪数据“trace_data”是否为第二输出值“1d(01b)”。如果检查结果为“否”,则流程进入步骤s23;如果检查结果为“是”,则流程进入步骤s25。
[0095]
当步骤s22的检查结果为“否”时,在步骤s23检查从lsi 100输入的跟踪数据“trace_data”是否为第三输出值“2d(10b)”。如果检查结果为“否”,则流程进入步骤s24;如果检查结果为“是”,则流程进入步骤s26。
[0096]
当步骤s23的检查结果为“否”时,从lsi 100输入的跟踪数据“trace_data”被视为第一输出值“0d(00b)”。从而,在步骤s24,模拟程序计数器204保持不变,然后流程返回至步骤s22。
[0097]
相比之下,当步骤s22的检查结果为“是”时,则在步骤s25对模拟程序计数器204进行增量,然后流程返回至步骤s22。
[0098]
另一方面,当步骤s23的检查结果为“是”时,分支目的地地址或中断目的地地址需要被加载到模拟程序计数器204中。从而,在步骤s26和s27中,进行分支目的地地址或中断目的地地址的分割输入。
[0099]
具体地,首先,在步骤s26,将作为跟踪数据“trace_data”分割输入的分支目的地地址或中断目的地地址的一部分(两位)存储在模拟程序计数器204中的相应位。
[0100]
之后,在步骤s27,检查分支目的地地址或中断目的地地址的所有位值是否已被存
储在模拟程序计数器204中。即,检查分支目的地地址或中断目的地地址的分割输入是否完成。
[0101]
如果步骤s27的检查结果为“否”,则流程返回至步骤s26,并继续分支目的地地址或中断目的地地址的分割输入。相比之下,如果检查结果为“是”,则流程进入步骤s28。
[0102]
在步骤s28,模拟程序计数器204的输出值“pc_count”被固定为模拟pc确定值“dump_pc”。之后,流程返回至步骤s22,并重复上述一系列动作。
[0103]
《跟踪动作(在系统整体)》
[0104]
图6是示出跟踪系统x整体中的跟踪动作的一具体例的时序图,从上到下依次描绘出pc加载指令“pc_load”、pc增量指令“pc_inc”、程序计数器116的输出值“pc_reg”、跟踪时钟“trace_clk”、跟踪数据“trace_data”、计数器122的计数值“trace_count”、状态机111的动作状态“status”、模拟程序计数器204的输出值“pc_count”、所述确定值获取指示信号“fetch_inst”、以及模拟pc确定值“dump_pc”。
[0105]
图6中假定cpu 110具有三级管线架构的配置。即,在cpu 110中,针对一个指令代码的信号处理被分解为三个单位信号处理(取出[f]、解码[d]、以及执行[e]),并且它们独立且并行地进行。管线架构可以具有两个级,或者可以具有四个以上的级。毋庸讳言,cpu 110并非必须具有管线架构。
[0106]
图6中假定cpu 110是8位cpu并且指令代码为16位宽。但是,这并不意味着限定cpu 110处理的位数或每个指令代码的位数。
[0107]
图7是示出图6中的跟踪动作的程序代码的一例(摘录)的图。在作为示例示出的程序代码中,各种指令(例如jmpc、hlt、str、ldr、sdr、call、ret、以及or)存储在地址0x0000至0x0058中的每一个。
[0108]
下面必要时参照图6至图7将跟踪系统x整体中的跟踪动作大体划分为四个期间t1至t4来逐一详细描述。
[0109]
首先,关注期间t1(在时间点t1与t6之间)。在期间t1中,pc_load=“l”并且pc_inc=“h”。从而,程序计数器116的输出值“pc_reg”与跟踪时钟“trace_clk”(即,驱动时钟clk)同步地每次保持增量“ 2”(0c

0e

10

12

14

16)。
[0110]
程序计数器116的增量值为“ 2”的原因是,由于cpu 110是8位cpu并且指令代码为16位宽,因而程序存储器117中的读取地址每次增量两个字节。这样,程序计数器116的增量值根据cpu 110处理的位数和每个指令码的位数来决定。
[0111]
如上所述,cpu 110具有三级管线架构。从而,在时间点t1取出的地址0x000c的ldr指令在时间点t2解码并在时间点t3执行。对于任意的其他指令,基本上也同样地处理。但是,当执行分支指令或中断指令时,被同时取出或解码的指令可能未执行就被丢弃。毋庸讳言,这不适用于不具有管线架构或具有更深级的管线的cpu。
[0112]
在期间tl中,跟踪数据“trace_data”是第二输出值“1”(pc增量)。在此状态下,计数器122处于非活动状态(trace_count=0),并且状态机111的动作状态“state”为fetch状态。
[0113]
在期间t1中,模拟程序计数器204的输出值“pc_count”从程序计数器116的输出值“pc_reg”延迟一个时钟而每次增量“ 2”(0a

0c

0e

10

12

14)。
[0114]
在期间t1中,fetch_inst=“h”。从而,模拟pc确定值“dump_pc”从模拟程序计数器
204的输出值“pc_count”延迟一个时钟而每次增量“ 2”(08

0a

0c

0e

10

12)。
[0115]
接下来,关注期间t2(时间点t6到t8之间)。当在时间点t6执行地址0x0012处的call指令(用于调用子程序的分支指令)时,则pc_inc=“l”,接着在时间点t7,pc_inc=“l”;再接着,在时间点t8,取出分支目的地地址0x004c作为程序计数器116的输出值“pc_reg”。同时,跟踪数据“trace_data”从当时已达到的第二输出值“1”(pc增量)变为第一输出值“0”(pc不变),然后变为第三输出值“2”(pc变化[分支])。此外,状态机111的动作状态“state”从fetch状态变为wait_keep状态。
[0116]
在期间t2中,模拟程序计数器204的输出值“pc_count”保持不变(保持当时已达到的“14”)。进一步地,fetch_inst=“l”,因此模拟pc确定值“dump_pc”也保持不变(保持当时已达到的“12”)。
[0117]
接下来,关注期间t3(时间点t8到t16之间)。当跟踪数据“trace_data”变为第三输出值“2”(pc变化[分支])时,从下一个周期开始,开始分支目的地地址的分割输出。
[0118]
具体地,在时间点8,开始计数器122的脉冲计数动作(计数值“trace_count”的向上计数),并且在该脉冲计数动作继续时,与跟踪时钟“trace_clk”同步地,分支目的地地址0x004c每次被分割输出2位作为跟踪数据“trace_data”(参见图6中的阴影区域)。
[0119]
例如,在程序计数器116的输出值“pc_reg”(即,分支目的地地址或中断目的地地址)为16位宽,跟踪数据“trace_data”为2位宽的配置中,输出分支目的地地址或中断目的地地址的所有位值需要至少八个脉冲的跟踪时钟“trace_clk”。为了便于讨论,如果将跟踪数据“trace_data”扩展为四位,则四个脉冲便足以;如果将跟踪数据“trace_data”扩展为八位,则两个脉冲便足以;并且如果将跟踪数据“trace_data”扩展为16位(即,n=m),则一个脉冲便足以。
[0120]
这里,为了确保分支目的地地址0x004c的所有位值的完整输出,状态机111的动作状态“state”被变更为trace状态(暂停状态)。
[0121]
另一方面,在模拟程序计数器204中,依次存储作为跟踪数据“trace_data”的每次分割输入两位的分支目的地地址0x004c。
[0122]
图8是示出分支目的地地址的分割输入动作的图,从上到下描绘出计数器122的计数值“trace_counter”的转变、模拟程序计数器204的输出值“pc_count”的转变、跟踪数据“trace_data”的转变。下面也参照上述图6对分支目的地地址0x004c(=0000 0000 01001100)的分割输入动作进行描述。
[0123]
当trace_counter=“0”时,pc_counter=“0000 0000 0001 0100(0x0014)”(参见图6中的时间点t7)。
[0124]
当trace_counter=“1”时,16位分支目的地地址0x004c中,第一位值和第二位值([1:0]=“0d(00b)”)作为2位跟踪数据“trace_data”被设置为模拟程序计数器204中的第一位值和第二位值。结果,pc_counter=“0000 0000 0001 0100b(0x0014)”(参见图6中的时间点t8)。
[0125]
当trace_counter=“2”时,16位分支目的地地址0x004c中,第三位值和第四位值([3:2]=“3d(11b)”)作为2位跟踪数据“trace_data”被设置为模拟程序计数器204中的第三位值和第四位值。结果,pc_counter=“0000 0000 0001 1100b(0x001c)”(参见图6中的时间点t9)。
[0126]
当trace_counter=“3”时,16位分支目的地地址0x004c中,第五位值和第六位值([5:4]=“0d(00b)”)作为2位跟踪数据“trace_data”被设置为模拟程序计数器204中的第五位值和第六位值。结果pc_counter=“0000 0000 0000 1100b(0x000c)”(参见图6中的时间点t10)。
[0127]
当trace_counter=“4”时,16位分支目的地地址0x004c中,第七位值和第八位值([7:6]=“1d(01b)”)作为2位跟踪数据“trace_data”被设置为模拟程序计数器204中的第七位值和第八位值。结果,pc_counter=“0000 0000 0100 1100b(0x004c)”(参见图6中的时间点t11)。
[0128]
当trace_counter=“5”时,16位分支目的地地址0x004c中,第九位值和第十位值([9:8]=“0d(00b)”)作为2位跟踪数据“trace_data”被设置为模拟程序计数器204中的第九位值和第十位值。结果,pc_counter=“0000 0000 0100 1100b(0x004c)”(参见图6中的时间点t12)。
[0129]
当trace_counter=“6”时,16位分支目的地地址0x004c中,第十一位值和第十二位值([11:10]=“0d(00b)”)作为2位跟踪数据“trace_data”被设置为模拟程序计数器204中的第十一位值和第十二位值。结果,pc_counter=“0000 0000 0100 1100b(0x004c)”(参见图6中的时间点t13)。
[0130]
当trace_counter=“7”时,在16位分支目的地地址0x004c中,第十三位值和第十四位值([13:12]=“0d(00b)”)作为2位跟踪数据“trace_data”被设置为模拟程序计数器204中的第十三位值和第十四位值。结果,pc_counter=“0000 0000 0100 1100b(0x004c)”(参见图6中的时间点t14)。
[0131]
当trace_counter=“8”时,在16位分支目的地地址0x004c中,第十五位值和第十六位值([15:14]=“0d(00b)”)作为2位跟踪数据“trace_data”被设置为模拟程序计数器204中的第十五位值和第十六位值。结果,pc_counter=“0000 0000 0100 1100b(0x004c)”(参见图6中的时间点t15)。
[0132]
这样,16位分支目的地地址0x004c每次两位分八次被分割输入到模拟程序计数器204中。
[0133]
回到图6,现在关注期间t4(即,时间点t16到t19之间),将继续跟踪动作的详细描述。
[0134]
在时间点t16,在完成分支目的地地址0x004c的分割输入后,计数器122的计数值“trace_count”重置为零,状态机111从trace状态(暂停状态)经由pre_fetch状态恢复到fetch状态。
[0135]
在时间点t16,响应于分支目的地地址0x004c的ldr指令被解码,pc_inc=“h”。从而,从下一个周期开始,程序计数器116的输出值“pc_reg”与跟踪时钟“trace_clk”(即,驱动时钟clk)同步地一直每次增量“ 2”(4c

4e

50

52
→……
)。
[0136]
在期间t4中,跟踪数据“trace_data”是第二输出值“1”(pc增量)。从而,模拟程序计数器204的输出值“pc_count”从在期间t3写入的分支目的地地址0x004c开始一直每次增量“ 2”(4c

4e

50
→……
)。
[0137]
在期间t4中,当trace_data=“1”(pc增量)连续两个周期时,则fetch_inst=“h”,并且模拟程序计数器204的输出值“pc_count(=0x004c)”被锁存为模拟pc确定值“dump_
pc”。之后,模拟pc确定值“dump_pc”从模拟程序计数器204的输出值“pc_count”延迟一个时钟而一直每次增量“ 2”(4c

4e
→……
)。
[0138]
当trace_data=“1”(pc增量)连续两个周期时将模拟程序计数器204的输出值“pc_count”固定为模拟pc确定值“dump_pc”的原因是,由于cpu 110具有三级管线架构,只有在pc增量连续发生两次时才会执行所读取的指令代码。
[0139]
图9是示出程序代码(图7)的执行结果的图。如图所示,cpu 110按
……→
0x0008

0x000a

0x000c

0x000e

0x0010

0x0012

0x004c

0x004e

0x0050
→……
的顺序从一个地址到另一个地址执行指令代码。
[0140]
同时,如图6所示,模拟pc确定值“dump_pc”按
……→
0x0008

0x000a

0x000c

0x000e

0x0010

0x0012

0x004c

0x004e

0x0050
→……
的顺序从一个值变为另一个值。即,在跟踪器200中获得的模拟pc确定值“dump_pc”与上述程序代码的执行结果完全一致。
[0141]
因此,根据上述跟踪系统x,可以完全掌握cpu 110的程序动作。
[0142]
《变形》
[0143]
在本说明书中公开的各种技术特征可以以除上述实施方式之外的任意方式来实现,并且允许在不背离其技术独创性的思想的情况下进行多样的变更。即,上述实施方式应理解为在各个方面是示例性的而非限制性的,本发明的技术范围并非由上面给出的实施方式的描述限定而是由所附权利要求书限定,并且包括落入等同于那些权利要求的范围和意义内的任何变更。
[0144]
工业上的实用性
[0145]
在本说明书中公开的发明例如可以用于安装在多种多样的信息处理装置(智能电话、游戏机以及汽车导航系统)中的微处理器的调试。
[0146]
附图标记说明
[0147]
100 lsi(半导体装置)
[0148]
110 cpu(微处理器)
[0149]
111 状态机
[0150]
112 解码/执行器
[0151]
113 增量器
[0152]
114 分支目的地地址存储器
[0153]
115 选择器
[0154]
116 程序计数器
[0155]
117 程序存储器
[0156]
120 跟踪电路
[0157]
121 状态生成器
[0158]
122 计数器
[0159]
123 选择器
[0160]
200 跟踪器
[0161]
201 解码器
[0162]
202 增量器
[0163]
203 选择器
[0164]
204 模拟程序计数器
[0165]
205 锁存器
[0166]
206 跟踪存储器
[0167]
300 主机
[0168]
310 跟踪程序
[0169]
x 跟踪系统。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献