・いろいろやっていくと、DSimの甘さが気になってきた。存在しない信号に接続してもだんまりというのが一番大きい。
・更に、これは自分の問題かもしれないけど、ハンドシェークを書いていて相手からのACKを受けたポートを内部信号にalways_combで非同期で取り込んでいるはずなのに1クロックディレイがある。この1クロック分というのがステートマシンの動作クロックで、確かにこの中でACKを見ているけど、そのせいでラッチが生成されるのだろうかな。
・ということで、他のシミュレーション環境は?と思っていて
Verilatorに手を出してみることにした。
・VerilatorはVerilogからC++やSystemCに変換してシミュレーションするという代物。今までIcarusで別段不自由無いくらいだったけど良い機会だから試してみよう。
・インストールはSynapticパッケージマネージャを開いたらVersion4.038があったからとりあえずこれで良いかな。
・サラッと終わったので、今までDSimしていたもので
verrrilator -lint-only testsv.sv
てな具合でlintしてみたら、いきなり
Unsupported: Interfaced port on top level module
と叱られた。トップモジュールでinterfaceを使うのはご法度なのか。
・ということでGeminiに問い合わせ(最近依存しているな)てみると、IEEE 1800-2017などを厳密に解釈するとinterfaceは「どこかとつながっている」ことを前提とした仕様だというお話。なるほどね。なんとなくすっきりした。
・ということで、一枚皮をかぶせることに。今までのトップモジュールを下位に追いやって、テストベンチで接続していたinterfaceをトップモジュールで接続。どうせ下位モジュールの信号も全部見られるのだからこれで問題ない。
・ということで書き換えてみたらverilatorのエラー消滅。