找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 514|回复: 0
打印 上一主题 下一主题
收起左侧

FPGA 开发专题 | 手把手教你用 VScode 搭建轻量级 Verilog 仿真环境 | 真保姆级

[复制链接]
跳转到指定楼层
楼主
本帖最后由 电子爱好者没错 于 2023-8-22 20:31 编辑

FPGA 开发专题 | 手把手教你用 VScode 搭建轻量级 Verilog 仿真环境 | 真保姆级

目录:


  • 零、写在前面
  • 一、来瞅瞅我的实现方案
  • 二、代码高亮和语法检查——环境准备
    • 2.1 VScode 及相关插件安装
    • 2.2 iverilog/make 安装
  • 三、一个脚本搞定一切!编译、RTL 时序仿真全过程!
    • 3.1 脚本实现原理
    • 3.2 项目演示:带你实现一个全加器


图:雷元素客晴


全文共 3360 字,阅读大约需要 5 分钟

只要附着雷元素力,刻晴的发簪就能化为一柄锐利无比的小刀。

刻晴的三点养成日记:
  • 超载反应造成的是火元素伤害,超导反应造成冰元素伤害、且降低的是物理防御

  • 利用元素反应造成的伤害,雷、冰、火三种史莱姆都会对应免疫

  • 触发元素反应造成的伤害,只吃元素精通加成,并不享受攻击力的加成


刻晴这种如此可爱的角色,养成不易,也要搭配特殊的阵容,来发挥她的最佳效果。FPGA 的开发也是这样,各种仿真软件阵容过于繁复,往往我的需求是写 verilog/VHDL 代码并仿真时序,并不想安装各个厂家(如 Quartus,Vivado)的软件,有没有一种轻量、高颜值、简单好用、功能强大且免费的仿真环境呢?

本篇作为保姆级教程,将会手把手带你配置 FPGA 轻量级开发环境和使用我的脚本!该方案支持 windows 和 linux 系统。

本文首发于在下石同学 未经授权 不得转载

文 | 在下石同学




零、写在前面


FPGA 开发离不开各种仿真,尤其是 RTL 级这种最基本的逻辑功能性仿真,对 FPGA 及开发流程还不了解的童鞋请看我的往期文章:

往期文章链接






尽管现在许多 FPGA 厂家的软件功能都很齐全,但是代码编辑界面还保留着上世纪的风格,特别是有些仿真工具入门门槛较高,安装起来也比较麻烦,FPGA 开发中的大多数时间都花费在 verilog/VHDL 代码编写和 RTL 仿真上,往往我的需求是写 verilog/VHDL 代码并仿真时序,并不想安装各个厂家(如 Quartus,Vivado)的软件,有没有一种轻量、高颜值、简单好用、功能强大且免费的仿真环境呢?








答案是使用 iverilog !



为什么要用 iverilog ?实际上 VHDL/Verilog 仿真多使用 Modelsim 这种专业软件,但是 iverilog 足够轻量,并且用作科研和开发完全不用担心版权的问题,然而 iverilog 开发需要用户使用一些脚本和命令行,这一点就劝退了大部分初学者,所以我这里就对该部分进行封装,确保大家只需要简单的几条指令就可以实现绝大多数的 FPGA 的 RTL 级仿真工作,同时配备 Vscode 的语法高亮和代码检查。

授人以鱼不如授人以渔,同时也带领大家了解我的方案细节和底层,帮助大家更好了解 iverilog 编译和仿真过程都经历了什么。





一、来瞅瞅我的实现方案

整个方案实现的过程并不复杂,可以类比我们在小学一年级就学过的 C/C++ 编译过程,如下图所示,VScode 作为工程组织和写代码的工具,通过安装插件支持 Verilog/VHDL 的语法高亮、关键词提示、语法检查等, Verilog/VHDL  的文件都以 *.v 作为后缀。注意看图中虚线包围的部分,所有的 *.v 文件通过 iverilog 工具完成编译生成 *.out 文件,再通过vvp 工具运行*.out 文件,就可生成*.vcd 波形文件,最后使用gtkwave工具查看波形文件,至此,整个编译到波形查看的过程就完成了,如图中虚线部分所示。

可以看到,编译的过程稍微有些许繁琐,为了简化这个过程,我使用了make工具,通过编写makefile文件来控制整个编译的过程,熟悉 linux 下 C/C++ 开发的同学对make 应该非常熟悉,不熟悉的同学可以自行搜索,文末我也会放置相关的参考链接。通过make来实现虚线框的过程,这样用户再也不用考虑编译过程的细节了,一条指令搞定所有!

