几天前看到
特权同学在学习使用Virtual JTAG,心中很是高兴:这么好的一个工具,终于有同行认真对待它,并且开始探索着使用它了。不知道
特权同学使用的情况如何。
riple 这些天在回顾两年前做的一个产品。得益于当时每天都写下的几行工作记录,这个产品的开发过程我还能回忆起来。在这个产品开发的各个阶段,Virtual JTAG和Tcl都发挥了重要作用。投入几天的时间开发一个小工具,在完成后就能持续地产生效益。Virtual JTAG在加快开发速度,提高调试效率方面发挥了重要的作用。
riple 1. 应用场合之一:在开发初期,实现对FPGA外部接口芯片的灵活控制——KSZ8842接口控制台工具。我们的产品需要连接网络,并通过一个带本地接口的三端口交换机芯片KSZ8842实现和宿主机网络的共享。在最初拿到这款芯片的时候,我们很是为它复杂的地址扩展方式和功能配置选项头疼。虽然网站上提供了参考设计和驱动程序,但是我们做的是FPGA直接连接和控制KSZ8842,用C语言写的嵌入式代码帮助不大。
riple 当时我们最需要的,是通过FPGA灵活地读写KSZ8842的寄存器,尝试交换芯片的各种功能配置,并通过交换芯片的本地接口实现网络报文的收发。我们应用Virtual JTAG,编写了一个简单的Tcl控制台。通过JTAG下载电缆,我们可以从运行在调试PC机上的Tcl控制台读写FPGA的内部逻辑,在FPGA和KSZ8842的接口上产生读写波形,向KSZ8842发送任意地址的读写操作。这一工具除了可以执行简单的单步读写操作,还可以读入一个脚本文件,实现批量的配置输入。利用这个工具,我们打通了从FPGA到网络的数据通路,积累了一系列的配置脚本。这些工作,为后期采用HDL代码编写状态机自动控制KSZ8842打下了坚实的基础。
riple 2. 应用场合之二:贯穿于开发过程的始终,实现对FPGA外部接口总线读写事务的监听——PATA接口命令捕获和解析工具。在先前开发和调试其它PATA接口的产品时,我们经常需要捕获宿主机给PATA接口发送的命令,并通过对这些命令的内容和先后顺序的分析,推测宿主机BIOS的行为。以前的产品中有一颗嵌入式CPU芯片,通过CPU芯片的串口,这些信息可以很容易地传送到调试PC机上。当前这款产品的全部功能是用FPGA来实现的,没有串口,只能利用FPGA芯片的JTAG口。
riple 首先在FPGA中捕获并存储宿主机发送给PATA接口的命令,然后应用Virtual JTAG读取FPGA中存储的命令序列,通过JTAG下载电缆传送到调试PC机上察看。借助于运行在调试PC机上的Tcl程序,这些原始的命令序列,可以得到进一步的解析,并且以一种易读易懂的方式呈现给调试者。应用这个工具,我们还捕获了宿主机与真正的硬盘之间传输的数据,其中最有用的是硬盘对宿主机Identify命令返回的硬盘参数信息。这些信息,给我们制定自己的硬盘参数提供了参考。
riple 与此类似,在采用CPU和FPGA协同工作的嵌入式系统中,使用这一工具也可以
从FPGA一侧捕获和解析CPU对FPGA接口上的读写操作。获得的信息可以辅助验证CPU与FPGA协同工作的正确性。
riple 3. 应用场合之三:在开发过程的中后期,实现对尚未开发完成部分的功能模拟,验证已经完成部分的功能,隔离可能的故障点——PATA接口虚拟硬盘工具。在先前的产品中,PATA接口在FPGA上的程序已经开发好了,移植到新的产品上并不困难。PATA接口移植工作的正确性需要尽早验证。仿真验证的速度和覆盖率都有限,最好的验证是上板进行宿主机与PATA接口的硬件实测。但是由于网络接口一侧的开发还在进行中,并且出于隔离故障点的考虑,这时还不能进行集成实测。
riple 当时我们需要的是抛开网络接口,尽快上板验证PATA接口移植工作的正确性。在上面提到的PATA接口命令捕获和解析工具的基础上,我们开发了基于Virtual JTAG的虚拟硬盘。通过JTAG下载电缆,我们把捕获到的宿主机发送给PATA接口的命令传送到调试PC机上,运行在调试PC机上的Tcl程序把收到的命令解析后分类为读写两类命令。针对读命令,可以读取调试PC机上存储的一个文件,把读取的数据通过JTAG下载电缆返回给PATA接口;针对写命令,可以把宿主机从PATA接口写入给FPGA的的数据,通过JTAG下载电缆传递给调试PC机,这些数据就可以写入到调试PC机上的文件中。这样,就通过Virtual JTAG,在调试PC机上虚拟出了一个可读可写的微型硬盘。
riple 这个虚拟的微型硬盘虽然速度慢(通过JTAG下载电缆传输大量的数据),但是填补了后端设备尚未开发完成的功能,构成了一个可以实际上板运行的系统。有了这个系统,我们就可以实际调试一个部分完成的产品,尽早发现已经完成部分在实现上的错误。这样做比在仿真环境中调试快得多和实际得多。
riple 同理,如果网络接口部分先开发完成,也可以不等待PATA接口的开发,采用Virtual JTAG虚拟前端设备的读写请求,进行网络接口部分及上层协议的硬件实测。
riple 4. Tcl的应用:对上述虚拟硬盘的扩展——模拟服务器网络响应的工具。在网络部分初步开发出来之后,跟服务器之间通过网络的交互测试就是必需的了。由于交互的复杂性,通过仿真来验证是不够的。服务器程序在原有的产品中早就开发成熟并已经长期使用了,但是在服务器上调试新产品的网络部分并不容易,交互的具体内容是看不到,也不容易控制的。
riple 我们需要的是模拟服务器对被测设备的响应,并获得交互过程中的各种命令参数。针对这一问题,在调试PC机上,我们用Tcl程序实现了对UDP报文的监听解析和返回报文的发送,模拟了服务器对被测设备发送的读写请求的响应。这里虽然没有用到Virtual JTAG,但是这一工具是在上述PATA接口虚拟硬盘工具成功使用的启发下开发的,也通过在调试PC机上读写文件实现了虚拟硬盘,并能在调试PC机上提供详尽的网络报文接收和发送参数。所不同的是,这一次虚拟硬盘的底层传输介质不再是JTAG下载电缆,而是真正的网络;上层的协议也不再是简单的ATA读写命令,而是运行在UDP/IP之上的RPC协议。
riple 通过这一工具,我们把原本复杂甚至神秘的服务器端操作,详细清晰地呈现在调试者眼前。这个在调试PC机上虚拟的网络硬盘虽然在性能上比不上在服务器上运行的网络硬盘,但是其容量和速度已经可以支持Windows操作系统的安装和启动了。在这一工具的帮助下,我们在开发中及早地实现了集成实测和调试,甚至在服务器宕机数日的情况下都能继续调试和开发。这一工具,进一步演化为演示系统中的服务器端程序,在一台运行Windows操作系统的笔记本上就可以实现Linux服务器的基本功能,简化了演示系统的搭建过程。
riple 上面这些工具是应用Virtual JTAG和Tcl辅助硬件调试的一个尝试,在我们的开发过程中得到了成功的验证。整理出来,供大家参考。
riple相关链接:
非常有用的Virtual JTAG——比串口还好用,
学习Tcl(四)——UDP收发包
用户1856254 2015-10-23 14:55
ash_riple_768180695 2015-10-22 10:44
用户1856254 2015-10-22 09:37
用户1132881 2010-9-7 13:33
ash_riple_768180695 2010-8-5 11:37
用户568747 2010-4-20 14:47
ash_riple_768180695 2010-3-10 11:48
ash_riple_768180695 2010-3-9 14:58
ash_riple_768180695 2010-3-9 14:55
用户1122702 2010-3-9 10:10