aki_iic’s blog

己の欲せざる処人に施す事無かれ、狂人の真似するは即ち狂人なり

ghdl

 随分前に(10年ぐらい昔?)ghdlなるOSSのhdlシミュレーターを試した事があるが当時は機能も仕様もイマイチで実用性に疑問があってverilog専用のiverilogを使っていたがvhdlを使おうとしてOSSとなるとghdlで最近は実用レベルになっている様で試してみる↓

qiita.com

 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

 といった感じ。上記コードはワタシ的には名著の誉高い

gihyo.jp

 のダウンロードサービスの第7章から引用させて頂いた。でgtkwaveのシミュレーション結果は↓

ghdl+gtkwave simulation

 このtpはシステムクロックとリセットしか記載されていないのでイニシャルシーケンスみたいな(頭がverilogvhdlは作法が硬すぎで(私の頭悪すぎて:)放棄してしまったのでこれまた再教育が必要な状況(トホホ))だが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リファレンス:

ghdl.free.fr

 

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でのシミュレーション出力:

ghdl+gtkwave simulation(第七章 exec.vhdの92行のghdl用に修正)

 reg_0[15:0]が16進数表記で0x37(=十進数で55)の加算結果が出力されている。
OSS故?か独自色を有するghdlを使うか実績有るベンダCAD(A/X/Lのいづれか或いは複数)に結局寄せるのかは今後の状況で判断する(と思う)。。。