D:\Xzhao\Documents\OfficialAccounts\Article\2023.07.01\photos\Snipaste_2023-07-02_14-24-23.png

图:FPGA 开发轻量级环境搭建

二、代码高亮和语法检查——环境准备 2.1 VScode 及相关插件安装

首先安装 VScode (Visual Studio Code) ,安装具体可参考官网Visual Studio Code - Code Editing. Redefined

点击插件扩展,快捷键Ctrl+Shift+X,在目录栏里搜索,即可找到对应的插件,点击插件上的install即可完成安装,如下图所示:

VScode 下几款插件推荐安装:

  • Chinese (Simplified):更改系统语言为中文
  • Verilog HDL:提供语法高亮
  • Verilog_Testbench:testbench使用自动实例化
  • Verilog-HDL/SystemVerilog/Bluespec SystemVerilog:提供语法高亮和检查

我们点击每一个插件,可以在页面下看到关于使用及详细介绍,如下图:

2.2 iverilog/make 安装

这里我们需要安装三个软件(所有的安装链接附在文末)

  • iverilog:VHDL/Verilog 的编译器,提供整个编译、链接、生成波形文件,是我们的主角
  • make:管理代码工程及解决相关依赖的自动化脚本工具,搞C/C++开发的同学应该非常熟悉了

linux 操作系统下安装 iverilog/make:

# 安装 iverilog/make
$sudo apt-get install iverilog
$sudo apt-get install gtkwave
$sudo apt-get install make

# 验证安装:打印版本信息
$iverilog -v
$make -v

windows 系统安装  iverilog/make:

到 iverilog 官网下载安装包,http://bleyer.org/icarus/,根据自己电脑系统,我这里选 x64:

安装的时候记住自己的安装路径,安装完毕,我们将安装路径里的bin和gtkwave\bin添加到环境变量 path 中:

需要测试一下 iverilog 环境变量有没有添加成功,我们按下 WIN+R按键,调出运行窗口,输入cmd,打开命令行:

在命令行里,我们输入 iverilog -v,输出如下:

可以看到 iverilog 打印的版本信息,表明安装成功了!

windows 安装 make 工具稍微麻烦一点,需要先安装 mingw。

下载 mingw 并安装:https://sourceforge.net/projects ... wnload?source=files

添加MinGW\bin到系统的环境变量 path 中:

打开MinGW\bin路径,找到mingw32-make.exe,将该文件复制一份,同时改名为make.exe:

同样的,我们在命令行输入 make -v,看到打印的版本信息,也说明安装成功。

至此,软件安装及环境配置完毕,接下来是如何建立功能并完成编译和时序仿真,让我们再回到第一节,复习一下下面这张图:

这个过程虽然比较麻烦,但是别担心,我们用一个makefile脚本搞定全过程,只需要三条指令哦!

三、一个脚本搞定一切!编译、RTL 时序仿真全过程! 3.1 脚本实现原理

用户只需要编写makefile文件来组织工程文件的相互依赖关系和编译过程,最后使用make工具即可实现编译和运行,下面贴出我的makefile:

# ------------------------------------------------
# Generic Makefile (based on iverilog)
# @Author : sudo
# ChangeLog :
# 2023-03-22 - creat this project
#   2023-03-22 - first version
# ------------------------------------------------

######################################
# target
######################################
TARGET = vout

#######################################
# paths
#######################################
# Build path
BUILD_DIR = build

######################################
# source
######################################
# V sources
V_SOURCES =  \
./full_adder_tb.v \
./full_adder.v \
./half_adder.v

# # V includes
# V_INCLUDES =  \
# -Itest/full_adder

#######################################
# binaries
#######################################
PREFIX =
# The iverilog compiler bin path can be either defined in make command via VCC_PATH variable (> make VCC_PATH=xxx)
# either it can be added to the PATH environment variable.

ifdef VCC_PATH
CC = $(VCC)/$(PREFIX)iverilog
VP = $(VCC)/$(PREFIX)vvp
else
CC = $(PREFIX)iverilog
VP = $(PREFIX)vvp
endif

# default action: build all
all:wave.vcd

wave.vcd:$(BUILD_DIR)/$(TARGET).out | $(BUILD_DIR)
@$(VP) -n $^
@echo ---------------------------------------
@echo build finished...
@echo "use <make plot> for plot the waveform"
@echo "use <make clean> for clean"
@echo "use <make> for build again"

