背景
ソフトウェアに比べて、ハードウェアの設計・実装は複雑で難しいという印象があります。 特にハードウェア記述言語 (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とは?
LiteXはPythonで簡単にSoCを実装できるフレームワークです。 Migenを用いてRTLを意識した記述ができるだけでなく、EthernetやDRAMコントローラなどの様々なモジュールIPを利用することで、効率的なSoC開発ができます。 VexRiscvをはじめとする様々なオープンソースソフトプロセッサの組み込みや、AXIなどの広く用いられているバスインタフェースの生成も自動的に行ってくれます。 Zynqのハードプロセッサと組み合わせることにも対応しているようです。
LiteXはたくさんのFPGAボードに向けたサンプルデザインを提供しています。 サンプルデザインのパラメタを組み合わせるだけでも独自のSoCを簡単に作ることができます。 本シリーズではそこからさらに一歩進んで、独自のモジュールを作成したり自作のプロセッサをSoCに組み込む方法などについても紹介する予定です。
作業
本記事ではLiteXのインストールのみを扱います。 SoCをFPGAに実装する方法や、独自のSoCを作る方法、LiteXの内部的な仕組みなどは今後の投稿で扱います。
手順はLiteXのREADMEにあるQuick start guideをもとに一部変更しています。 本記事ではUbuntu 22.04.3 LTSを搭載したマシンを利用しています。 それ以外のOSをご利用の場合はガイドページを参照してください。
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
に上記のコマンドを追記します。
テキストエディタを用いて直接追記するか、以下のコマンドを実行して追記します。
export
とbin
を挟んでいるのはシングルクオート ('
) であり、大なり記号 (>
) は2つ連続していることに注意してください。
echo 'export PATH=$PATH:~/.local/bin' >> ~/.bashrc
これでLiteX本体とコンポーネントのインストールが完了しました。
続いて、SoC上で実行するソフトウェアをコンパイルするためのツールチェーンをインストールします。 はじめにmesonとninjaをインストールします。 こちらもユーザモードでインストールする例を示します。
~/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をインストールします。 これにはいくつかの方法があります。 お好みのものをお選びください。
apt
でインストールsudo apt install gcc-riscv64-unknown-elf
litex_setup.py
でインストールsudo ./litex_setup.py --gcc=riscv
- 実はスクリプト内で
apt
などのOSに応じたパッケージマネージャを呼んでいるだけ。Ubuntuの場合は1が実行される。
- リポジトリをクローンしコンパイル
- Vitis 2023.2をインストール
- 実は
/tools/Xilinx/Vitis/2023.2/gnu/riscv/lin/riscv64-unknown-elf/bin
にインストールされている。settings64.sh
をsource
すると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コミュニティへの貢献となれば本望です。