HDL シミュレーション

RTLの設計のためには、まずHDLシミュレーションができる環境をつくらねばなりません。
LEONは多数の論理シミュレータをサポートしています。チップレベル(SoC)のサンプルRTLが様々なボードに向けて公開されていますが、そのディレクトリでmakeを行うだけで、トップシミュレーションが実行されます。この環境をそのまま利用するのが一番簡単だと思われます。

$GRLIB_HOME/designs/$(BOAD_NAME) のディレクトリにその環境があります。
私の持っているFPGAボードはGR-XC3S-1500というボードです。
$GRLIB_HOME/designs/gr-xc3s-1500 というディレクトリに行き、make ghdl と打つだけでGHDLシミュレーション用の実行ファイルを生成してくれます。

GHDLはGNUのHDLシミュレータで完全にフリーです。make ghdlで testbench という実行ファイルができます。ここで、./testbench と打ち、このファイルを実行するとシミュレーションを開始します。
その出力結果が以下のようなものです。

testbench.vhdのコードを見ると分かりますが、leon3mp というSoCのマクロとメモリをつないでいるだけです。ただし、メモリには実際にテストコードをコンパイルしたバイナリをアサインしてあります。同じディレクトリにある、sdram.srec などのファイルが実行バイナリです。
通常動作のようにCPUがプログラムを実行してシミュレーションを行っていきます。よってシミュレーションを終了させるためにはIUをエラーモードに入れるしかないので、最後はエラーモードに入ったというメッセージが出ています。

LEON3 GR-XC3S-1500 Demonstration design
GRLIB Version 1.0.20, build 3403
Target technology: spartan3 , memory library: spartan3
ahbctrl: AHB arbiter/multiplexer rev 1
ahbctrl: Common I/O area disabled
ahbctrl: AHB masters: 4, AHB slaves: 8
ahbctrl: Configuration area at 0xfffff000, 4 kbyte
ahbctrl: mst0: Gaisler Research Leon3 SPARC V8 Processor
ahbctrl: mst1: Gaisler Research AHB Debug UART
ahbctrl: mst2: Gaisler Research JTAG Debug Link
ahbctrl: mst3: Gaisler Research GR Ethernet MAC
ahbctrl: slv0: European Space Agency Leon2 Memory Controller
ahbctrl: memory at 0x00000000, size 512 Mbyte, cacheable, prefetch
ahbctrl: memory at 0x20000000, size 512 Mbyte
ahbctrl: memory at 0x40000000, size 1024 Mbyte, cacheable, prefetch
ahbctrl: slv1: Gaisler Research AHB/APB Bridge
ahbctrl: memory at 0x80000000, size 1 Mbyte
ahbctrl: slv2: Gaisler Research Leon3 Debug Support Unit
ahbctrl: memory at 0x90000000, size 256 Mbyte
apbctrl: APB Bridge at 0x80000000 rev 1
apbctrl: slv0: European Space Agency Leon2 Memory Controller
apbctrl: I/O ports at 0x80000000, size 256 byte
apbctrl: slv1: Gaisler Research Generic UART
apbctrl: I/O ports at 0x80000100, size 256 byte
apbctrl: slv2: Gaisler Research Multi-processor Interrupt Ctrl.
apbctrl: I/O ports at 0x80000200, size 256 byte
apbctrl: slv3: Gaisler Research Modular Timer Unit
apbctrl: I/O ports at 0x80000300, size 256 byte
apbctrl: slv7: Gaisler Research AHB Debug UART
apbctrl: I/O ports at 0x80000700, size 256 byte
apbctrl: slv8: Gaisler Research General Purpose I/O port
apbctrl: I/O ports at 0x80000800, size 256 byte
apbctrl: slv13: Gaisler Research GR Ethernet MAC
apbctrl: I/O ports at 0x80000d00, size 256 byte
clkgen_spartan3e: spartan3/e sdram/pci clock generator, version 1
clkgen_spartan3e: Frequency 50000 KHz, DCM divisor 4/5
leon3_0: LEON3 SPARC V8 processor rev 0
leon3_0: icache 2*4 kbyte, dcache 1*4 kbyte
dsu3_2: LEON3 Debug support unit + AHB Trace Buffer, 2 kbytes
ahbuart7: AHB Debug UART rev 0
ahbjtag AHB Debug JTAG rev 0
apbuart1: Generic UART rev 1, fifo 4, irq 2
irqmp: Multi-processor Interrupt Controller rev 3, #cpu 1, eirq 0
gptimer3: GR Timer Unit rev 0, 8-bit scaler, 2 32-bit timers, irq 8
grgpio8: 18-bit GPIO Unit rev 0
greth3: 10/100 Mbit Ethernet MAC rev 03, EDCL 1, buffer 2 kbyte 128 txfifo, irq 13

*** GRLIB system test starting ****

Leon3 SPARC V8 Processor
CPU#0 register file
CPU#0 multiplier
CPU#0 radix-2 divider
CPU#0 cache system
CPU#0 memory management unit
Multi-processor Interrupt Ctrl.
Modular Timer Unit
timer 1
timer 2
chain mode
Generic UART
GR Ethernet MAC
Test passed, halting with IU error mode

testbench.vhd:375:6:@2416248ns:(assertion failure): *** IU in error mode, simulation halted ***




GHDL実行モジュールは波形ファイルも出力できます。
./testbench --stop-time 3000ns -vcd testbench.vcd
でvcdファイルが出力されます。vcdファイルは非常に大きいのでシミュレーション時間に制限を付けました。
そして波形ファイルは gtkwave というプログラムで見ることができます。
gtkwave testbench.vcd を実行して波形が見れます。

ss2.png


どちらも無料のツールで便利だと思います。
がよくよくgtkwaveをいじっていると、何故か表示できるポイントが少ない。。。。。
いろいろ調べた結果、vcdファイルはもともとverilog用の波形ファイルフォーマットらくしく、VHDLの構造体のメンバに対する波形を表現できないそうです。そのためGHDLにはGHWフォーマットというものがあり、これがgtkwaveで見ることができるそう。やれやれと思い、
./testbench --stop-time=3000ns --wave=testbench.ghw
と実行すると波形ファイルを出力してくれました。
しかし、、、、、
gtkwave testbench.ghw
と実行するとアボートします。

>GTKWave Analyzer v3.2.0RC5 (w)1999-2009 BSI
>
>get_nbr_elements: unhandled type 31
>アボートしました

とさみしいメッセージが出るだけです。
これもいろいろ調べると、配列のサイズを規定していないポートがentityにあるとまずいらしい。LEONは確かAMBAのバス記述のところがそうなっていたような気がする。。。。
vcdファイルで見たい信号はsignalを引っ張り出すしかなさそうです。トップレベルは軽く1万行以上あるので、無料で使える論理シミュレータはGHDLのみですので、この方法を使うしかありません。

しかし、ブロックの設計でいちいちこんなことしたくないので、ISEWebPackに入っているModelsimの限定版(ソースコード一万行以内)を使おうとしたら、Windowsのみ対応らしい。Linux版にはISE simulatorというものが入っているらしいので、こちらをこれから調査してみようと思います。

RTLの設計に入る以前の部分でまだまだやらねばならないことがたくさんありそうです。