随分前に(10年ぐらい昔?)ghdlなるOSSのhdlシミュレーターを試した事があるが当時は機能も仕様もイマイチで実用性に疑問があってverilog専用のiverilogを使っていたがvhdlを使おうとしてOSSとなるとghdlで最近は実用レベルになっている様で試してみる↓
gtkwaveは今更なので説明は省略。ポイントはghdlでgtkwaveが受け付ける .vcdファイルをghdlのシミュレーションで出力させる事で例えば
ghdl -a --ieee=synopsys clk_gen.vhd
ghdl -a --ieee=synopsys cpu15_sim.vhd
ghdl -a --ieee=synopsys cpu15.vhd
ghdl -a --ieee=synopsys decode.vhd
ghdl -a --ieee=synopsys exec.vhd
ghdl -a --ieee=synopsys fetch.vhd
ghdl -a --ieee=synopsys ram_dc.vhd
ghdl -a --ieee=synopsys ram_wb.vhd
ghdl -a --ieee=synopsys reg_dc.vhd
ghdl -a --ieee=synopsys reg_wb.vhd
ghdl -e --ieee=synopsys cpu15_sim
ghdl -r --ieee=synopsys cpu15_sim --vcd=cpu15_sim.vcd --stop-time=6000ns
といった感じ。上記コードはワタシ的には名著の誉高い
のダウンロードサービスの第7章から引用させて頂いた。でgtkwaveのシミュレーション結果は↓
このtpはシステムクロックとリセットしか記載されていないのでイニシャルシーケンスみたいな(頭がverilogでvhdlは作法が硬すぎで(私の頭悪すぎて:)放棄してしまったのでこれまた再教育が必要な状況(トホホ))だがise/vivado,quartus2,diamondといったメーカ製の開発環境(diamondはまだしもxとa(i)はシミュレータだけ使うには重量級故)に比べると軽量(但し無保証)故、気軽にvhdlでもOSSでシミュレーション可能な環境が存在するのを知りましたというお話でした。
20221127追記:exec.vhdの92行でエラーが出ていたのでghdlに合わせて修正
発生したエラー:
exec.vhd:92:58:error: operator "=" is overloaded
if(REG_A = REG_B) then
^
exec.vhd:92:58:error: possible interpretations are:
../../src/synopsys/std_logic_unsigned.vhdl:64:14:error: function "=" [std_logic_vector, std_logic_vector return boolean]
../../src/ieee/v93/std_logic_1164.vhdl:90:8:error: function "=" [std_logic_vector, std_logic_vector return boolean]
exec.vhd:92:58:error: (you may want to use the -fexplicit option)
if(REG_A = REG_B) then
^
cpu15_sim.vhd:259:17:warning: instance "c7" of component "exec" is not bound [-Wbinding]
修正内容(ghdlに合わせて):第七章のexec.vhdの92行目
変更前:if(REG_A = REG_B)
変更後:if ieee.std_logic_unsigned."="(REG_A,REG_B)
関連するghdlリファレンス:
It is better to only use the standard packages defined by IEEE, which provides the same functionalities:
library ieee; use ieee.numeric_std.all;
では今現在の私の環境ではエラーが解除されなかったので上記記述で解消した。
gtkwaveでのシミュレーション出力:
reg_0[15:0]が16進数表記で0x37(=十進数で55)の加算結果が出力されている。
OSS故?か独自色を有するghdlを使うか実績有るベンダCAD(A/X/Lのいづれか或いは複数)に結局寄せるのかは今後の状況で判断する(と思う)。。。