本文主要是介绍FPGA VTR quickstart example,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
VTR Quick Start — Verilog-to-Routing 8.1.0-dev documentation (verilogtorouting.org)
Setting Up VTR
我的 VTR 安装路径:
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
指定EArch
FPGA结构,存放在:$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实现了电路,应该看到类似的东西:
这表明VPR成功了,以及VPR需要多长时间运行
VPR生成的各种结果文件,这些文件定义了电路实现:
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
运行结果:
View the connectivity of a block:
View the internals of a logic block:
蓝色输入,红色输出
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
运行结果:
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的输出应该类似于:
然而,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
然后我们可以像往常一样通过在命令后面追加--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
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
运行结果:
可视化:
/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
这篇关于FPGA VTR quickstart example的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!