CPU+コンパイラ自作キャンプ/開発環境構築
WSL Ubuntuでやることを前提として手順を書いています。
1. Ubuntuに標準的な開発ソフトをインストール
code:gitとmakeをインストールするコマンド
$ sudo apt update && sudo apt install git make iverilog
git: バージョン管理ツール。GitHubからファイルをダウンロードするのに使う。
make: ビルドツール。VerilogやCコードのビルドに使う。
iverilog: Icarus VerilogというVerilogシミュレータ。FPGAを使わずにVerilogを動かすことができる。
Icarus VerilogはOSSで無料で使えるというのが良い
他にも有名なOSSとしてVerilatorがあるが、筆者は使ったことがない
シミュレーションの速度はIcarus Verilogよりかなり速いらしい
テストベンチは基本C++で書く必要があるなど、使い方に癖がある
対応しているVerilogの機能も結構制限があるっぽい
よくある質問:
質問1: このコマンドはどこに打ち込めばいいですか?
回答1: WSLのBashに打ち込みます。
質問2: 先頭の$は打ち込むのでしょうか?
回答2: いいえ。この$は最初から画面に表示されている記号です。
2. CPU+コンパイラ自作キャンプのサンプルコード集を入手
サンプルコード集:https://github.com/uchan-nos/cccamp/
Zipファイルとしてダウンロードもできるが、Gitを使って入手するのがおすすめ
code:cccampをダウンロードするコマンド
$ git clone git@github.com:uchan-nos/cccamp.git
こうすると、カレントディレクトリにcccampがダウンロードされる
3. サンプルコードをシミュレーション実行してみる
cccampに含まれるサンプルコードをとりあえず実行してみる
正しく開発ソフトがインストールされているかの確認のため
code:led_patternのシミュレーション
$ cd cccamp
$ verilog_practice/led_pattern
$ make sim
iverilog -g2012 -o sim.exe main_tb.sv main.sv
./sim.exe
0 led=001010
$
「0 led=001010」の行が表示されれば成功。されなければ何かがおかしい。
4. FPGAボードの入手とFPGA開発ツールのインストール
FPGAボード:Tang Nano 9K
他のFPGAボードでもCPUのVerilog記述は(ほとんど)共通で動くと思われる
ただ、FPGAやボードに含まれる機能の種類やピン配置は、機種毎に大きく異なるので、Tang Nano 9K以外を使うときは大幅な改造が必要かもしれない
LEDやスイッチの数、接続されているピンの違い
FPGAの機能の違い
また、他社のFPGAの場合は開発ツールの操作も大きく異なる
2025/03/07現在、秋月電子にて2,980円で売ってる(販売コード:117448)
FPGA開発ツール:Gowin EDA
Tang Nano 9Kに限れば、ライセンス申請が不要な「Education Edition」で良い。
「Standard Edition」を使いたい場合は、インストール後、ライセンスの申請を行う
経験上、1日~数日でライセンスが送られてくる
Gowin EDAのダウンロードは 「Gowin® EDA」のダウンロード から
ユーザー登録が必要なのでする
基本的にはその時の最新版を入手すれば良い
書き込みツールGowin Programmerはバージョンによりボードとの相性が結構違うので、古いバージョンが必要になることもある
例えば、筆者の環境においてembFlash書き込みがGOWIN Programmer V1.9.10.02だと全然ダメで、V1.9.9.03だと一発で成功した経験がある。
GOWIN Programmer V1.9.11でも成功。
ここまで終われば CPU+コンパイラ自作キャンプ/Verilogの練習 を進めることができる。その先、コンパイラ開発に進むには、以下の手順もやる。
5. コンパイラ開発ツールのインストール
code:GCCのインストール
$ sudo apt install gcc
GCCの代わりに他のCコンパイラでも良い。Clangなど。
しかし、コンパイラはC言語じゃなくても作れる
C言語でなくても、「ソースコード」を入力して「アセンブリコード」あるいは「機械語コード(16進文字列)」を出力できればよい
たいていのプログラミング言語処理系はファイルの入出力や文字列操作が可能なので、コンパイラを作れる
CPU+コンパイラ自作キャンプはC言語でコンパイラを作ることを仮定していてサンプルコードがC言語だから、読者もC言語を使う方がスムーズに進められるはず
6. WSLでUSB機器を使えるようにする
WSL: Windows Subsystem for Linux
Windows上でLinuxを動かす仕組み
CPUやコンパイラを作るのにWSLが必須ではないが、便利なのでこのテキストではWSLを使う前提になっている
筆者としては、WSLを使ってLinuxを利用することで、Icarus VerilogやGitが楽に使えるなあと感じている
UbuntuなどではIcarus VerilogやGitがパッケージ化されていて、簡単にインストールできる
筆者はWindowsでGowin EDAを、Ubuntu on WSLでIcarus Verilogやエディタ(Vim)を使う構成でやることが多い
WSL上のエディタからWindows上のファイルを編集することは問題なくできる
逆に、WSL上のファイルをWindows上で編集することもできる
WSLでUSB機器を使う
USB デバイスを接続する | Microsoft Learnを参考にusbipdをインストールする
USB機器をWSLで認識させる手順(必要になるまでやらなくて良い。cmd.exeで操作。)
code:USB機器の「バスID」を確認する
C:\Users\uchan>usbipd list
Connected:
BUSID VID:PID DEVICE STATE
1-7 046d:085e Logicool BRIO, Logitech BRIO, USB 入力デバイス Not shared
《中略》
11-3 12cf:0384 USB 入力デバイス Not shared
12-2 0403:6015 USB Serial Converter Shared
この場合、USBシリアル変換器(USB Serial Converter)のバスIDは「12-2」である
code:USB機器をWSLへ接続する
C:\Users\uchan>usbipd attach --busid 12-2 --wsl
usbipd: info: Using WSL distribution 'Ubuntu-20.04' to attach; the device will be available in all WSL 2 distributions.
usbipd: info: Using IP address 172.31.192.1 to reach the host.
C:\Users\uchan>
これでデフォルトのWSL環境に対してUSB機器が接続された
他のWSL環境に割り当てるには --wsl DISTRIBUTION として指定する
7. WSL豆知識
WSL内のファイルにWindows側からアクセスする
開きたいファイルがある場所で explorer.exe . を実行すると、そのディレクトリをWindowsのエクスプローラで開ける
code:/home/uchan/workspaceをWindowsから開く
$ cd /home/uchan/workspace
$ explorer.exe .