●シミュレーションを走らせる

 下の枠内、コマンドラインでdo run.doとタイプしてリターン(図2-25)するとシミュレーションがスタートします。コマンドラインが見あたらないときは、メニューのViewからTranscriptを選択してみましょう。

  図2-25 コマンドラインからdo run.doでシミュレーションが始まる

●シミュレーション結果を見る

 シミュレーションは数分でストップします。その後、do wave.doとタイプしましょう(図2-26)。

 Waveウインドウに図2-27のような波形が現れます。
500usの期間シミュレーションされています(右クリックでZoom Full選択)。

  図2-26 do wave.doで波形を見る


  図2-27 500usまでシミュレーションされた

 マウスの中ボタンで波形を横に引き伸ばして最初の100usを見てみましょう(図2-28)。Z1_WR_DATAがニューラルネットワーク1層目の結果です。EXCEL表のz1の行と比較してピタリ一致していることを確認しましょう。

  図2-28 1層目の結果Z1_WR_DATAがEXCELと一致!

 2層目の結果は400usあたりからZ2_WR_DATAに出てきます。図2-29のように拡大してEXCEL表のz2の行と比較してピタリ一致していることを確認しましょう。

  図2-29 2層目の結果Z2_WR_DATAがEXCELのz2と一致!

 3層目の結果は450usあたりからAINに出てきます。図2-30のように拡大してEXCEL表のa3の行と比較してピタリ一致していることを確認しましょう。

  図2-30 3層目の結果AINがEXCELのa3と一致!

●推論の結果も途中経過もピタリ一致した!

 AINの最大値をjudge.vhdで探して推論結果を得ます。図2-31のようにANSWERという信号に
「7」が現れています。テスト画像の1枚目は「7」なので、正解だということが分かります。また推論にかかる時間は461usだということも分かります。(*2)

(*2)最初の5usはリセット期間。その後から計測している。メニューのAdd→Cursorでカーソルをもう1本追加して時間差を測る

 波形を引き伸ばしてCLKの周期を測ると10nsになっています。すなわち推論にかかるサイクル数は461us / 10ns =
46.1kサイクルです。

  図2-31 推論結果は7。かかる時間は461us


  図2-32 1層目で圧倒的に時間がかかる

 図2-32のようにフルスケールにしてメニューのAdd→Cursorでカーソルを追加し、各層でかかる時間を計測します。1層目が400us (40kサイクル)、2層目が50.5us (5.05kサイクル)、3層が11us (1.1kサイクル)かかっています。


●1層目にかかる時間が圧倒的に長い

 各層でかかるサイクル数(MNIST画像1枚あたり)とその割合を表2-01に示します。

  表2-01 
1層目の割合が大きい(1サイクル = 10ns)
1層目 2層目 3層目 全体
時間 400us 50.5us 11us 461us
サイクル数 40k 5.05k 1.1k 46.1k
割合 87% 11% 2.4% 100%


●ひとまずVHDL化は成功。あとは並列化とパイプライン化でスピードアップ!

 表2-01のように、推論にかかる時間はほとんど
1層目に支配されていることが分かります(全体の87%)。なんとか1層目を高速化したいところですね。

 次章では1層目で行われる演算を「
並列化」して約50倍高速化します。お楽しみに!

最初のページへ


目次へ戻る