最近使用ds5操作fpga原型验证板子, 记录点使用方法。
1. fpga原型验证型号, 无非就是A家(Altera)和X家(Xilinx)... 我整的板子用的是赛灵思的Virtex UltraScale系列。 最高端的VU440, 查看官网描述, 最多可以支持4000万ASIC门电路的设计和验证。 另外当然还有控制板, 用的是常见的ZYNQ7000系列, 内部集成了一个ARMv7 Cortex-A9 处理器。 可以用作验证环境的控制, 如重启, 烧录bitfile, 交互, 控制等等。
2. 介绍下fpga, Field Programmable Gate Array 即现场可编程的逻辑门阵列。顾名思义, 它是一个可以编程改变的内部门电路连线的芯片, 除了fpga, 其他诸如asic, dsp, cpu啥的各种芯片, 都无法动态改变内部的逻辑门电路。
3. 我这边也不搞芯片设计, 不写verilog, 反正拿到bitfile, 烧录到fpga上就开始整。 从bootloader到内核, 再到各种功能验证。 基本和arm端整Linux没啥区别。
4. ok, 由于我这边arm端只会烧写下bitfile, 修改下时钟频率。所以fpga这端bootrom能起来后, 就直接接ds5进行操作了。
这里记录下ds5使用过程中遇到的一些问题:
Q: ds5查找不到usb设备? (ds5用usb和客户端主机相连)
A: ds5 reset按钮按下试试...
Q: ds5连接不到target? 说target不存在或连接线问题?
A: 嗯, 可能是bitfile有问题, 芯片bootrom都没起来... (和澎湃S2一样?)
我这边换了几个bitfile, 还是连接不上, 后来发现是fpga全局时钟没配置。(GCCLK?) 正确配置时钟频率后bootrom的log就能出来了。
Q: bootrom代码到底在哪里?
A: 关于bootrom, 我的感觉是bitfile中已经含有了。即最开始的这部分bootrom代码已经固化成了硬件逻辑电路了。即最开始的start.s, BL1的代码, 都经过编译, 汇编 以及其他的一些方式变成bitfile的一部分了。不管怎样, 这部分代码 跟芯片本身逻辑门电路一样, 流片后就无法改变了... 类似三星以前的stepping stone, 利用跳线方式可以支持很多种启动方式, 比如Nand 启动, 可将Nand Flash的前4K, 上电后自动拷贝到特定的sram中。stepping stone这个机制本事其实就是bootrom。也是soc中的特定机制, 流片后无法改变。
Q: ds5连接上后为啥只有一个cpu核心?
A: 前面说了赛灵思VU440系列也就只能支持4000万ASIC门电路的模拟... 现在的soc晶体管数量动则几十亿上百亿的级别。 比如麒麟980采用台积电7nm工艺,内部集成了69亿个晶体管。最新的990集成了103亿个晶体管... 所以千万数量级的fpga片子肯定无法把所有ip设计都放入里面。故基本都是按模块只放需要验证的ip进去。 例如需要验证usb控制器, 那就把cpu, usb控制器, dma, gic一类的必要ip放进去, 即可。包括cpu核心, fpga内部不一定能放下多个核心, 所以有些bitfile就放一个cpu核心是正常的。
Q: ds5如何配置?
A: 创建配置数据库,选择platfrom... autodetect到相应target, 之后就可以创建调试工程, 关联该数据库, 可以attch上板子, 利用jtag控制内存, cpu, 寄存器等。基本和trace32操作类似。具体就不详细贴了, 可参考相关手册。
Q: ds5启动uboot
A: 我都是用ddr boot, 这个简单, 编译uboot, 将uboot镜像加载到指定内存。(如0x2000000)
pc指向entry point。 (一般是reset异常向量处) 执行即可。
Q: ds5启动linux内核
A: ddrboot简单, 把内核, 设备树加载到内存指定地址, 如果使用initrd作为最终根文件系统, 可将initrd编入内核镜像。
最后利用uboot的boot命令。 如未压缩的Image内核镜像, 利用booti kern_addr fdt_addr boot_args啥的,
如果是uImage格式, 可利用bootm方式。
================================================================================================
ok... 就先记录这些。
2019.10.11