読者です 読者をやめる 読者になる 読者になる

FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

教育用RISC-V実装Clarviの調査 (Modelsim Altera starter editionのインストールとコンパイル)

RISC-V

前回Clarviの調査ということで概要を把握したのだが、SystemVerilogを実行できるシミュレータを持っていなかったため、シミュレーションが実行できなかった。

msyksphinz.hatenablog.com

ところがその後各方面から「Modelsim Altera starter editionを使えばいいじゃん」というご指摘をいただいた。恥ずかしながらまったくのノーマークでした。。。

という訳で、初めてのModelsim Altera starter edition(現在はModelsim Intel Starter Edition)のインストールに挑戦する。

Modelsim

まずはwebサイトからModelsimをダウンロードする。Quartusもダウンロードしてしまうとかなり大きいが、シミュレータだけならば1GBくらいで済む。Linux版をダウンロードした。

  • Quartus Prime スタンダード・エディション

Download Center

f:id:msyksphinz:20170110003916p:plain

インストールは、ModelSimSetup-16.1.0.196-linux.runを実行すればよいだけだ。別に個人の環境だしローカルにインストールした。インストール時間は10分くらい。

次に起動しようとしたのだが、どうもライブラリが足りなかったり、実行できなかったりと苦労した。いろいろ調査すると32ビット用のライブラリをダウンロードする必要があるらしい。

sudo apt-get install libc6:i386 libx11-6:i386 libxext6:i386 libxft2:i386 libncurses5:i386

無事にコンソールでvsimを立ち上げることが出来るようになった。CUIで動作させるためには、vsim -cと入力する必要がある。

$ vsim -c
Reading pref.tcl

# 10.5b

Clarviのコンパイルとシミュレーション実行

Clarviのホームページに、普通にコンパイルの方法が書いてあった。そのとおりにコマンドを実行すると、無事にコンパイルできたようだ。

ModelSim> do clarvi_test.do software/example-asm/build/mem.txt TRACE
# Model Technology ModelSim - Intel FPGA Edition vlog 10.5b Compiler 2016.10 Oct  5 2016
# Start time: 00:29:15 on Jan 10,2017
# vlog clarvi.sv "+define+TRACE"
# -- Compiling package clarvi_sv_unit
# -- Compiling module clarvi
#
...

ここでは、software/example-asm/build/mem.txtのプログラムを読み込んでコンパイルしている。次に、実行してみよう。runコマンドをタイプするだけでよい。

VSIM 2> run 1us
#                    0: pc=0xxxxxxxxx:   ---                            stall
#                   10: pc=0xxxxxxxxx:   ---                            stall
#                   20: pc=0xxxxxxxxx:   ---                            stall
#                   30: pc=0xxxxxxxxx:   ---                            stall
#                   40: pc=0xxxxxxxxx:   ---                            stall
#                   50: pc=0x00000000:   AUIPC  sp, 0x00010000          sp := 0x00010000
#                   60: pc=0x00000004:   ADDI   sp, sp, -32             sp := 0x0000ffe0, sp = 0x00010000
#                   70: pc=0x00000008:   AUIPC  t0, 0x00000000          t0 := 0x00000008
#                   80: pc=0x0000000c:   ADDI   t0, t0, 20              t0 := 0x0000001c, t0 = 0x00000008
#                   90: pc=0x00000010:   CSRRW  zero, MTVEC, t0
#                  100: pc=0x00000014:   JAL    ra, 32          ra := 0x00000018, target = 0x00000034
#                  110: pc=0x00000018:   ---                            stall
#                  120: pc=0x0000001c:   ---                            stall
#                  130: pc=0x00000020:   ---                            stall
#                  140: pc=0x00000034:   ADDI   sp, sp, -32             sp := 0x0000ffc0, sp = 0x0000ffe0
#                  150: pc=0x00000038:   SW     ra, 0(sp)               mem[0000ffc0] := 0x00000018, sp = 0x0000ffc0, ra = 0x00000018
#                  160: pc=0x0000003c:   JAL    ra, -28         ra := 0x00000040, target = 0x00000020
#                  170: pc=0x00000040:   ---                            stall
#                  180: pc=0x00000044:   ---                            stall
#                  190: pc=0x00000048:   ---                            stall
#                  200: pc=0x00000020:   ADDI   sp, sp, -32             sp := 0x0000ffa0, sp = 0x0000ffc0
#                  210: pc=0x00000024:   SW     ra, 0(sp)               mem[0000ffa0] := 0x00000040, sp = 0x0000ffa0, ra = 0x00000040
#                  220: pc=0x00000028:   LW     ra, 0(sp)               ra := 0x00000040 = mem[0x0000ffa0], sp = 0x0000ffa0
#                  230: pc=0x0000002c:   ADDI   sp, sp, 32              sp := 0x0000ffc0, sp = 0x0000ffa0
#                  240: pc=0x00000030:   JALR   zero, ra, 0             , ra = 0x00000040, target = 0x00000040
#                  250: pc=0x00000034:   ---                            stall
#                  260: pc=0x00000038:   ---                            stall
#                  270: pc=0x0000003c:   ---                            stall
#                  280: pc=0x00000040:   LW     ra, 0(sp)               ra := 0x00000018 = mem[0x0000ffc0], sp = 0x0000ffc0
#                  290: pc=0x00000040:   ---                            stall
#                  300: pc=0x00000044:   JALR   zero, ra, 0             , ra = 0x00000018, target = 0x00000018
#                  310: pc=0x00000048:   ---                            stall
#                  320: pc=0x0000004c:   ---                            stall
#                  330: pc=0x00000050:   ---                            stall
#                  340: pc=0x00000018:   ECALL
#                  350: ECALL instruction at 00000018, stopping simulator
# ** Note: $stop    : clarvi_debug.sv(44)
#    Time: 350 ns  Iteration: 1  Instance: /clarvi_sim/clarvi/clarvi
# Break in Module clarvi at clarvi_debug.sv line 44
# Stopped at clarvi_debug.sv line 44

f:id:msyksphinz:20170110004523p:plain

おおお、いいね。無事に実行できた。命令トレースも出せる。