vivado的XVC报文解析

时间:2021-05-20 01:27:53

1. 基础知识

1.1 关于XVC

(1)Xilinx Virtual Cable (XVC) 是一种用于通过网络连接远程调试和编程Xilinx FPGA的协议。使用XVC协议,可以将FPGA的JTAG接口连接到一个网络端口上,然后通过TCP/IP协议在远程计算机上进行JTAG操作,从而实现对FPGA的调试和编程。

(2)Xilinx Virtual Cable (XVC)协议目前有两个版本,分别是XVC v1.0和XVC v2.0。XVC v1.0是早期版本的XVC协议,使用固定的JTAG时序和格式进行数据传输。它适用于通过网络连接到一个远程JTAG设备,但对于某些应用场景下,可能需要更高的传输速度和更灵活的配置选项。为了满足这些需求,Xilinx推出了XVC v2.0版本,它提供了更多的灵活性和可配置选项,支持更高的传输速率和更多的JTAG设备类型。XVC v2.0支持可配置的时序和数据格式,同时支持多路连接和流式数据传输。需要注意的是,XVC v2.0需要更高版本的Xilinx Vivado工具才能支持,因此在选择使用哪个版本的XVC协议时,需要根据具体的应用需求和工具版本进行选择。

1.2 关于JTAG

(1)JTAG(Joint Test Action Group)是一种用于在集成电路中进行调试和测试的标准接口。它可以访问芯片内部的寄存器,实现对芯片内部状态的控制和观测。

(2)根据不同的JTAG版本,支持的功能和性能也会有所不同。目前常见的JTAG版本有JTAG IEEE 1149.1、IEEE 1149.6、IEEE 1149.7等。其中,IEEE 1149.1是最基本的JTAG版本,支持单线调试,而IEEE 1149.6和IEEE 1149.7则是一些特殊应用场景下的改进版本,支持多线调试和高速调试。

(3)对于Xilinx FPGA,一般使用的是IEEE 1149.1版本的JTAG接口。使用XVC协议进行远程调试和编程时,需要将FPGA的JTAG接口连接到网络上,并使用XVC协议在远程计算机上进行JTAG操作。具体的JTAG版本和调试方式,需要根据具体的应用需求和硬件平台进行选择和配置。

(4)IEEE 1149.1是一种用于测试和调试集成电路的标准接口,也被称为JTAG(Joint Test Action Group)接口。它定义了一种包含4条线的串行接口,用于测试和调试芯片内部的逻辑电路,并支持在生产测试和维护阶段对芯片进行编程和调试。

1.3 JTAG的时序图

IEEE 1149.1标准接口由以下4条线组成:

Test Data Input (TDI):测试数据输入线,用于向芯片内部输入测试数据。
Test Data Output (TDO):测试数据输出线,用于从芯片内部输出测试结果。
Test Mode Select (TMS):测试模式选择线,用于控制测试模式的转换。
Test Clock (TCK):测试时钟线,用于控制测试时序和数据传输速率。
除了这些标准线之外,IEEE 1149.1标准还定义了一些辅助线,用于实现特殊的测试和调试功能,例如测试控制和状态寄存器(TAP控制和状态寄存器)。

通过使用IEEE 1149.1标准接口,可以实现对芯片内部逻辑电路的测试和调试,包括读取和写入寄存器、检查电路状态、检测电路故障等。此外,IEEE 1149.1标准还可以用于在生产测试和维护阶段对芯片进行编程和调试,以实现更高的生产效率和更好的维护性能。
vivado的XVC报文解析

1.4 JTAG的状态机

参考文档《7系列FPGA的配置》。
vivado的XVC报文解析

1.5 XVC的三种报文

参考文件:《xapp1251-xvc-zynq-petalinux.pdf》,可以在xilinx官网免费下载改文档。
XVC 协议内容简单,使用方便,其基本内容可总结为如下三条指令:

1) getinfo:

