眼鏡止水

FPGA、ネットワーク機器、料理、そしてメガネ女子。

【LiteX】超簡単!オレオレRISC-V SoCを作ろう 〜インストール編〜

背景

ソフトウェアに比べて、ハードウェアの設計・実装は複雑で難しいという印象があります。 特にハードウェア記述言語 (Hardware Description Language, HDL) を用いたレジスタ転送レベル (Register Transfer Level, RTL) でのプログラミングは、人間の脳だけでは足りないほど多くのことを同時に意識しなければなりません。 そのためか、筆者の観測範囲内ではソフトウェア系のエンジニアを志す人に比べてハードウェア系、特にデジタル回路系のエンジニアを志す人が極めて少ないと感じられます。

一方で、日本国内ではTSMCの進出やRapidusの設立などによりデジタル回路エンジニアの需要が高まることが予想されます。 世界を見ても、AMDやIntel、NVIDIAなどの大御所だけでなく、Tenstorrentといった新進気鋭の企業が研究開発に力を入れており、しばらくは需要が高い状態が続くと考えられます。

先に述べたように、ハードウェア (デジタル回路) の実装は簡単ではなく、ソフトウェアのプログラマや入門者には高い壁があるように思います。 そのため、ベンダやオープンソースコミュニティによって様々な高位合成ツールが開発され、提供されています。 高位合成によってソフトウェアのプログラマや入門者が比較的簡単にハードウェアを実装できるようになるほか、熟練者にとっても開発効率の向上が期待できます。

筆者は学部の卒業研究などでLiteXと呼ばれるオープンソースのツールを活用し、独自のRISC-V System-on-Chip (SoC) を実装してきました。 その中で様々な知見を得たことから、筆者は「日本で5本の指に入るくらいにはLiteXに詳しい」と自負しています (諸説) 。 また、デバッグや機能向上などでコントリビューションもしています。

しかしながら、LiteXに関する日本語の情報は極めて少なく、英語ですらまだまだ不十分という現状があります。 そこで、本シリーズでは日本語でLiteXの紹介をするとともに、多くの人にLiteXの様々な便利機能を活用できるようになっていただき、独自のSoC (オレオレSoC) を開発することを体験していただくことを目標にします。 入門的な内容から発展的なものまで扱う予定ですので、ご期待ください。

なお、本記事の手順に基づいて作業を行った結果生じたいかなる損失に対して、筆者は責任を負いかねます。

LiteXとは?

LiteXPythonで簡単にSoCを実装できるフレームワークです。 Migenを用いてRTLを意識した記述ができるだけでなく、EthernetDRAMコントローラなどの様々なモジュールIPを利用することで、効率的なSoC開発ができます。 VexRiscvをはじめとする様々なオープンソースソフトプロセッサの組み込みや、AXIなどの広く用いられているバスインタフェースの生成も自動的に行ってくれます。 Zynqのハードプロセッサと組み合わせることにも対応しているようです。

github.com

LiteXはたくさんのFPGAボードに向けたサンプルデザインを提供しています。 サンプルデザインのパラメタを組み合わせるだけでも独自のSoCを簡単に作ることができます。 本シリーズではそこからさらに一歩進んで、独自のモジュールを作成したり自作のプロセッサをSoCに組み込む方法などについても紹介する予定です。

作業

本記事ではLiteXのインストールのみを扱います。 SoCをFPGAに実装する方法や、独自のSoCを作る方法、LiteXの内部的な仕組みなどは今後の投稿で扱います。

手順はLiteXのREADMEにあるQuick start guideをもとに一部変更しています。 本記事ではUbuntu 22.04.3 LTSを搭載したマシンを利用しています。 それ以外のOSをご利用の場合はガイドページを参照してください。

github.com

LiteXのインストール

はじめにPython3とpipのインストールを行います。 以下のコマンドを実行します。

sudo apt install python3 python3-pip

続いて、LiteXのインストーラをダウンロードし実行します。 インストールの際、インストーラの存在するディレクトリにたくさんのコンポーネントもダウンロードされます。 そのため、新しくディレクトリを作成してその中でインストーラを実行することを推奨します。

