FPGA开发工具链和调试技巧


20250306205932

前言

一些小笔记,让人快速搭建起FPGA开发工具链,提高开发效率的方法。

工具链搭建

QuestaSim联合Vivado进行仿真

由于VIVADO自带的仿真有一定的局限性,比如速度比较慢以及视图内容不够全面,所以大家一般会用其他的专业仿真工具来承担仿真的任务。

1.安装并破解QuestaSim,这个网络上有很多教程

QuestaSim24.1链接: https://pan.baidu.com/s/1XckFnuW6j5c2oipXrjhuAQ 提取码: 96xp

2.把Vivado自带的库模型编译一下

20250306172027

20250306172033
3.VIVADO中的settings有关仿真的部分改到questasim

指定库模型路径,最好勾选log_all_signals来保证可以随时查看所有的信号,否则的话没有一开始添加到窗口中的信号是不会被记录的。

20250306172047

4.然后就可以直接通过点击VIVADO的Run Simulation来启动QuestaSim了

QuestaSim小技巧快捷键

在波形上Tab: 跳转到下一个变化点

Shift+Tab:向左查找上一个跳变沿

Ctrl+鼠标左键拖动: 放大所选区域

F: 波形正好铺满屏幕

C:放大波形

X:缩小波形 (这个需要自己设置一下)

Ctrl +鼠标滚轮:波形的放大缩小
L:缩放至上次
R: 按照范围缩放
方向键:上下左右滚动(以行为单位)
翻页键:上下滚动(以页为单位)
Ctrl+左右方向键:左右滚动(以页为单位)

使用VSCode开发Verilog,包含语法检查,自动格式化,定义速览

没人乐意使用VIVADO自带的代码编辑器,稀烂的字体和瞎眼的白屏以及几乎没有的语法检查,所以大家一般都是用sublime或者vscode。而由于vscode插件众多和便于多电脑之间的配置同步,那必然还是使用VSCode。

  • 安装VSCode,在Vivado工程设置中把Text editor设置为VSCode,使用如下参数,这样就可以直接从Vivado中调出VSCode
1
cmd /S /k "code -g [file name]:[line number]"

20250306172100

  • 把Vivado的语法检查器加入系统路径,在Verilog插件的设置中把linter设置成xvlog,然后每一次保存后如果有错误就能看到语法检查的提醒

20250306172108

20250306172116

  • 安装SystemVerilog and Verilog Formatter格式化工具插件,在扩展设置里输入如下参数,第二栏使用win64的版本
1
--indentation_spaces=4 --named_port_alignment=align --port_declarations_alignment=align --module_net_variable_alignment=align

20250306172127

20250306172137

然后就可以右键,格式化文档,用这个插件,对代码进行格式化

  • 安装Ctags以支持变量定义快捷查看和跳转

先下载Ctags的https://github.com/universal-ctags/ctags-win32/tree/2020-09-15/23d50b5d

放到系统路径中,在VSCODE中的Ctags Path添加’ctags’

安装CTags Support插件

然后在工程文件夹下使用CMD终端输入ctags -R -f .tags

20250306172149

重启VSCode,现在把鼠标放在信号上就能看到定义了

20250306172158

按Ctrl然后点击信号就能跳转到定义

20250306172211

右键快速查看,速览定义就能直接对信号定义做出修改

调试技巧

在Vivado 综合为 Verilog “include” 文件定义正确的路径

有些时候我们的一些define需要在工程的各处被引用,所以需要进行全局的include来保证仿真器了解全局定义,否则的话编辑器只会检查同文件夹下的定义。

1.文件属性里设置成Global include

20250306171744

2.在Setting里搜索include可以找到工程Setting下的编译文件的位置

20250306171826

使用markdebug的方法将信号添加到ILA中

一种相对方便快捷的将要查看的信号添加到ILA中的方法,不用调用ILA IP核,每次都要修改。也更容易修改每个信号所对应ILA时钟域,一键产生多个对应的ILA。

1.先将要观测的信号前方添加上(mark_debug = “true”)

20250306171837

2.在综合中打开点击setup debug

20250306171844

3.如果是在之前的基础上再添加新的观测信号,选第一个,如果是从零开始,选第二个

20250306171850

这里一般不选,如果选了的就会把所有的信号都进行分析,我们这里只需要我们标记过的信号

20250306171857

4.在接下来的页面点击Find nets to add,在弹出的界面中输入信号的名称,并且与上一个markdebug为true的条件,这样就能精确搜索到我们需要的信号。然后点击OK将搜索结果添加到待调试的信号列表中。

20250306171905

5.然后点下一步,选择采样深度,一般1024足矣。Input pipe stages”用于设置待测信号和其采样时钟之间的同步级数。如果在上一个设置时钟域页面中,存在与其采样时钟之间是异步的待测信号,则为了避免亚稳态,此数值最好不要低于2。由于本例中的两个待测信号的其采样时钟是同步的,所以可以设置为0。然后就可以点击完成,此时VIVADO会执行一段时间的分析,将信号添加进来。此时执行比特流生成,就能有新抓的信号。

20250306171916

固化FPGA的比特到FLASH上

这里指的是非ZYNQ的普通FPGA的固化,ZYNQ的FSBL要更复杂一点。

让板卡上电后自动加载固化好的比特,无需JTAG烧录。

注意:要想让板卡上电加载固化比特,必须拔掉JTAG,否则的话会导致无法加载。

生成固化用的bin文件

首先需要确定FPGA板子上的FLASH型号,即4个关键参数,生产商,大小,接口,位宽

例如我这颗,接口类型是spi,宽度支持x1,x2,x4,容量大小是256Mb即32MB

20250306171927

在Tools中选择Generate Memory Configuration File

20250306171934

这个界面,第一行Format可以选择mcs或者bin,这两个的区别在于,bin有个优点是文件大小相比mcs会小一些,带来的效果就是会烧录的更快以及上电后加载的更快(存疑?)。而mcs会携带头文件信息和校验,很适合于multiboot的操作(参见可重构那一篇文),如果仅仅是固化的话,bin就够了。

Memory Part:选择好FLASH器件,这里需要查阅板卡的手册

Filename:起一个名字

Interface:选择SPI的位宽,这个需要查阅FPGA板卡的原理图,找出位宽是多少,并在工程中通过下面这条约束来控制

set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]

Load bitstream files:需要打上勾,其他的不用动,在Bitfile中选择所需要固化的bit

下面的不需要勾选,直接点击OK完成bin文件的生成。

20250306171956

固化到FPGA上

打开硬件管理器,自动连接到板卡

右键FPGA芯片型号,选择add configuration memory device

20250306172008

在弹出的界面选择好memory型号,保持和前面是一样的,再选择好之前生成的bin文件,直接点击OK,就可以完成比特的固化了。

20250306172015

这里解释一下这个过程,Vivado通过JTAG将一个小型烧录程序加载到FPGA的RAM中。这个程序会通过JTAG读取来自电脑的bin文件数据,并通过SPI接口将bin文件写入FLASH存储器。所以我们一开始就需要规定好SPI的宽度,并且定好FLASH的类型,否则参数不对是无法正常工作的。

在线画时序图的网页:https://wavedrom.com/tutorial.html



文章作者: Allen Hong
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Allen Hong !
  目录