【技术分享】FPGA杂记之安路TD中chipwatcher工具的使用和注意事项

日期:2021-02-01 作者:币游app 返回列表

一、什么是chipwatcher


在编程开发过程的调试阶段,可以借助一些编译环境集成的工具帮助币游app更好地定位问题。当币游app完成一份工程代码但是观测不到币游app想要的结果时,币游app需要进一步确认是哪部分的代码出现了偏差导致得不到币游app想要的结果。


对于MCU来说,币游app可以借助JLINK仿真器来实现断点测试,进而观察每一步的数据变化,从而定位到问题所在;对于FPGA而言,想要观察内部信号的变化,也有对应的工具可以使用。


这些工具,不同的芯片厂商根据自家的编译环境集成了他们各自的工具,例如,Xilinx ISE的chipscope,altera quartus II 的SignalProbe等。本文中安路TD的chipwatcher也是用于观测电路内部信号变化的工具,可以认为这是一款类似于逻辑分析仪的工具,只不过观测的信号不是芯片引脚上面的信号,而是电路内部的信号。


当币游app需要定位问题的时候,可以在工具中添加币游app想要查看的信号,通过抓取波形来确认信号是否在根据币游app的需求进行变化。


二、Chipwatcher使用流程


首先,一个FPGA工程常见的构成如下:


1. 功能代码文件:后缀为.v的文件,通俗地讲就是币游app自己写的代码。


2. 例化的IP文件:通过编译软件来例化的IP的代码,不同厂商例化后的IP文件名后缀有差异,安路的TD中直接将例化完毕后的.v文件加入工程即可。这类文件不是必须的,有用到需要的IP就加,没有不加。


3. IO约束文件:用来定义整个工程的输入输出信号对应的具体芯片引脚是哪个。这类文件可以不加,不加的话编译工具会自动分配IO口。


4. 时钟约束文件:即SDC文件。同IO约束文件,不加的话编译器会自己约束,因此当工程较大时序较为复杂时通常需要币游app自己约束。


以上四种文件通过编译后一起生成的整个工程的bit文件烧录进FPGA芯片后,假设代码功能正常,则芯片开始工作。


假设功能不正常,当币游app想要观察电路内部信号的时候,币游app还需要在工程中加入另一类文件,即第五类文件,然后将这五类文件统一打包成bit文件后下载进FPGA,此时才可以利用工具观测和抓取到币游app想看的信号。

这第五类文件,在TD中,即为Chipwatcher工具生成的.cwc文件。


下图展示了一个加入.cwc文件后的工程目录(该工程中未加入时序约束文件):


1611906605292947.png


生成cwc文件的过程如下:


Tools -> Debug Tools -> chipwatcher


1611906617914639.png



进入到chipwatcher页面:


1611906677350485.png



如上图,①区是选择采样时钟和采样深度,采样时钟的选择注意要选择全局时钟中频率最高的时钟,采样深度越深(即数值越大),最终生成的bit文件所占用的芯片资源越多。


②区是添加想观察的信号的区域,添加方法:在该区域右键后,选择add nodes进入到信号选择的页面,如下:


1611906703269298.png



如图可以选择想要观察的信号至右侧,全部选择完毕后,点击OK即可。


需要注意的是,有些信号会自动被编译器优化,而在list中不被显示,此时若是想观测对应的信号,可以回到币游app的代码中加上如下关键词即可:


1611906725543453.png



添加完想要观察的信号后,设置触发条件。


1611906741615946.png


如图,在trigger enable栏选择触发信号,在rigger condition栏选择触发条件(右键)


触发条件共有以下几种:


1611906801264182.png



分别表示低电平触发、高电平触发、上升沿触发、下降沿触发和边沿触发。


1611907014796725.png



在如上图处设置触发信号之间的关系。图中设置为或,即只要其中一个信号满足条件即可。


上图中的整体触发条件设置完毕后可叙述为:当int_mem_we信号或int_mem_re信号其中之一为高电平时,抓取当前int_mem_wdata[31 :0]、int_mem_addr[10 :0]、int_mem_rdata[31 :0]、int_mem_we和int_mem_re的波形。


编辑完毕后即可保存文件。


1611907048752659.png


保存后生成对应的cwc文件,同时将文件加入工程,最后编译下载至开发板。


1611907069119598.png



(注释:①为将生成的cwc文件加入工程,②为编译工程,③为将bit文件下载至开发板)


下载成功后,返回chipwatcher设置页面,如下图选择single trigger,即单次触发。


1611907089301165.png


当程序运行并满足触发条件时,chipwatcher会抓取到波形,如下:


1611907111255057.png


三、FPGA调试与MCU调试的一些思路差异


Chipwatcher的调试过程大体如第二章中所示,但是很长一段时间,我并没有在chipwatcher中观察到任何波形,究其原因是没有从MCU调试的思维转变过来。


MCU的断点调试,可以认为是一步一步执行的,没有点击下一步之前,程序会一直停留在当前位置(除非程序跑飞)。


而FPGA调试没有这种机制,当bit文件下载至芯片后,程序是一直执行的,而点击single trigger后只不过是当满足触发条件时抓取当前波形而已。抓取完毕会显示波形,程序却依旧在继续执行,不会停留在抓取完毕的那一刻。


当我使用chipwatcher观察AHB协议传输时,没有在数据线和地址线上面观察到波形就是没有意识到这点。在bit文件下载进芯片时传输就已经开始了(对比MCU的调试,通常MCU调试开始时,环境一般会在main函数起始自动设置断点),假设传输在我开启触发按键前就已经完成,则传输线上就会一直观察不到数据,触发条件也会一直不成立。


因此,为了确保能够顺利抓取到传输的数据,需要在传输前设置相应的延时,保证当点击single trigger,chipwatcher开始根据设置的触发条件抓取波形时,数据的传输还没有开始。


例程是MCU和FPGA根据AHB协议进行通信,因此后来我在MCU的工程中添加了一段延时:


13.png



确保留出足够的时间来操作chipwatcher。

返回列表