mkdir litex
cd litex
wget https://raw.githubusercontent.com/enjoy-digital/litex/master/litex_setup.py
chmod +x litex_setup.py
./litex_setup.py --init --install --user --config=full

5行目でインストーラを実行します。 --initオプションと--installオプションでコンポーネントのクローンと初期化、インストールの実行を指示します。 --userオプションはユーザモードでpipのライブラリへの登録を行うことを指示します。 これにより複数人で共有しているサーバの環境を汚染せずにインストールを行うことができます。 --configオプションではインストールするコンポーネントの規模を指定します。 選択肢はminimal, standard, fullの3種類あり、デフォルトはstandardです。 minimalはMigenとLiteXのみインストールします。 standardはそれに加えてモジュールIPとCソフトウェアライブラリ、そして著名なプロセッサをインストールします。 fullはすべてのコンポーネントをインストールします。 特にこだわりがなければfullを指定することを推奨します。 以下に、インストーラを起動した直後の様子を示します。

~/litex$ ./litex_setup.py --init --install --user --config=full
          __   _ __      _  __         
         / /  (_) /____ | |/_/         
        / /__/ / __/ -_)>  <           
       /____/_/\__/\__/_/|_|         
     Build your hardware, easily!      
          LiteX Setup utility.         

[   0.004] LiteX Setup auto-update...
[   0.720] LiteX Setup is up to date.
[   0.721] Initializing Git repositories...
[   0.721] --------------------------------
[   0.721] Cloning migen Git repository...
Cloning into 'migen'...
remote: Enumerating objects: 12664, done.
remote: Counting objects: 100% (233/233), done.
remote: Compressing objects: 100% (104/104), done.
remote: Total 12664 (delta 158), reused 187 (delta 129), pack-reused 12431
Receiving objects: 100% (12664/12664), 3.09 MiB | 10.42 MiB/s, done.
Resolving deltas: 100% (8238/8238), done.
Already on 'master'
Your branch is up to date with 'origin/master'.

数分程度待つとインストールが完了し、ディレクトリ内に複数のサブディレクトリが生成されます。

~/litex$ ls
litedram        litex_setup.py.1            pythondata-cpu-mor1kx
liteeth         migen                       pythondata-cpu-naxriscv
liteiclink      pythondata-cpu-blackparrot  pythondata-cpu-picorv32
litejesd204b    pythondata-cpu-cv32e40p     pythondata-cpu-rocket
litepcie        pythondata-cpu-cv32e41p     pythondata-cpu-serv
litesata        pythondata-cpu-cva5         pythondata-cpu-vexriscv
litescope       pythondata-cpu-cva6         pythondata-cpu-vexriscv-smp
litesdcard      pythondata-cpu-ibex         pythondata-misc-tapcfg
litespi         pythondata-cpu-lm32         pythondata-misc-usb_ohci
litex           pythondata-cpu-marocchino   pythondata-software-compiler_rt
litex-boards    pythondata-cpu-microwatt    pythondata-software-picolibc
litex_setup.py  pythondata-cpu-minerva      valentyusb

litexにはLiteXのモジュールIPをはじめとする主要なファイル群が格納されます。 litex-boardsには著名なFPGAボードをターゲットとしたサンプルデザインが格納されています。 その他のlite*には比較的大規模なモジュールIPのファイル群が格納されます。 migenにはLiteXが内部で利用しているMigenのファイルが格納されます。 pythondata-*は外部のオープンソースプロジェクトをPython (LiteX) から取り扱いやすいようラッピングしたものです。 例えば、pythondata-cpu-vexriscvにはVexRiscvのいくつかの構成のVerilogファイルと、それらの絶対パスを取得する関数を記述したPythonファイルなどが格納されます。

さて、LiteXをユーザモードでインストールした場合はいくつかのツールが~/.local/binに格納されます。 通常はこれらを利用するため、PATHを通すようにインストーラからメッセージが出されます。

[ 200.775] Make sure that ~/.local/bin is in your PATH
[ 200.775] export PATH=$PATH:~/.local/bin # temporary (limited to the current terminal)
[ 200.775] or add the previous line into your ~/.bashrc to permanently update PATH

