LiteX/VexRiscv 简介与使用 (二) 始有昼夜

好的,来到第九天了。今天我们将来搭建Linux on LiteX/VexRiscv的建置环境。
因笔者不太确定是否该预设阅听者的背景与职能,所以决定这一篇还是会比较偏向介绍与基础环境的编译与安装。

出於笔者是一个开放原始码的爱好者,也希望此系列文章每个环节,都能在现行技术允许下,采用开源的技术、资源来进行。所以,此次我们用於承载LiteX/VexRiscv的FPGA板,是名为 OrangeCrab 的开放设计开发板,可於此连结购买[0-1],其 PCB 板的设计档案也有放置於其作者的Github repo之中[0-2]、可用开源的layout工具Kicad作检视与编辑。除了PCB design的开放外,上面承载的FPGA晶片,也是可以使用完全end-to-end开放的EDA工具链:YoSYS-NextPNR-prjtrellis,进行设计与开发的Lattice ECP5系列。

笔者猜测,会需要在此处对FPGA是什麽,进行一个初步的讲解。
一如程序码会透过编译器、编译成指令後,可由硬体来执行;在现代的CPU/处理器与其他数位电路的开发上,我们会采用硬体描述语言来进行设计,尔後透过所谓的「电子设计自动化」(Electronic Design Automation)工具进行处理,这时会有两条相似但不同的歧路,一边会走向晶圆制造、最後通常会产生出晶圆厂用以进行蚀刻的GDS-II光罩档案,这就是通常概括称为〝tape-out〞的晶圆制造环节,而每次的成本都会是数百万起跳的庞大开销;故可以想见,我们不可能每次做完一些电路设计的改动,就去tape-out,也有可能你的电路设计产品本质,本身就是像软件一样快速改动、随需求变迁汰换极快的物品,路如近年很红的AI加速器、加密货币挖矿等等,所以,有种「可以被程序化地变成其他电路设计」的产品,便出现在了市场上,在过去有所谓的可程序化装置(Programmable Logic Device),随着技术的沿革,现在发成所谓的「现场可程序化逻辑闸阵列」(Field Programmable Gate Array)、简称FPGA。其原理面来说,可以概念性的说,每一个FPGA chip,会有一定数量的Logic Cell(逻辑基础单元),内含lookup table以及存储用的flip-flop,这是因为所有的boolean logic,都可以用真值表的查值与资料存储来表达;而近代的FPGA、则还会有其他各式常用的电路,放置在特殊的block中,以备给对应的电路设计使用。

那麽,确切来说,EDA工具链在FPGA这一侧有什麽事情要作?

可以切成三段来说,第一段称为synthesis(合成),也就是将高阶的硬体描述语言,例如Verilog/VHDL,转换成低阶的gate-level、或着上面有说的FPGA厂商特化的硬体电路来表达,这相当於编译器的「编译」阶段,先转成了类似组合语言的东西。而目前台面上最主流的开源设计,其名为YoSYS。

第二段,我们称为Automatic Place-and-Route (APR,自动布局与绕线)。顾名思义,就是把第一阶段的设计,真真正正的想办法放上FPGA chip之中,例如LC的大小限制,绕线有没有导致timing fail ...... 等等问题。这也是EDA工具演算法最精华的一段。目前开源实做中,以 VPR 与 nextpnr 两组工具各有其支援的范畴。

第三段,是所谓的Bitstream Generation(bitgen,位元流产生)。FPGA chip上面其实多半都会有一个自己的小控制器,在上电时去作读取 Configuraion RAM、甚或透过SPI等等其他方式,去flash上面寻找厂家定义的指令,开始去设定之前说的真值表与其他需要初始化的资源。而将第二阶段的产物,转换成这颗控制器认的得的指令,便是bitstream generator,而这没有通用的後端,因为每个FPGA厂商、乃至FPGA不同产品线,他们所用的bitstream format可以完全不一样。针对我们这次挑的FPGA : Lattice ECP5,有一套开源的prjtrellis可以使用。

概念解说到这边,接下来我们动手开始安装吧。
目前这三套工具都是还在近乎beta的开发阶段,所以建议可以直接clone github repo来拿最新的程序码,笔者今年八月时在测试相关事情时,就发现旧版的nextpnr有状况(绕线时间过长—,在社群上询问时,被告知相关的bug从一月一路修到了六月多才完成。

mkdir /path/to/workspace
cd /path/to/workspace
mkdir sysroot
git clone --recursive https://github.com/YosysHQ/yosys
git clone --recursive https://github.com/YosysHQ/prjtrellis
git clone --recursive https://github.com/YosysHQ/nextpnr
push yosys
make PREFIX="/path/to/workspace/sysroot" CONFIG=gcc ENABLE_TCL=1 ENABLE_ABC=1 ENABLE_GLOB=1 ENABLE_PLUGINS=1 ENABLE_LIBYOSYS=1 ENABLE_PROTOBUF=1 ENABLE_ZLIB=1 ENABLE_PYOSYS=1 test all install
popd
pushd prjtrellis/libtrellis
cmake -DCMAKE_INSTALL_PREFIX=/path/to/workspace/sysroot .
make install
popd
pushd nextpnr
cmake . -DARCH=ecp5 -DTRELLIS_INSTALL_PREFIX=/path/to/workspace/sysroot
make install

好的,有了工具链,接下来我们需要安装好之前所提及的LiteX SoC builder:

cd /path/to/workspace
git clone --recursive https://github.com/litex-hub/linux-on-litex-vexriscv
pushd linux-on-litex-vexriscv
wget https://raw.githubusercontent.com/enjoy-digital/litex/master/litex_setup.py
chmod +x litex_setup.py
./litex_setup.py init install --user
popd
git clone http://github.com/buildroot/buildroot
cd buildroot
make BR2_EXTERNAL=../linux-on-litex-vexriscv/buildroot/ litex_vexriscv_defconfig
make

接下来,我们开始打造orangecrab能够使用的LiteX/VexRiscv:

./make.py --board=orangecrab --cpu-count=1 --build

下一篇,我们将从上面步骤中的buildroot来作musl libc based的rootfs bringup ~`

[0-1] https://tw.element14.com/hackster-launch/orangecrab-r0d2-25/dev-board-ecp5-25f-128-mib-fpga/dp/3651571?ICID=I-HP-RP-4
[0-2] https://github.com/orangecrab-fpga/orangecrab-hardware
LiteX/VexRiscv 简介与使用 (一) 太初有光


<<:  Day3 First Go application

>>:  新新新手阅读 Angular 文件 - ngIf - Day18

随身开机碟 lubuntu 启用 fcitx 呒虾米输入法的步骤

看到了 在 Lubuntu 21.04 安装 fcitx 的呒虾米表格档 所分享的做法,也是我常会用...

学习日记-1

最近几天在网站上看了有管git的资料, 发现了 "连猴子都能懂的Git指南" 就...

[Golang]Channel 特性整理-心智图

用途: sender和receiver沟通机制,FIFO(先进先出)。 参考来源: 郝林-Go语言核...

GCP Container Registry

Container Registry 今天说一下如何在GCP上建立Docker Image私仓(Do...

Day 16:自己动手,丰衣足食.IOS的Coroutine管理

Keyword: Coroutine,Flow 前面说了这麽多有关於Coroutine Leak所带...