目的
ModelSimのError loading designというエラーに対処する。
概要
ModelSimでシミュレーションするとき、vishやvcomなどのエラーメッセージがなくて、Error loading designとだけしかエラーが表示されないことがある。
失敗例
シミュレーションしたいvhdlファイルのentity名とテストベンチのcomponent名を確認するとよいかもしれない。おそらく、entity名とcomponent名が同じ場合、先ほどのError loading designが発生する。Error loading designだけのときは名前関係を疑ったほうがいいかもしれない。
verilogでは未確認。
訂正
上記は間違いで、仮にentity名とcomponent名を違うものにすると、シミュレーションは通るが、インプット信号だけしか通らず、出力は出てこない。そのため、entity名とcomponent名は同じにしなければならない。
結果
ソースをじっくりと見たところ、vhdlファイルのinとテストベンチのoutを間違えて入力していた。それを改善したところ、シミュレーションが通った。
そのほかvhdlファイルとテストベンチでbit幅が違う場合などがある。
結論1
ModelSimでError loading designだけしかないときはvhdlファイルとテストベンチを比較して違うところを修正する。
->追記2参考
追記1
Modelsimの違うバージョン、たとえば6.5bと6.1gが混在していたり、QuartusIIのバージョン7.1と9.1が混在していたりするとだめなときもある。そのときはModelsimの設定を変えればいいと思うが、tclの知識が必要になるかもしれない。
追記2
根本的な解決方法がわかった。それはtranscript窓に
Error loading designだけではなく、青文字のメッセージ、たとえば
Loading...などを表示させることである。青文字の
warning,note,errorなどが表示されない原因はおそらく日本語の文字にあると考える。
青メッセージが出てきた一例を挙げる。
マイコンピュータを右クリックし、プロパティ->詳細設定->環境変数を開く。
環境変数のところでTMPに注目する。青メッセージが表示されない場合はおそらくTMPの値に日本語が含まれていると思う。
%USERPROFILE%\Temp -> C:\Documents and Settings\○○○(おそらく日本語)\Temp
から
%SystemRoot%\TEMP -> C:\WINDOWS\TEMP
に変更する。
%SystemRoot%\TEMPでなくても、日本語が含まれていなければなんでもいいと思う。
この状態でModelsimを使えば青メッセージが出てくると思うのでそのメッセージにしたがってエラーを取り除く。
http://q.hatena.ne.jp/1203640748にあるようにアカウント、環境変数のUSERNAMEを変更することでも可能であると考える。要するにTMPに日本語が入っていなければOK。USERPROFILEはDocument and Settings + USERNAMEみたいな感じだとwikipediaで見たような気がする。
結論2
ModelSimでError loading designだけしかないときは日本語の設定を英数字に変更する。
追記3
Modelsimについて
ModelsimとはMentor Graphics(メンターグラフィックス)社が提供しているVHDL/Verilog-HDL/System-Cのシミュレーションを行うためのツールである。FPGAベンダーのaltera(アルテラ)版、Xilinx(ザイリンクス)版などがある。無料のModelsim、アルテラバージョンはmodelsim-ase(altera starter edition)である。
追記4
VHDLについて
VHDLとはハードウェア記述言語の一種で、FPGAの挙動や、動作を決定するプログラミング言語のようなものである。しかし、ハードウェア記述言語はC言語などのプログラミング言語と違い、並列動作をする。プログラミング言語は基本的に手続き型で逐次実行される(おそらく)。
たとえば以下の例を考える。
<例>
プロセス文の中のクロック同期の中で
if(rst_n = '0')then -- 初期化
cnt <= 0;
s_flag <= '0';
elsif(clk'event and clk = '1')then -- クロックの立ち上がり
if(cnt >= 3)then
cnt <= 0;
s_flag <= '1';
else
cnt <= cnt + 1;
s_flag <= '0';
end if;
if(s_flag = '1')then
s_dout <= x"20";
else
s_dout <= (others => '0');
end if;
end if;
-----------------------------------------------------------------------
クロックの立ち上がり数(clk数)
0 1 2 3 4 5 6 7 8
cnt
0 1 2 3 0 1 2 3 0
s_flag
'0' '0' '0' '0' '1' '0' '0' '0' '1'
s_dout
x"00" x"00" x"00" x"00" x"00" x"20" x"00" x"00" x"00"
-----------------------------------------------------------------------
この例のようにcntが3になったとき、s_flagが'1'になっていないのは一つ前の状態、すなわちclk数が2の状態を参照するからだと思う。
ハードウェア記述言語にはVHDLのほかにもVerilog-HDLやSystem-Cがある。
追記5
FPGAについて
FPGAとはField Programmable Gate Arrayの頭文字をとったもので、ICの一種である。FPGAは何度でも(限度はあると思われるが)書き換えが可能である。FPGAに書き込むデータを作成するため、シミュレーションツールでVHDLなどをシミュレーションし、バイナリ作成ツールでコンパイルを行う。