FPGA DEBUG FAQ
在FPGA上单步跟踪调试程序的时候,遇到比较多的问题,现总结成FAQ如下:
1.[Q]:执行CPU TLBclear的时候有异常,PC为什么跳转到0xbfc00380异常?
[A]:PC跳转到0xbfc00380,说明TLB填充异常,如果程序代码检查没有问题,则需检查FPGA的环境,比如修改CPU / DDR的clock,经过测试,AXI总线clock修改为50M的时候,此问题解决。
2. [Q]:单步跟踪到跳转指令b copydone的时候,为什么跳出到0xbfc00200异常?
[A]:正常情况下这个跳转指令是不会有问题的,跳出到0xbfc00200表明FPGA运行有异常,这种奇怪的问题,可以首先怀疑CPU的clock,修改AXI clock为55M后,仍然有概率性跳出的问题,则继续分析BIT文件,重新综合一版BIT文件后,此问题解决。
3. [Q]:AXI clock是否可以任意修改?
[A]:AXI clock不是越小越好,也不是越大越好,一定要调到一个合适的经验值。验证如下:
60M,则执行TLB clear时挂掉;
50M,能单步跟踪很远,但是在执行b copydone的时候,会跳出到0xbfc00200异常;
40M,读DDR失败;
45M,DDR下载失败;
80M,DDR下载失败;
70M,DDR下载失败;
55M,可以单步跟踪,一直执行到C语言的main主函数,OK;
4. [Q]:为什么执行81000804: cache 0,0(a1)这个非跳转语句的时候,直接跳到81000698: mfc0 a0,config呢?
[A]:在跑copydone这段代码的时候,执行81000804: cache 0,0(a1)这个非跳转语句的时候,直接跳到81000698: mfc0 a0,config,这个很奇怪,而且是反复循环的这样跳转,经观察,并不是什么异常,后来发现tcon的cache与HS3000的cache有差别,除了cache size不一样之外,cache channel也不一样,HS3000的cache channel有4路,而tcon的cache channel只有1路,修改cache 4路为1路之后,就ok了。
5. [Q]:为什么F8执行go的时候很快就停止了,PC指向了0xbfc00XXX?
[A]:start.S运行结束后,跳到了C的main函数执行,需要在main函数中加入while(1)死循环进行测试,否则程序很快就跑完了。
6. [Q]:为什么无法写spi flash?
[A]: 重新综合一个BIT文件后就可以了。
7. [Q]:为什么写spi flash后,重新上电,程序执行不对,串口没有打印?
[A]:首先huaya_uart.h文件中设UART_CLOCK为27500000。然后,DDR 没有初始化,即DDR的reg文件没有编译进bin程序中去,将reg文件中的数据用汇编在start.S中写入相关寄存器,重新编译后,将gzrom.bin下载到spi flash,重新上电后,串口即有打印了。
8. 为什么FPGA加入CPU复位键后,调试器中下载到DDR中的程序没有运行?
[A]:上电后,CPU默认从0xbfc00000开始执行,则在调试器中下载程序到DDR的程序是不被执行的。要想从DDR开始执行,则应该去抢到优先执行权,比如先按住CPU复位键,执行inn, 此时调试器在不断的发送inn请求,然后release CPU复位键,则能进入DDR运行模式了。