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

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 ではコンパイルをしようとしてしまう。抑制できないのかな、、、
とりあえずうまくいっているから良しとして、さて、これで中の FIFOFIFO_SYNC_MACRO に変えようとすると、またもや is not bound を見ることになる。
これは cf は出来ているのだけどオブジェクトがない FIFO_SYNC_MACRO.o がないということが原因。なので -m をつかって再度、make すれば大丈夫。

これで vi + ghdl で VHDL の開発ができるようになった。vcd を解析して S 式に落として、eps にして、さらに gs で png にすれば波形も見ることが出来る。いまは、波形にはせずに、直接 vcd みてるけどね。