riple

Stay Hungry, Stay Foolish.

回顾Virtual JTAG在一个项目中的成功应用

0
阅读(3489)

        这些天在回顾两年前做的一个产品。得益于当时每天都写下的几行工作记录,这个产品的开发过程我还能回忆起来。在这个产品开发的各个阶段,Virtual JTAG和Tcl都发挥了重要作用。投入几天的时间开发一个小工具,在完成后就能持续地产生效益。Virtual JTAG在加快开发速度,提高调试效率方面发挥了重要的作用。
       
        1. 应用场合之一:在开发初期,实现对FPGA外部接口芯片的灵活控制——KSZ8842接口控制台工具。我们的产品需要连接网络,并通过一个带本地接口的三 端口交换机芯片KSZ8842实现和宿主机网络的共享。在最初拿到这款芯片的时候,我们很是为它复杂的地址扩展方式和功能配置选项头疼。虽然网站上提供了 参考设计和驱动程序,但是我们做的是FPGA直接连接和控制KSZ8842,用C语言写的嵌入式代码帮助不大。
        当时我们最需要的,是通过FPGA灵活地读写KSZ8842的寄存器,尝试交换芯片的各种功能配置,并通过交换芯片的本地接口实现网络报文的收发。我们应 用Virtual JTAG,编写了一个简单的Tcl控制台。通过JTAG下载电缆,我们可以从运行在调试PC机上的Tcl控制台读写FPGA的内部逻辑,在FPGA和 KSZ8842的接口上产生读写波形,向KSZ8842发送任意地址的读写操作。这一工具除了可以执行简单的单步读写操作,还可以读入一个脚本文件,实现 批量的配置输入。利用这个工具,我们打通了从FPGA到网络的数据通路,积累了一系列的配置脚本。这些工作,为后期采用HDL代码编写状态机自动控制 KSZ8842打下了坚实的基础。

        2. 应用场合之二:贯穿于开发过程的始终,实现对FPGA外部接口总线读写事务的监听——PATA接口命令捕获和解析工具。在先前开发和调试其它PATA接口 的产品时,我们经常需要捕获宿主机给PATA接口发送的命令,并通过对这些命令的内容和先后顺序的分析,推测宿主机BIOS的行为。以前的产品中有一颗嵌 入式CPU芯片,通过CPU芯片的串口,这些信息可以很容易地传送到调试PC机上。当前这款产品的全部功能是用FPGA来实现的,没有串口,只能利用 FPGA芯片的JTAG口。
        首先在FPGA中捕获并存储宿主机发送给PATA接口的命令,然后应用Virtual JTAG读取FPGA中存储的命令序列,通过JTAG下载电缆传送到调试PC机上察看。借助于运行在调试PC机上的Tcl程序,这些原始的命令序列,可以 得到进一步的解析,并且以一种易读易懂的方式呈现给调试者。应用这个工具,我们还捕获了宿主机与真正的硬盘之间传输的数据,其中最有用的是硬盘对宿主机 Identify命令返回的硬盘参数信息。这些信息,给我们制定自己的硬盘参数提供了参考。
        与此类似,在采用CPU和FPGA协同工作的嵌入式系统中,使用这一工具也可以从FPGA一侧捕获和解析 CPU对FPGA接口上的读写操作。获得的信息可以辅助验证CPU与FPGA协同工作的正确性。
       
        3. 应用场合之三:在开发过程的中后期,实现对尚未开发完成部分的功能模拟,验证已经完成部分的功能,隔离可能的故障点——PATA接口虚拟硬盘工具。在先前 的产品中,PATA接口在FPGA上的程序已经开发好了,移植到新的产品上并不困难。PATA接口移植工作的正确性需要尽早验证。仿真验证的速度和覆盖率 都有限,最好的验证是上板进行宿主机与PATA接口的硬件实测。但是由于网络接口一侧的开发还在进行中,并且出于隔离故障点的考虑,这时还不能进行集成实 测。
        当时我们需要的是抛开网络接口,尽快上板验证PATA接口移植工作的正确性。在上面提到的PATA接口命令捕获和解析工具的基础上,我们开发了基于 Virtual JTAG的虚拟硬盘。通过JTAG下载电缆,我们把捕获到的宿主机发送给PATA接口的命令传送到调试PC机上,运行在调试PC机上的Tcl程序把收到的 命令解析后分类为读写两类命令。针对读命令,可以读取调试PC机上存储的一个文件,把读取的数据通过JTAG下载电缆返回给PATA接口;针对写命令,可 以把宿主机从PATA接口写入给FPGA的的数据,通过JTAG下载电缆传递给调试PC机,这些数据就可以写入到调试PC机上的文件中。这样,就通过 Virtual JTAG,在调试PC机上虚拟出了一个可读可写的微型硬盘。
        这个虚拟的微型硬盘虽然速度慢(通过JTAG下载电缆传输大量的数据),但是填补了后端设备尚未开发完成的功能,构成了一个可以实际上板运行的系统。有了 这个系统,我们就可以实际调试一个部分完成的产品,尽早发现已经完成部分在实现上的错误。这样做比在仿真环境中调试快得多和实际得多。
        同理,如果网络接口部分先开发完成,也可以不等待PATA接口的开发,采用Virtual JTAG虚拟前端设备的读写请求,进行网络接口部分及上层协议的硬件实测。

        4. Tcl的应用:对上述虚拟硬盘的扩展——模拟服务器网络响应的工具。在网络部分初步开发出来之后,跟服务器之间通过网络的交互测试就是必需的了。由于交互 的复杂性,通过仿真来验证是不够的。服务器程序在原有的产品中早就开发成熟并已经长期使用了,但是在服务器上调试新产品的网络部分并不容易,交互的具体内 容是看不到,也不容易控制的。
        我们需要的是模拟服务器对被测设备的响应,并获得交互过程中的各种命令参数。针对这一问题,在调试PC机上,我们用Tcl程序实现了对UDP报文的监听解 析和返回报文的发送,模拟了服务器对被测设备发送的读写请求的响应。这里虽然没有用到Virtual JTAG,但是这一工具是在上述PATA接口虚拟硬盘工具成功使用的启发下开发的,也通过在调试PC机上读写文件实现了虚拟硬盘,并能在调试PC机上提供 详尽的网络报文接收和发送参数。所不同的是,这一次虚拟硬盘的底层传输介质不再是JTAG下载电缆,而是真正的网络;上层的协议也不再是简单的ATA读写 命令,而是运行在UDP/IP之上的RPC协议。
        通过这一工具,我们把原本复杂甚至神秘的服务器端操作,详细清晰地呈现在调试者眼前。这个在调试PC机上虚拟的网络硬盘虽然在性能上比不上在服务器上运行 的网络硬盘,但是其容量和速度已经可以支持Windows操作系统的安装和启动了。在这一工具的帮助下,我们在开发中及早地实现了集成实测和调试,甚至在 服务器宕机数日的情况下都能继续调试和开发。这一工具,进一步演化为演示系统中的服务器端程序,在一台运行Windows操作系统的笔记本上就可以实现 Linux服务器的基本功能,简化了演示系统的搭建过程。


       上面这些工具是应用Virtual JTAG和Tcl辅助硬件调试的一个尝试,在我们的开发过程中得到了成功的验证。整理出来,供大家参考。