JTAG 如何用作调试器?
Posted
技术标签:
【中文标题】JTAG 如何用作调试器?【英文标题】:How is a JTAG used as a debugger? 【发布时间】:2014-02-05 00:38:16 【问题描述】:我了解 JTAG 过去如何用作边界扫描仪(http://www.fpga4fun.com/JTAG1.html 的解释非常清晰)。但是我看不出这些天 JTAG 是如何用作硬件级调试器的(有点类似于在线仿真器)。
1.谁能解释一下 JTAG 如何用作硬件级调试器?
我的假设是必须有一些额外的片上硬件有助于调试,而 JTAG 仅驱动该硬件以获取调试信息。如果我的理解是正确的 -
2a。那是什么硬件?
2b。有标准吗?
我相当怀疑标准部分,因为我看到的所有基于 JTAG 的硬件级调试器的实现都各不相同。
最后,将 JTAG 称为硬件级调试器确实令人困惑,而 JTAG 标准并未定义任何此类内容。那么 JTAG 用于此时是否有不同的名称?
【问题讨论】:
【参考方案1】:JTAG 只是一种与芯片内部接口的简单方法,它与“常规”芯片功能一起工作。它基本上是一个多模(同步)串口。
通过直接访问引脚来实现边界扫描。
正如您推测的那样,另一个是访问芯片内部的额外硬件。可以设置该硬件以提供(例如)硬件断点、读取寄存器和任意内存位置的能力、编程内部闪存等。这些都是调试器应用程序可以使用的东西。
JTAG 标准为设备特定的扩展提供了空间,这些扩展始终旨在供芯片设计人员用来提供这些类型的功能。尝试标准化接口,包括 JTAG 以及与调试硬件的更高速率连接,称为Nexus。但是,我只见过飞思卡尔实施它,所以它似乎不像人们希望的那样有用!
关于术语,是的,将“JTAG”单独称为硬件调试器可能是错误的。我不完全确定“JTAG”是什么(如问题标题中所用)-也许“JTAG pod”或“JTAG 接口模块”会更好?
但是,诸如“JTAG 调试访问”甚至“JTAG 调试器”(实际上是“JTAG 编程器”对于那些只是使用它来对闪存进行编程的用户来说)这样的短语是常用的(至少在英国!)和在我看来并不令人困惑,将接口方法和提供的功能结合起来。
【讨论】:
IIRC,JTAG 定义了状态机和电传输编码方式,所以我认为 JTAG 是一种“硬件协议”。实际上,在名称中有一个“[T]est”,我真的会避免认为它是一个调试器,因为主要/传统的边界扫描功能几乎没有。将 JTAG 称为调试器就像将 SPI 或 I2C 称为调试器。我不是专家,但我相信不仅飞思卡尔做了一些 JTAG 调试。我喜欢玩旧硬件并尝试“破解”它,我经常在数据表中看到芯片不仅可以测试/可编程,而且可以通过 JTAG 命令进行步进 它通常被称为一些制造商商标的花哨名称,例如莱迪思的 ispTHINGY,但深入到它们使用 JTAG 定义的类似 0/1 编码的位中,只是扩展了一些新的子状态.. 无论如何我又开始唠叨了,对不起.. 相反,我从不将 JTAG 用于板级测试,仅用于调试。我认为过多阅读首字母缩写词是一个错误(就像许多首字母缩写词一样:)而且 JTAG 被明确设计为具有制造商扩展以用于类似调试的目的,因此它无法与 SPI 等相媲美。而且我不建议调用 JTAG一个调试器。它的 is 然而一个有用且广泛使用的调试器 interface【参考方案2】:fyi:我不确定我是否理解你,你可能已经知道/理解我在下面写的所有内容,也许比我更好。给我留言,我会删除答案。
1/2a:使用的硬件“只是”一些额外的寄存器和逻辑电路,它们形成/注入额外(正交!)状态到标准 JTAG 状态机中。
如果您了解 JTAG 协议如何执行边界扫描以及如何从设备推送/拉出比特流,您应该能够想象它是如何用于对片上存储器组进行编程的。想象一下典型的菊花链,不是在芯片之间,而是在芯片内部。
假设设备有一些可编程的持久内存。有了更多的触发器和门,器件在实际内存的 JTAG 链之前或之后形成了一个额外的缓冲区:
输入 -> xflops -> 内存 -> yflops -> 输出
假设 x/mem/y = 16/1024/0。现在,链有 1040 位。前面的 xflops 不会直接影响内存,反之亦然。 xflops 现在可能链接到驱动内存的内置内部编程器的控制线。
input -> progcmd -> memory -> output
芯片内部的逻辑电路现在可以对一些 16 位“幻数”(即“写命令”)做出反应,这将触发持久性存储器的写/擦除过程。任何其他 16 位值都将被忽略,设备的行为类似于 1024 r/o 数据后跟 16 位回显或零。
好的,所以我们有一个简单的设备上“控制器”,可以在“真实设备”上执行操作。如果你扩展这个想法,即控制器具有 states 可以控制哪些子设备连接到链上,on the fly:
default chain after reset is:
input -> progcmd -> output
if now the controller gets ENABLE_WRITE it attaches MEM to chain
input -> progcmd -> memory -> output
then controller reacts to WRITE and ABORTs on everything else
input -> progcmd -> output
controller ges VERIFY, it reattaches MEM again but in READONLY mode
input -> progcmd -> memory -> output
etc
这当然只是一个额外的状态机。以类似的方式,您几乎可以执行任何花哨的操作,包括冻结、步进、读/写寄存器等调试。但所有这些都需要在相关芯片中内置 吨 额外逻辑。实际上,它在一个芯片中包含多个设备。
2b:不幸的是,我不能多说,因为我对这个主题太陌生了;)我知道许多制造商形成了自己的内部标准,“控制器”只是在模型之间共享,有时在芯片系列之间共享,但我'没有听说过制造商之间通用的任何'全球'标准。
【讨论】:
【参考方案3】:JTAG 具有独特的接口,使您能够轻松地实时调试硬件。它可以通过软件直接控制所提供控制器的时钟周期。因此,您可以在代码执行中放置硬件断点。您可以根据需要在硬件中启动、暂停、停止执行代码。
只要 JTAG 控制设置为1
振荡器时钟将连接到 CPU,否则 CPU 将不会接收时钟并且无法执行任何指令。这样您可以控制硬件中指令的执行。
【讨论】:
以上是关于JTAG 如何用作调试器?的主要内容,如果未能解决你的问题,请参考以下文章