iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
Software Development

Port Alpine Linux to open source RISC-V platform系列 第 9

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 簡介與使用 (一) 太初有光


上一篇
LiteX/VexRiscv 簡介與使用 (一) 太初有光
下一篇
LiteX/VexRiscv 簡介與使用 (二點五) 天地分隔
系列文
Port Alpine Linux to open source RISC-V platform30

尚未有邦友留言

立即登入留言