ハードウェアの気になるあれこれスマートフォン用の表示で見るハードウェアの気になるあれこれ技術的に興味のあることを調べて書いてくブログ。Vivadoスポンサーリンク前回のSCR1ネタではVivadoシミュレータを使用した際に$readmemhがうまく行かない問題を解析していった。今回はもうひとつ残っているシミュレーションが正常に終わらない問題について解析していく。現状の状態でシミュレーションを実行すると、Vivadoのシミュレータで設定できる最大シミュレーション時間に到達したためシミュレーションが終了している状態にある。現在のシミュレーションに関する設定は以下の画像の通りで、シミュレーションの最大実行時間は3usになっている。シミュレーションの波形は以下のような感じ。黄色のフラグが立っている2295ns以降にAXIバスの動きが一切止まっている状態なのに、シミュレーション自体はタイムアウトの3usまで実行されている状態にある。シミュレーションの終了条件この「3usで終了する」という動作が意図した動作の可能性もあるので、先にこのSCR1のシミュレーション環境の終了条件について確認しておく。scr1_top_tb_axi.svに以下のように明示的な$finishが存在しており、ここに到達すればシミュレーションが終了するはずである。SCR1内部のcurr_pcがSCR1_EXIT_ADDRに到達すること現在のシミュレーションの状態ここで先程のシミュレーション波形をもう一度確認してみる。AXIバスの動きが無くなった部分を拡大したすると以下のようになっていた。I/Fとなっており、この中のio_axi_imem_araddrがSCR1から出力される次の命令のアドレスとなっている。0x4acとなっている。先に確認した内側のforeverループの脱出条件となるがSCR1_EXIT_ADDRは同じファイルに定義されており、以下の通りである。32'h000000F8;このことから、2つあるforeverループのうち内側のループの終了条件に到達していないことが原因で$finishに辿り着かないため、シミュレーションが終了しないことがわかった。ここからは実際のテストコードを見ていこう。現在実行しているのはriscv-testsの中から適当に選択したaddi命令のテストになっている。波形デバッグの際には実際のソースではなく、テストのビルド時に生成される*.dumpを見るほうがいいのでそちらを確認していく。*.dumpファイルはSCR1の環境においてはビルド時に"build"ディレクトリ以下にELFファイルと一緒に生成されるようにMakefileに定義されている。$@ではaddi.dumpを確認していく。先ほど波形で確認したアドレスをaddi.bumpから探すと以下の部分になる。ecall上記のようにaddi試験における試験のPASS/FAIL判定部分のコードになる。0x4a8を通過しているので、このテスト自体の判定はPASS判定になっていることもわかった。本来なら、この0x4acのecall命令を経て、命令読み出しアドレスがSCR1_EXIT_ADDR=0xF8に到達しなければならないのだが、今のVivadoシミュレーション上はそうなっていないためシミュレーションが正常に終了しないことがわかった。うーーーむ、とりあえず終了しない理由はわかったけど、これ以上はSCR1の中の解析が必要そう。引き続き調査が必要、、、ということがわかったので今日はここまで。昨日の記事の結びで以下のように書いた。シミュレーション環境の疑問点の確認(1)前回のSCR1ネタ最後に以下のように書いた。技書博2にChisel本を出してきました月別アーカイブはてなブログをはじめよう!diningyo-kpuku-jougekiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。