ghdl で ieee 2008
ghdl で numeric_std を使う方法。
結論から書くと --std=08 を使う。
ghdl のライブラリの下の list は次の通り。
ieee/ Makefile.inc README std/ vital2000/ ieee2008/ mentor/ redist1164/ synopsys/ vital95/
普通に ghdl xxx_tb.vhdl とかすると ieee が利用される。ieee の下はこんな感じ。わかりやすいように body を省いてある
math_complex.vhdl math_real.vhdl numeric_bit.vhdl numeric_std.vhdl std_logic_1164.vhdl
numeric_std はある。なので、次の簡単な test bench のコンパイルが通りそうなものだ
library IEEE, std; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use std.textio.all; entity text_io_example is end text_io_example; architecture beh of text_io_example is signal v : std_logic_vector(5 downto 0); begin process is variable line0 : line; variable c : std_logic; begin c := '0'; write(line0, c); writeline(output, line0); v <= v - 1; wait; end process; end beh;
しかし、結果はコンパイルエラー
test_tb.vhdl:19:14: cannot resolve overloading for subprogram call test_tb.vhdl:21:16: no function declarations for operator "-" ghdl: compilation error
write に合致した方がないのと、- という関数が定義されていないことが問題。ソースの中身見ると
function "-" (L: SIGNED; R: INTEGER) return SIGNED;
とかあって、ありそうなんだけどないと言われる。じゃ integer は通るのかな?
signal i : integer; .... i <= i - 1;
これは通ったりするのでやっぱり定義が足りていないのでしょう。ieee のソースは 1995 年のそのまま純粋に使っているようなので当時はなかったのかもしれない。--ieee=synopsys とかすると synopsys が用意した ieee を使うこともできる。
> ls -1 =3/synopsys/ std_logic_arith.vhdl std_logic_misc.vhdl std_logic_misc-body.vhdl std_logic_signed.vhdl std_logic_textio.vhdl std_logic_unsigned.vhdl
しかし、今度は numeric_std がないぜ。これを解決しようとすると ieee2008 を使う必要があるみたい。指定方法は --std=08 のようだ。--ieee=2008 じゃない。
> ghdl -i --ieee=synopsys test_tb.vhdl > ghdl -i --ieee=2008 test_tb.vhdl ghdl: unknown option '--ieee=2008' for command '-i' > ghdl -i --std=08 test_tb.vhdl > ghdl -a --std=08 test_tb.vhdl test_tb.vhdl:22:16: no function declarations for operator "-"
おーっとやっぱり operator がない。しかし ieee2008 はファイルが増えている。
> ls -1 =3/ieee2008/ | grep -v body fixed_float_types.vhdl fixed_generic_pkg.vhdl fixed_pkg.vhdl float_generic_pkg.vhdl float_pkg.vhdl ieee_bit_context.vhdl ieee_std_context.vhdl math_complex.vhdl math_real.vhdl numeric_bit.vhdl numeric_bit_unsigned.vhdl numeric_std.vhdl numeric_std_unsigned.vhdl std_logic_1164.vhdl std_logic_textio.vhdl
std_logic_vector 用の - の operator は numeric_std_unsigned にあるみたい。write はstd_logic_textio にある。
で結局うまくコンパイルするには次のようにする。
> cat test_tb.vhdl library IEEE, std; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use IEEE.numeric_std_unsigned.all; use IEEE.std_logic_textio.all; use std.textio.all; entity text_io_example is end text_io_example; architecture beh of text_io_example is signal v : std_logic_vector(5 downto 0); signal i : integer; begin process is variable line0 : line; variable c : std_logic; begin c := '0'; write(line0, c); writeline(output, line0); v <= v - 1; i <= i - 1; wait; end process; end beh; > ghdl -a --std=08 test_tb.vhdl