$(BUILD_DIR)/$(TARGET).out:$(V_SOURCES) | $(BUILD_DIR)
@$(CC) -o $@ $(V_SOURCES)

$(BUILD_DIR):
@mkdir $@

.PHONY:plot
.PHONY:clean

# windows
clean:
@del wave.vcd
@rmdir /Q /S $(BUILD_DIR)

# linux & mac
#clean:
# rm Rf wave.vcd $(BUILD_DIR)/*.out

plot:
@gtkwave wave.vcd


用户指令只有三条:

  • make:完成整个编译过程并生成波形图文件
  • make clean:清理所有的编译生成文件
  • make plot:绘制波形图

整个makefile的内容大家可以根据自己的兴趣研究,不懂也完全没有关系,以后写代码的时候,只需要把我这个文件放在工程目录的顶层,只需要记住这三条指令,我们就可以愉快的玩耍了!


3.2 项目演示:带你实现一个全加器

这里通过实现一个简单的全加器,来演示整个环境如何使用。

首先新建一个文件夹full_adder,使用 VScode 打开,在该文件夹中新建三个文件half_adder.v、full_adder.v、full_adder_tb.v:

half_adder.v文件内容:


编写test_bench tb_full_adder.v文件内容:


`timescale 1ns/1nsmodule full_adder_tb();reg in1,in2,cin;wire cout,sum;initial begin    in1=1'b0;    in2=1'b0;    cin=1'b0;endalways #10 in1={$random}%2;always #10 in2={$random}%2;always #10 cin={$random}%2;initial begin    forever begin        #10;        if($time>1000)$finish;    endendinitial begin    $display("hello, 在下石同学!");    $display("hello, 在下石同学!");    $display("hello, 在下石同学!");    // $dumpfile("wave.lxt"); // 指定用作dumpfile的文件    $dumpfile("wave.vcd"); // 指定用作dumpfile的文件    $dumpvars; // dump all varsendfull_adder u_full_adder(    .in1 ( in1 ),    .in2 ( in2 ),    .cin ( cin ),    .sum ( sum ),    .cout  ( cout  ));endmodule

全加器是一个比较简单的例子,但是我依旧按照一般工程采用自顶向下的设计方法,将一个全加器的实现分成两个 module,full_adder作为顶层模块调用half_adder,毕竟这样更具有普适性。


在tb_full_adder.v中,使用 $dumpfile("wave.vcd")指定仿真波形文件类型,同时向控制台打印hello, 在下石同学!字符串。

我们编写*.v代码文件后,把makefile文件放在目录顶层,然后打开该文件,找到文中V_SOURCES,在后面添加你编写的所有*.v文件的相对路径,本示例编写了三个文件:full_adder_tb.v、full_adder.v、half_adder.v,将这三个文件路径添加进去,\符号代表换行符,最后一行不需要添加,如下所示:


# V sources
V_SOURCES =  \
./full_adder_tb.v \
./full_adder.v \
./half_adder.v


每次编写完自己的 verilog/HDL 代码后,只需要在makefile中添加V_SOURCES就可以了,其他地方不用动,然后在makefile所在的路径打开命令行,输入指令make:

我们可以看到,代码编译成功,并且成功运行 full_adder_tb.v文件中的 $display("hello, 在下石同学!");语句,向控制台打印hello, 在下石同学!这一串字符。

同时,我们查看发现项目多了一个build文件夹和名为wave.vcd的波形文件,这都是编译过程生成的文件。

项目编译就完成了,要查看 RTL仿真波形图,我们只需要接着在命令行输入指令make plot:

屏幕中立刻弹出 RTL 仿真波形图,我们可以点击查看:

我们在命令行输入指令make clean,可将编译生成的文件全部删除掉,方便下一次重新编译。

我们记住用户的三条指令:

  • make:完成整个编译过程并生成波形图文件
  • make clean:清理所有的编译生成文件
  • make plot:绘制波形图

**到此为止,我们就可以愉快的进行 verilog/VHDL 代码仿真啦! **

该项目源码我已经上传到我的 github 仓库上面啦,大家可以直接下载:

github URL:https://github.com/nezhajun/full_adder

安装了git的小伙伴也可以使用git clone下载:

$git clone https://github.com/nezhajun/full_adder.git

文中涉及相关软件工具下载链接和参考:




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表