以下のコマンドを実行してPATHを通します。 $PATH:の部分をつけ忘れないようご注意ください

export PATH=$PATH:~/.local/bin

シェル (bash) の起動時に自動的にPATHが通っていてほしい場合~/.bashrcに上記のコマンドを追記します。 テキストエディタを用いて直接追記するか、以下のコマンドを実行して追記します。 exportbinを挟んでいるのはシングルクオート (') であり、大なり記号 (>) は2つ連続していることに注意してください。

echo 'export PATH=$PATH:~/.local/bin' >> ~/.bashrc

これでLiteX本体とコンポーネントのインストールが完了しました。

続いて、SoC上で実行するソフトウェアをコンパイルするためのツールチェーンをインストールします。 はじめにmesonninjaをインストールします。 こちらもユーザモードでインストールする例を示します。

~/litex$ pip3 install --user meson ninja
Collecting meson
  Downloading meson-1.2.3-py3-none-any.whl (964 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 964.9/964.9 KB 12.5 MB/s eta 0:00:00
Collecting ninja
  Downloading ninja-1.11.1.1-py2.py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl (307 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 307.2/307.2 KB 23.2 MB/s eta 0:00:00
Installing collected packages: ninja, meson
Successfully installed meson-1.2.3 ninja-1.11.1.1

次に、riscv-gnu-toolchainをインストールします。 これにはいくつかの方法があります。 お好みのものをお選びください。

  1. aptでインストール
    • sudo apt install gcc-riscv64-unknown-elf
  2. litex_setup.pyでインストール
    • sudo ./litex_setup.py --gcc=riscv
    • 実はスクリプト内でaptなどのOSに応じたパッケージマネージャを呼んでいるだけ。Ubuntuの場合は1が実行される。
  3. リポジトリをクローンしコンパイル
  4. Vitis 2023.2をインストール
    • 実は/tools/Xilinx/Vitis/2023.2/gnu/riscv/lin/riscv64-unknown-elf/binにインストールされている。settings64.shsourceするとPATHが通り使えるようになる。

筆者は事前にVitis 2023.2をインストールしていたため、追加でインストールする必要はないようでした。

ここまで来ればインストールはすべて完了したといえます。 動作確認のため、Verilatorを用いたSoCのシミュレーションを実行してみましょう。 インストールは以下のコマンドを実行します。

sudo apt install libevent-dev libjson-c-dev verilator

以下のコマンドを実行すると、SoCのビルドと生成されたVerilogファイルのシミュレーションが行われます。

litex_sim --cpu-type=vexriscv

以下のようにLiteXのBIOSコンソールが表示されれば問題なく動作していると言えます。

        __   _ __      _  __
       / /  (_) /____ | |/_/
      / /__/ / __/ -_)>  <
     /____/_/\__/\__/_/|_|
   Build your hardware, easily!

 (c) Copyright 2012-2023 Enjoy-Digital
 (c) Copyright 2007-2015 M-Labs

 BIOS built on Nov 13 2023 15:41:11
 BIOS CRC passed (e7d37c0f)

 LiteX git sha1: edc6871a

--=============== SoC ==================--
CPU:        VexRiscv @ 1MHz
BUS:        WISHBONE 32-bit @ 4GiB
CSR:        32-bit data
ROM:        128.0KiB
SRAM:       8.0KiB


--============== Boot ==================--
Booting from serial...
Press Q or ESC to abort boot completely.
sL5DdSMmkekro
Timeout
No boot medium found

--============= Console ================--

litex> 

helpと入力すれば実行可能なコマンドの一覧が表示されます。

最後に

今回はオープンソースのSoCビルダーフレームワークであるLiteXのインストール方法を紹介しました。 今後の投稿でSoCをFPGAに実装する方法や独自のSoCを作成する方法を紹介したいと考えています。

この記事が、読者の皆様のよりよいオレオレSoCライフを送るための助けになれば幸いです。 また、LiteXコミュニティへの貢献となれば本望です。