故事是這個樣子的,大概在一年半前,我花了幾個月小玩了一下從 COSCUP 那邊拿到的 FPGA,那時候是在我的桌電 - 也就是 Archlinux 上進行開發。
最近因為一些原因又把這塊板子拿出來,但這次,我改用我新的筆電,裝的是 Windows 的 WSL 搭配 ubuntu 22.04,然後就發現, 我在文章中 列出來的幾項工具,包括 yosys, nextpnr, prjtrellis, 只有 yosys 能在 ubuntu 上用 apt 完成安裝,其他都在自己編譯,不像 Archlinux 上有人幫你弄好 AUR 了。

這篇文就是安裝工具的筆記,希望能幫到其他想在 ubuntu 上玩 lattice FPGA 的人, 主要參考這篇文章 ,以及一些工具 Github 的 issue。

這一串會安裝的工具組包括:

需要的 package

安裝 git 跟 wget

apt install git wget

需要的工具組:

apt install -y build-essential clang tcl-dev libreadline-dev \
  pkg-config bison flex libftdi-dev cmake \
  python3-dev libboost-all-dev libeigen3-dev

其他不是一定必要的,只有自己手動跑 yosys 的 make test ,以及真的寫 verilog 的話會需要裝的。

apt install -y iverilog gtkwave gawk

yosys

yosys 是開源的合成工具,目前僅此一家別無分店。
可以用 apt 安裝 官方的 package

apt install yosys 

但我測過之後,發現無法和其他要自己編譯的工具相容,遇到錯誤 ERROR: Expecting string value but got integer 1.
因此還是建議自行編譯:

git clone https://github.com/YosysHQ/yosys yosys
cd yosys
make -j$(nproc)
make test  # optional (requires iVerilog)
make install

icestorm

icestorm 是用來生成 Lattice iCE40 FPGAs 設定資料的工具組, 有查到 fpga-icestorm 跟 fpga-icestorm-chipdb 兩個官方的 package,但我沒測過不保證能用:

apt install fpga-icestorm fpga-icestorm-chipdb

從 source code 安裝:

git clone https://github.com/YosysHQ/icestorm.git icestorm
cd icestorm
make -j$(nproc)
make install

prjtrellis

Prjtrellis 是裝置的資料庫,用來產生最終要燒在裝置上的 bitstream,少了這個會導致下一步的 nextpnr 無法編譯。

git clone --recursive https://github.com/YosysHQ/prjtrellis
cd prjtrellis/libtrellis
cmake -DCMAKE_INSTALL_PREFIX=/usr/local .
make

nextpnr

nextpnr 是開源的 FPGA 佈線工具,支援 Lattice 公司的 iCE40 和 ECP5 兩條產品線。
這裡的指令是編譯 ECP5,可以換成 -DARCH=ice40 來編譯 iCE40 的 nextpnr。

git clone --recursive https://github.com/YosysHQ/nextpnr nextpnr
cd nextpnr
cmake . -DARCH=ecp5 -DCMAKE_INSTALL_PREFIX=/usr/local
make -j$(nproc)
make install

SystemC

SystemC 是用來寫硬體的模型,會自己裝是因為 ubuntu 官方不附 cmake 的 FindPackage 檔, 這在用 Cmake 編譯 SystemC 的時候很煩。

wget https://github.com/accellera-official/systemc/archive/refs/tags/2.3.4.tar.gz -O systemc.tar.gz
tar zxf systemc.tar.gz
cd systemc-2.3.4
cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=17
make -j${NPROC} install

Verilator

Verilator 作為開源的驗證工具已經算是品質最好的一個了,如果要玩開源硬體一定繞不過(除非你乾脆就不驗證了,笑你不敢)。
之所以不用 ubuntu 官方的 package,是因為官方的版本不夠新,至少用 verilator v5.006 可以驗證 packed struct 比較方便。

wget https://github.com/verilator/verilator/archive/refs/tags/v5.006.tar.gz -O verilator.tar.gz
tar zxf verilator.tar.gz
cd verilator-5.006
autoconf
./configure --prefix=${THE_PREFIX}
make -j${NPROC}
make install

測試

測試用一個簡單的 blink

module blink (output reg led,
              input clk);
  localparam CNT_RST = 25_000_000;
  reg [24:0] counter;
  always @(posedge clk) begin
    if (counter == 25'd0) begin
      led <= led + 1;
      counter <= CNT_RST;
    end
    else begin
      counter <= counter - 1;
    end
  end
endmodule

Lattice Place File (LPF) blink.lpf

LOCATE COMP "clk" SITE "P6";
IOBUF PORT "clk" IO_TYPE=LVCMOS33;
FREQUENCY PORT "clk" 25 MHZ;

LOCATE COMP "led" SITE "A12";
IOBUF PORT "led" IO_TYPE=LVCMOS25;

用我們剛剛安裝的工具們來編譯:

yosys -p "synth_ecp5 -json blink.json" blink.v
nextpnr-ecp5 --25k --package CABGA256 --speed 6 --json blink.json --textcfg blink_out.config --lpf blink.lpf
ecppack blink_out.config blink.bin

就能產出可燒錄的 .bin 檔了。

Put it all together

講了那麼多沒意思,直接提供 Dockerfile 好像比較實在Talk is cheap. Show me the Dockerfileubuntu-icestorm-toolchain

載下來 docker build 一下,就能開始開發 Lattice FPGA 啦。