该指令用于获取XVC 服务的版本。当接收到“getinfo:”指令时,该服务将会返回如下的字符串:“ xvcServer_v1.0; ”, 其中,代表了该协议一次能移位发送的字节向量的最大长度。
vivado的XVC报文解析

2) shift:[num bits][tms vector][tdi vector]

该指令表示分别以字节向量TMS vector 和TDI vector 的形式发送num_bits 个二进制数据。其中,num_bits 是一个小端格式的整数,TMS vector和 TDI vector 代表所要发送的TMS 和TDI 的二进制数据。发送过程中,0 字节的0 比特位首先被发送出去,字节向量的长度会根据num_bits 的值向上补齐成最接近的字节数。该指令最终应该返回与TMS vector 向量同样长度的字节向量TDO vector,代表从JTAG 接口返回的所有的TDO。同样也是0字节的0 比特位首先被接收回来。
vivado的XVC报文解析

3) settck:[period in ns]

该指令表示将该协议通信的时钟周期设置为period 纳秒。period 同样是一个小端格式的整数值。使用该指令最终应该返回实际的周期值。
vivado的XVC报文解析

2. 调试过程

在单片机中建立TCP服务端,接收vivado发来的报文。本章节重点关注"shift:"命令。

2.1 shift命令的实际内容

(1)在实现网络通信之后,debug调试抓到vivado发来的shift命令。下图只是部分报文,并非全部。
vivado的XVC报文解析
(2)根据jtag协议,上述报文的对应的jtag理论波形,如下图所示。bit0先传

  • 第一条shift命令,如下图所示。可知主要用来搬运32位的数据。这里不知道这32位的数据表示什么意思。
    vivado的XVC报文解析
  • 第二条shift命令,移动132字节的数据

vivado的XVC报文解析

2.2 shift命令的实际示波器波形

(1)由下面的TMS和TDI波形,对比2.1中的理论波形,可以看到,是一致的。
vivado的XVC报文解析
(2)TDO引脚配置为输入,处于高阻状态或者上拉。由jtag从设备控制TDO引脚。
vivado的XVC报文解析

2.3 vivado识别设备的IDCODE的shift命令

(1)发送位长度为:0x0000042E的shift命令,可以得到国产FPGA的IDCODE:03691093
vivado的XVC报文解析

(2)发送位长度为0x2E的shift指令,也可以得到IDCODE。

73 68 69 66 74 3A 2E 00 00 00 FF 02 00 00 00 18 00 F0 0F 00 00 00

2.4 进口xlinxV7和国产V7的IDCODE

7系列的IDCODE有哪些
vivado的XVC报文解析
vivado的XVC报文解析

2.5 测试命令

这里的命令是使用wireshark抓包到的,仅是部分命令。
vivado的XVC报文解析

