FPGA VTR quickstart example

2024-02-03 18:50
文章标签 fpga example quickstart vtr

本文主要是介绍FPGA VTR quickstart example,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VTR Quick Start — Verilog-to-Routing 8.1.0-dev documentation (verilogtorouting.org)

Setting Up VTR

我的 VTR 安装路径:

image-20221101190444593

VTR_ROOT = /vtr/vtr-verilog-to-routing

Running VPR

用VPR工具在特定的FPGA架构上实现一个简单的预合成电路(由lut和Flip-Flops组成)

Running VPR on a Pre-Synthesized Circuit

创建一个工作目录并移动到这个目录下:

mkdir -p /vtr_work/quickstart/vpr_tseng #Make a working directory
cd /vtr_work/quickstart/vpr_tseng #Move into the working directory

指定tseng 电路,存放在:$VTR_ROOT/vtr_flow/benchmarks/blif/tseng.blif

指定EArchFPGA结构,存放在:$VTR_ROOT/vtr_flow/arch/timing/EArch.xml

将这些文件传递给VPR工具,并指定路由的通道宽度为100:--route_chan_wdith 100

/vtr/vtr-verilog-to-routing/vpr/vpr /vtr/vtr-verilog-to-routing/vtr_flow/arch/timing/EArch.xml /vtr/vtr-verilog-to-routing/vtr_flow/benchmarks/blif/tseng.blif --route_chan_width 100

这将产生大量的输出,因为VPR实现了电路,应该看到类似的东西:

image-20221101191654510

这表明VPR成功了,以及VPR需要多长时间运行

VPR生成的各种结果文件,这些文件定义了电路实现:

image-20221101192857842

Visualizing Circuit Implementation

通过以下方法可视化电路实现:

重新运行VPR的分析阶段(--analysis)

启用VPR的图形用户界面(--disp on)

这可以通过运行以下命令来实现:

/vtr/vtr-verilog-to-routing/vpr/vpr /vtr/vtr-verilog-to-routing/vtr_flow/arch/timing/EArch.xml /vtr/vtr-verilog-to-routing/vtr_flow/benchmarks/blif/tseng.blif --route_chan_width 100 --analysis --disp on

运行结果:

image-20221101193142361


View the connectivity of a block:

image-20221101193345584

image-20221101193416555


View the internals of a logic block

image-20221101193705480

蓝色输入,红色输出


Running the VTR Flow

在已有的FPGA架构上实现我们自己的电路:

  • 首先使用Verilog硬件描述语言(HDL)对电路进行行为描述,快速简洁地定义电路的行为

  • 然后,使用VTR流将行为Verilog描述合成到电路网络列表中,并实现到FPGA上

verilog文件:$VTR_ROOT/doc/src/quickstart/blink.v*

这个Verilog代码创建一个顺序的5位寄存器(r_counter),每个时钟周期递增。如果计数低于16,它驱动输出(o_led)高,否则它驱动低

Manually Running the VTR Flow

创建一个工作目录,并移动到这个目录:

mkdir -p /vtr_work/quickstart/blink_manual
cd /vtr_work/quickstart/blink_manual

