前回Clarviの調査ということで概要を把握したのだが、SystemVerilogを実行できるシミュレータを持っていなかったため、シミュレーションが実行できなかった。
ところがその後各方面から「Modelsim Altera starter editionを使えばいいじゃん」というご指摘をいただいた。恥ずかしながらまったくのノーマークでした。。。
という訳で、初めてのModelsim Altera starter edition(現在はModelsim Intel Starter Edition)のインストールに挑戦する。
Modelsim
まずはwebサイトからModelsimをダウンロードする。Quartusもダウンロードしてしまうとかなり大きいが、シミュレータだけならば1GBくらいで済む。Linux版をダウンロードした。
- Quartus Prime スタンダード・エディション
インストールは、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
おおお、いいね。無事に実行できた。命令トレースも出せる。