67 65 74 69 6E 66 6F 3A
73 65 74 74 63 6B 3A 64 00 00 00
73 68 69 66 74 3A 05 00 00 00 1F 00
73 68 69 66 74 3A 2B 00 00 00 5F 00 00 00 00 03 00 FE 01 00 00 00
73 68 69 66 74 3A 2E 04 00 00 FF 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F 00 00 00
73 68 69 66 74 3A C6 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 E0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0F
73 68 69 66 74 3A 3C 00 00 00 37 00 58 00 00 00 00 06 00 BF 00 00 00 00 00 00
73 68 69 66 74 3A 3C 00 00 00 37 00 58 00 00 00 00 06 00 C2 0F 00 00 00 00 00
73 68 69 66 74 3A 73 00 00 00 37 00 78 00 B0 00 00 00 00 2C 00 00 00 00 03 00 FF 0F 84 1F 00 04 40 12 00 00 00 00 00 00
73 68 69 66 74 3A B5 00 00 00 37 00 78 00 70 00 00 00 00 16 00 00 0B 00 00 00 00 00 00 00 00 00 0C 00 FF 0F 84 1F 00 03 20 09 00 00 78 40 2A 00 00 00 00 00 00 00 00 00
73 68 69 66 74 3A 41 05 00 00 03 80 07 00 07 00 00 00 60 01 00 B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 00 F0 FF 40 F8 01 30 00 92 00 00 00 00 A4 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
73 68 69 66 74 3A 7A 00 00 00 03 80 07 00 07 00 00 00 60 01 00 B0 00 00 80 01 F0 FF 40 F8 01 30 00 92 00 00 08 00 A4 FE 7F 00
73 68 69 66 74 3A 7A 00 00 00 03 80 07 00 07 00 00 00 60 01 00 B0 00 00 80 01 F0 FF 40 F8 01 30 00 92 00 00 08 00 A4 FA 7F 00
73 68 69 66 74 3A 75 00 00 00 03 80 07 00 07 00 00 00 60 01 00 B0 00 00 0C F0 FF 40 F8 01 30 00 92 00 00 10 00 A4 02 00
73 68 69 66 74 3A 7A 00 00 00 03 80 07 00 07 00 00 00 60 01 00 B0 00 00 80 01 F0 FF 40 F8 01 30 00 92 00 00 08 00 A4 02 00 00
73 68 69 66 74 3A FB 01 00 00 03 80 07 00 07 00 00 00 60 01 00 B0 00 00 00 00 80 0D 00 1E 00 1C 00 00 00 80 05 00 C0 02 00 00 80 0D 00 1E 00 1C 00 00 00 80 05 00 C0 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 F0 FF 40 F8 01 30 00 92 00 00 20 00 A4 22 00 18 00 C0 FF 03 E1 07 C0 00 48 02 00 A0 00 90 0A FF 1F C0 FF 03 E1 07 C0 00 48 02 00 C0 00 90 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
73 68 69 66 74 3A FB 01 00 00 03 80 07 00 07 00 00 00 60 01 00 B0 00 00 00 00 80 0D 00 1E 00 1C 00 00 00 80 05 00 C0 02 00 00 80 0D 00 1E 00 1C 00 00 00 80 05 00 C0 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 F0 FF 40 F8 01 30 00 92 00 00 20 00 A4 22 00 18 00 C0 FF 03 E1 07 C0 00 48 02 00 A0 00 90 0A F0 1F C0 FF 03 E1 07 C0 00 48 02 00 C0 00 90 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
73 68 69 66 74 3A FB 01 00 00 03 80 07 00 07 00 00 00 60 01 00 B0 00 00 00 00 80 0D 00 1E 00 1C 00 00 00 80 05 00 C0 02 00 00 80 0D 00 1E 00 1C 00 00 00 80 05 00 C0 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 F0 FF 40 F8 01 30 00 92 00 00 20 00 A4 22 00 58 00 C0 FF 03 E1 07 C0 00 48 02 00 A0 00 90 0A FF 1F C0 FF 03 E1 07 C0 00 48 02 00 C0 00 90 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
73 68 69 66 74 3A FB 01 00 00 03 80 07 00 07 00 00 00 60 01 00 B0 00 00 00 00 80 0D 00 1E 00 1C 00 00 00 80 05 00 C0 02 00 00 80 0D 00 1E 00 1C 00 00 00 80 05 00 C0 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 F0 FF 40 F8 01 30 00 92 00 00 20 00 A4 22 00 58 00 C0 FF 03 E1 07 C0 00 48 02 00 A0 00 90 0A F0 1F C0 FF 03 E1 07 C0 00 48 02 00 C0 00 90 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
73 68 69 66 74 3A FB 01 00 00 03 80 07 00 07 00 00 00 60 01 00 B0 00 00 00 00 80 0D 00 1E 00 1C 00 00 00 80 05 00 C0 02 00 00 80 0D 00 1E 00 1C 00 00 00 80 05 00 C0 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 F0 FF 40 F8 01 30 00 92 00 00 20 00 A4 22 00 98 00 C0 FF 03 E1 07 C0 00 48 02 00 A0 00 90 0A FF 1F C0 FF 03 E1 07 C0 00 48 02 00 C0 00 90 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

