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

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值