ghdl で Xilinx の unimacro とか
Xilinx の unimacro と unisims を ghdl でコンパイル。ghdl の使い方を 100 % 把握していないのですが、なんとかなった。まず -i で Import
ghdl -i --ieee=synopsys --work=unisim unisims/*.vhd ghdl -i --ieee=synopsys --work=unisim unisims/primitive/*.vhd ghdl -i --ieee=synopsys --work=unimacro unimacro/*.vhd
。-i と -a でどう違うんだというのは置いておいて、cf ファイルができる。そんでもって、対象となる entity と test bench をアナライズ。
ghdl -a --ieee=synopsys fifo_tb.vhdl fifo_test.vhdl
そして ghdl -e でエラボレート、、、といきたいところだが
ghdl -a --ieee=synopsys fifo_tb.vhdl fifo_test.vhdl ghdl -e --ieee=synopsys fifo_tb fifo_test.vhdl:62:5:warning: 'fifo_sync_macro_inst' is not bound fifo_test.vhdl:34:14:warning: (in default configuration of fifo_test(rtl))
この "not bound" なんだかよくわからなかった。出たりでなかったりで、、、結局、関連するモジュールすべてを -e しないといけないことがわかった。関連性をひっぱりだして全部 -e するのはナンセンスなので -m というオプションを使う。
> ghdl -m --ieee=synopsys fifo_tb ../../src/synopsys/std_logic_arith.vhdl:391:14:warning: function "left_signed_arg" is never referenced ../../src/synopsys/std_logic_arith.vhdl:400:14:warning: function "left_unsigned_arg" is never referenced ../../src/synopsys/std_logic_arith.vhdl:409:14:warning: function "mult_signed_arg" is never referenced ../../src/synopsys/std_logic_arith.vhdl:418:14:warning: function "mult_unsigned_arg" is never referenced ../../src/synopsys/std_logic_arith.vhdl:1258:14:warning: function "unsigned_return_boolean" is never referenced ../../src/synopsys/std_logic_arith.vhdl:1266:14:warning: function "signed_return_boolean" is never referenced ../../src/vital2000/timing_b.vhdl:196:15:warning: procedure "vitalerror" is never referenced ../../src/vital2000/timing_b.vhdl:217:15:warning: procedure "vitalerror" is never referenced ../../src/vital2000/prmtvs_b.vhdl:1041:15:warning: function "toedge" is never referenced analyze fifo_tb.vhdl analyze unisims/unisim_VCOMP.vhd analyze unimacro/unimacro_VCOMP.vhd analyze fifo_test.vhdl analyze unimacro/FIFO_SYNC_MACRO.vhd analyze unisims/unisim_VPKG.vhd analyze unisims/primitive/FIFO18E1.vhd analyze unisims/primitive/FIFO36E1.vhd elaborate fifo_tb
ちゃんと fifo_tb.exe ができた。実行もできる。
./fifo_tb.exe --stop-time=10us --vcd=ftb.vcd fifo_tb.vhdl:154:5:@285ns:(report note): empty_flag is 0 ./fifo_tb:info: simulation stopped by --stop-time > head ftb.vcd $date Fri Nov 20 21:55:19 2015 $end $version GHDL v0 $end $timescale 1 fs $end $var reg 1 ! clk $end
もぉ。-i と -a の違いは今試してみると -i だと cf ファイルしか作らない。 -a だと *.o まで作る。-i で cf ファイルを作ってから -m でトップモジュールを指定してつくると余計な *.o が作られないで済む。特に primitive の下の entity を全部作ってたら大変だからね。
今回は FIFO_DUALCLOCK_MACRO を使ったのだけど、*.o のオブジェクトを作るときにエラーになった。virtex5 の記述があるのだけどそのモジュールもコンパイルしようとしてエラーになるみたい。つぎのはその一部。 FIFO18 を必要としているのだけど存在しないと。
-- v5 : if (DEVICE = "VIRTEX5") generate -- fifo_18_inst : if ( FIFO_SIZE = "18Kb" and DATA_WIDTH <=18 ) generate -- begin -- fifo_18_inst : FIFO18 -- generic map ( -- ALMOST_FULL_OFFSET => ALMOST_FULL_OFFSET,
で上見ればわかる通りコメントアウト。探したのだけど、Vivado からはついてこなくなった模様。ISEにはついてきているのか、、、
もぉ。-a で primitive の下をコンパイルするといろんなエラーが出るので前の資産は必要ないのに ghdl ではコンパイルをしようとしてしまう。抑制できないのかな、、、
とりあえずうまくいっているから良しとして、さて、これで中の FIFO を FIFO_SYNC_MACRO に変えようとすると、またもや is not bound を見ることになる。
これは cf は出来ているのだけどオブジェクトがない FIFO_SYNC_MACRO.o がないということが原因。なので -m をつかって再度、make すれば大丈夫。
これで vi + ghdl で VHDL の開発ができるようになった。vcd を解析して S 式に落として、eps にして、さらに gs で png にすれば波形も見ることが出来る。いまは、波形にはせずに、直接 vcd みてるけどね。