我了解JTAG如何用作边界扫描仪(http://www.fpga4fun.com/JTAG1.html上的解释很清楚)。但是,我看不到这些天JTAG如何用作硬件级调试器(有点类似于在线仿真器)。
1.有人可以解释如何将JTAG用作硬件级调试器吗?
我的假设是片上必须有一些额外的硬件来帮助调试,而JTAG仅驱动该硬件来获取调试信息。如果我的理解是正确的-
2a。那是什么硬件?
2b。有标准吗?
我相当怀疑标准部分,因为我所见过的所有基于JTAG的硬件级调试器的实现都互不相同。
最后,将JTAG称为硬件级调试器确实令人困惑,而JTAG标准却没有定义任何种类。那么,当为此使用JTAG时,是否有不同的名称?
最佳答案
fyi:我不确定我是否了解你,你可能已经知道/理解我在下面写的所有内容,也许比我更好。给我留言,我将删除答案。
1/2a:使用的硬件只是“一些”额外的寄存器和逻辑电路,这些寄存器和逻辑电路形成/注入(inject)其他(正交!)状态到标准JTAG状态机中。
如果您了解JTAG协议(protocol)如何执行边界扫描以及如何从设备中推/拉比特流,则应该可以想象一下它是如何用于对芯片上的存储体进行编程的。想象一下典型的菊花链连接,而不是芯片之间,而是芯片内部。
假设该设备具有一些可编程的持久性存储器。通过再加上一些触发器和门,该设备在实际存储器的JTAG链之前或之后形成了一个额外的缓冲区:
输入-> xflops->内存-> yflops->输出
假设x/mem/y = 16/1024/0。现在,该链具有1040位。前面的xflops不会直接影响内存,反之亦然。现在,xflops可能已链接到驱动内存的内置内部编程器的控制线。
input -> progcmd -> memory -> output
芯片内部的逻辑电路现在可以对某些16位“魔术数”(也称为“写命令”)使用react,这将触发对持久性存储器进行写/擦除的过程。其他任何16位值都将被忽略,并且设备的行为类似于1024 r/o数据,后跟16位回波或零。
好的,所以我们有一个简单的设备上“ Controller ”,可以在“真实设备”上执行操作。如果您通过扩展想法,即 Controller 具有可以控制将哪些子设备连接到链上的状态,则可以即时的:
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:很遗憾,我不能多说,因为我在这个主题上太环保了;)我知道许多制造商形成了自己的内部标准,“ Controller ”只是在模型之间共享,有时在芯片家族之间共享,但是我没有听说制造商之间存在任何通用的“全局”标准。
关于debugging - JTAG如何用作调试器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21156135/