接下来我们需要运行三组主要的工具:

  • Odin II:执行“synthesis”转换我们的行为Verilog(.v文件)转换成电路网表(。由逻辑方程和FPGA架构原语(Flip-Flops, adders等)组成

  • ABC:执行“‘logic optimization”,简化电路逻辑,并执行“technology mapping”,将逻辑方程转换为可在FPGA上使用的查找表(LUTs)

  • VPR:执行封装,放置和路由的电路,以实现它的目标FPGA架构

Synthesizing with ODIN II

首先,我们将在Verilog文件上运行ODIN II,将其合成为一个电路网表,提供以下选项:

指定目标FPGA架构:-a $VTR_ROOT/vtr_flow/arch/timing/EArch.xml

指定合成的verilog文件:-V $VTR_ROOT/doc/src/quickstart/blink.v

指定生成的.blif电路网络列表的名称:-o blink.odin.blif

command:

/vtr/vtr-verilog-to-routing/ODIN_II/odin_II -a /vtr/vtr-verilog-to-routing/vtr_flow/arch/timing/EArch.xml -V /vtr/vtr-verilog-to-routing/doc/src/quickstart/blink.v -o blink.odin.blif

运行结果:

image-20221101194805427

Optimizing and Technology Mapping with ABC

优化和技术映射我们的电路使用ABC,提供选项:

-c <script>,其中<script>是一组命令,告诉ABC如何合成我们的电路。

我们将使用以下简单的ABC命令:

read blink.odin.blif;                               #Read the circuit synthesized by ODIN
if -K 6;                                            #Technology map to 6 input LUTs (6-LUTs)
write_hie blink.odin.blif blink.abc_no_clock.blif   #Write new circuit to blink.abc_no_clock.blif

对应的命令是:

/vtr/vtr-verilog-to-routing/abc/abc -c 'read blink.odin.blif; if -K 6; write_hie blink.odin.blif blink.abc_no_clock.blif'

运行时,ABC的输出应该类似于:

image-20221101195230026

然而,ABC产生的上述BLIF有一个问题:锁存(上升边缘Flip-Flops)没有指定任何时钟或边缘灵敏度,而这是VPR所需要的信息。

Re-inserting clocks

我们将通过运行一个脚本来恢复时钟信息,该脚本将从原始的ODIN BLIF文件中传输该信息(将其写入新文件blink.pre-vpr.blif):

/vtr/vtr-verilog-to-routing/vtr_flow/scripts/restore_multiclock_latch.pl blink.odin.blif blink.abc_no_clock.blif blink.pre-vpr.blif
Implementing the circuit with VPR

现在我们已经有了优化的和技术映射的网络列表(blink.pre-vpr.blif),我们可以调用VPR将其实现到EArch FPGA架构上(以与前面的tseng设计相同的方式)。然而,由于我们的BLIF文件不匹配我们显式指定的设计名称:

blink电路名称,和输入电路文件使用--circuit_file

为了确保生成的.net、.place和.route文件具有正确的名称,最后的命令是:

/vtr/vtr-verilog-to-routing/vpr/vpr /vtr/vtr-verilog-to-routing/vtr_flow/arch/timing/EArch.xml blink --circuit_file blink.pre-vpr.blif --route_chan_width 100

VPR完成后,我们应该看到结果的实现文件:

ls *.net *.place *.route
blink.net  blink.place  blink.route

image-20221101195909038

然后我们可以像往常一样通过在命令后面追加--analysis --disp on来查看实现:

/vtr/vtr-verilog-to-routing/vpr/vpr /vtr/vtr-verilog-to-routing/vtr_flow/arch/timing/EArch.xml blink --circuit_file blink.pre-vpr.blif --route_chan_width 100 --analysis --disp on

Toggle Nets 选择 Nets

Toggle Block Internal 选择 5

image-20221101200219207

image-20221101200401996

Automatically Running the VTR Flow

手动运行流的每个阶段是耗时的(而且可能容易出错)。为了方便起见,VTR提供了一个脚本((run_vtr_flow)来自动化这个过程。

首先,确保您已经激活了本教程开始时创建的Python虚拟环境:

source /vtr/vtr-verilog-to-routing/.venv/bin/activate

接下来,创建一个名为blink_run_flow的新目录:

mkdir -p /vtr_work/quickstart/blink_run_flow
cd /vtr_work/quickstart/blink_run_flow

现在让我们运行脚本($VTR_ROOT/vtr_flow/scripts/run_vtr_flow.py)传入:

电路verilog文件($VTR_ROOT/doc/src/quickstart/blink.v)

FPGA架构文件($VTR_ROOT/vtr_flow/arch/timing/EArch.xml)

还指定了选项:

-temp_dir .在当前目录

--route_chan_width 100一个固定的FPGA路由架构通道宽度

最后的命令是:

/vtr/vtr-verilog-to-routing/vtr_flow/scripts/run_vtr_flow.py /vtr/vtr-verilog-to-routing/doc/src/quickstart/blink.v /vtr/vtr-verilog-to-routing/vtr_flow/arch/timing/EArch.xml -temp_dir . --route_chan_width 100

运行结果:

image-20221101201029296

image-20221101201118982

可视化:

/vtr/vtr-verilog-to-routing/vpr/vpr /vtr/vtr-verilog-to-routing/vtr_flow/arch/timing/EArch.xml blink --circuit_file blink.pre-vpr.blif --route_chan_width 100 --analysis --disp on

image-20221101201223008

这篇关于FPGA VTR quickstart example的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/675065

相关文章

FPGA编译与部署方法全方位介绍

FPGA编译与部署是FPGA开发中的核心环节,涉及从代码编写、调试到将设计部署到FPGA硬件的全过程。这个流程需要经过创建项目、编写FPGA VI、模拟调试、编译生成比特流文件,最后将设计部署到硬件上运行。编译的特点在于并行执行能力、定制化硬件实现以及复杂的时钟管理。通过LabVIEW的FPGA模块和NI硬件,可以快速完成开发和部署,尤其适用于复杂控制与高性能数据处理系统。 1. FPG

FPGA开发:条件语句 × 循环语句

条件语句 if_else语句 if_else语句,用来判断是否满足所给定的条件,根据判断的结果(真或假)决定执行给出的两种操作之一。 if(表达式)语句; 例如: if(a>b) out1=int1; if(表达式)         语句1; else         语句2; 例如: if(a>b)out1=int1;elseout1=int2; if(表达式1) 语句1; els

FPGA开发:模块 × 实例化

模块的结构 对于C语言,其基本单元为函数。与此类似,Verilog的基本设计单元称之为"模块"(block)。对于整个项目的设计思想就是模块套模块。 一个模块由两个部分组成:一部分描述接口,一部分描述逻辑功能。 每个Verilog模块包含4个部分:端口定义、IO说明、内部信号声明、功能定义。且位于module和endmodule之间,如下: module block(a,b,c);inpu

LabVIEW环境中等待FPGA模块初始化完成

这个程序使用的是LabVIEW环境中的FPGA模块和I/O模块初始化功能,主要实现等待FAM(Field-Programmable Gate Array Module,FPGA模块)的初始化完成,并处理初始化过程中的错误。让我们逐步分析各部分的功能: 1. Wait for FAM Initialization框架 此程序框架用于等待I/O模块成功初始化。如果在5秒钟内模块没有完成配

FPGA随记——小说 可综合和不可综合

当然我在网络上找到了些可综合和不可综合的解释 感觉也很有参考价值: https://wenda.so.com/q/1378362174074040 综合就是把你写的rtl代码转换成对应的实际电路。 比如你写代码assign a=b&c; EDA综合工具就会去元件库里拿一个二输入与门出来,然后输入端分别接上b和c,输出端接上a 假如你写了很多这样的语句 assign a=b&c; assig

Xilinx系FPGA学习笔记(五)ROM的IP核学习

系列文章目录 文章目录 系列文章目录前言ROM IP分布式ROM生成ROM配置创建COE文件 块ROM生成如何快速生成Example Design 两种ROM对比 前言 最近在学习小梅哥的xilinx型FPGA开发板,一边学习一边记录,简化整理一下笔记 ROM IP 在 Memories &Storage Elements 下可以看到有两个与 ROM 相关的

基于FPGA的开源项目:FOC/SHA/USB/JPEG等

文章目录 [1. USB 1.1控制器](https://github.com/WangXuan95/FPGA-USB-Device)[2. FOC控制算法](https://github.com/WangXuan95/FPGA-FOC)[3. BSV高级硬件描述语言入门指南](https://github.com/WangXuan95/BSV_Tutorial_cn)[4. 基于XDMA的

LCD彩条显示——FPGA学习笔记10

部分素材来自原子哥 一、LCD简介         基本原理:在两块平行玻璃板中填充液晶材料,通过电场控制液晶分子旋转从而达到透光和遮光的目的。

LabVIEW开发FPGA方法与FIFO数据丢失处理

开发基于NI 7975R FPGA的系统涉及一系列流程,包括驱动安装、LabVIEW项目设置、开发调试、编译和与Windows系统的通信。重点在于FIFO的正确配置,避免数据丢失是关键环节之一,尤其是在使用高速数据流传输时。以下将详细介绍这些过程,并重点讨论FIFO数据丢失的原因与解决方案。 FPGA开发流程 驱动安装与工具准备:开发FPGA需要安装LabVIEW FPGA模块以及N

FPGA开发:可编程逻辑器件概述

PLD 1、什么是PLD? PLD指Programmable Logic Device,翻译为"可编程逻辑器件"。是20世纪70年代发展起来的一种新的集成电路,是一种半定制的集成电路。 PLD具有逻辑功能实现灵活。集成度高、处理速度快的特点。 PLD就像是一个可定制的积木盒,里面装满了各种各样的"电子积木"(逻辑门、触发器、寄存器等)。这些积木在盒子里原本没有固定的连接方式,但你可以根据