2.6 JTAG识别多个FPGA

  • (1) JTAG接线图
    vivado的XVC报文解析
  • (2) 本项目使用了两个FPGA
    vivado的XVC报文解析

2.7 wrieshark抓包

(1)mcu收到vivado的报文,以及回复发送的报文
vivado的XVC报文解析
(2)遇到的一个小bug。识别IDCODE,已经正确回复。但是卡在后续的报文中。抓包发现是vivado没有成功发送长报文,进行了几次重发。需要修改协议栈的接收逻辑,用以接收更长的报文。下图左侧是成功初始化的过程,右侧是失败的初始化过程。

vivado的XVC报文解析

3. 拓展知识

参考文档《7系列FPGA的配置》。

3.1 JTA的寄存器组

(1) 寄存器列表

vivado的XVC报文解析

(2) 寄存器框图

vivado的XVC报文解析

3.2 IR寄存器

JTAG IR(Instruction Register)是JTAG测试中的一种寄存器,用于控制和选择测试模式和功能模式。

在JTAG测试中,通过JTAG接口向IR寄存器写入特定的指令,可以选择不同的测试模式或功能模式。这些指令可以用于控制JTAG测试工具与被测电路之间的通信,从而实现电路的测试、调试和故障排除。

在JTAG IR中,每个指令占据了一个特定的位数(一般是4位或5位),不同的指令可以对应不同的测试模式或功能模式。JTAG IR还包含了一些保留位,这些位保留用于未来扩展或其他用途。

JTAG IR在JTAG测试中起着重要的作用,通过选择不同的测试模式和功能模式,可以实现不同的测试和调试功能。通常,测试工具会提供一些预定义的指令和测试模式,用户也可以根据需要自定义指令和测试模式。

需要注意的是,不同的芯片或电路的JTAG IR长度和指令集可能会有所不同,需要根据具体情况进行调整和使用。

  • (1)IR指令集
    vivado的XVC报文解析

TAG IR指令集因芯片而异,具体的指令和功能取决于芯片的设计和实现。不同芯片的JTAG IR长度和指令数量也不同。以下是一些常见的JTAG IR指令,但并不是所有芯片都支持这些指令:

  • BYPASS:在此模式下,绕过所有JTAG测试逻辑,将所有输入直接连接到输出。这个模式通常用于芯片测试时快速跳过JTAG测试。

  • IDCODE:读取芯片的唯一识别码,该码通常用于确定芯片的型号和版本等信息。

  • SAMPLE/PRELOAD:通过IR指令输入或输出测试数据,这个模式用于加载或读取数据寄存器中的测试数据。

  • EXTEST:该模式下,将测试模式序列加载到测试模式寄存器中,然后将电路输入和输出连接到测试模式寄存器。在这个模式下,可以测试电路的输入和输出。

  • INTEST:该模式下,可以访问内部测试逻辑,进行芯片内部电路的测试和故障诊断。

  • USERCODE:读取用户编程的代码,这个模式通常用于存储和检查用户编写的代码。

3.3 Bypass寄存器

一个重要的应用是IR值是全一值,表示BYPASS命令,在BYPASS模式中,TAP控制器中的DR寄存器总是单bit的,从输入TDI到输出TDO,通常一个周期,啥也不干。
可用BYPASS模式计算IC数目。如果每个IC的TDI-TDO链的延迟是一个时钟,我们可以发送一些数据并检测它延迟了多久,那么久可以推算出JTAG链中的IC数目。

3.4 IDCODE寄存器

在Test-Logic-Reset状态下IR寄存器默认选择的是IDCODE这个DR寄存器。每次TAP控制器跳转到Test-Logic-Reset态,它会进入IDCODE模式,并装载IDCODE到DR。

3.5 Boundary寄存器

4. 后续补充。。。