ハードウェアの気になるあれこれスマートフォン用の表示で見るハードウェアの気になるあれこれ技術的に興味のあることを調べて書いてくブログ。Verilog-HDLスポンサーリンク前回のChiselの記事ではBundleの基本的な使い方についてをまとめたみた。www.tech-diningyo.info今回は前回まとめたBundleを使ってモジュールのIOポートをオプション化する方法についてをまとめておく。前に紹介したビット幅0にする方法で行う複数ポートのオプション化SomeとBundleですっきり!!ChiselでIOポートのオプション化するには?まずは基本的な話から再度確認しておく。この話は実は今進めているChisel-Bootcampの中でも簡単な例が取り扱われている。その時に”でもこれじゃ野暮ったいから、もっと楽に書けないかしら・・・”と思ったがその時は、自分のレベルが低すぎて答えが見つからなかった。それから少し経って”あ、これでイケるんじゃん!”って気づいたので改めて、基本的なことからまとめてみようと思う。因みに過去の記事は以下↓。www.tech-diningyo.infoモジュールのIOポートのオプション化ーその1以下のコードは上に貼った過去記事のもの。クラスパラメータとScalaにあるOption型の一つであるSomeを使うことでポートをオプション化することが出来る。以下の例ではcarryInがある場合ない場合の計算に対応するためにOption型のメソッドgetOrElseを使い、carryInが存在しない場合には0.Uが加算されるようにしている。sum(1)}上記のコードをクラスパラメータ"hasCarry"を変更してインスタンスして生成したRTLを見ると以下のようにcarryInポートの有無や、それに応じたsumの計算が変更されているのがわかると思う。これはgetOrElseを使って計算式を一つにまとめたからでRTL的に0.Uの加算が気に食わなければ、普通にif文で切り替えてももちろんOK。carryInが存在しないため2'h0が加算される。sum(1)}オプション化対象のポートのビット幅が0になるようにすると、そのポートはRTLの生成時に削除される。以下が生成されたRTL。見てわかる通りSomeを使った場合と同様のRTLが生成されている。見てきたとおりSomeを使ってもビット幅が0になるようにしても上記で生成されたRTLは一緒になる。Chisel3ではVerilogのRTLを生成する際にはFIRRTLという中間表現を生成した後に、それをVerilogに変換していいる。いうことでFIRRTLレベルではどうだろう??という疑問が湧いたので一応確認してみる。11:15]という結果になった。Someを使うと、FIRRTL生成時に不要な端子は削除されるビット幅を0にする手法を使うと、Verilogの生成時に端子が削除されるという挙動になっているようだ。出力ポートのオプション化ここまでの例は入力ポートのオプション化に関する例しかなかったので、出力ポートのオプション化についても見ておく。Someを使っ出力ポートのオプション化Someを使う場合は以下のようにすればいい。}}実はこの方法に気づけなくて野暮ったい書き方になるなぁ、、、、と悩んでいました。io.in}Someとビット幅0のif文のあるなしの違いを表しているのが、先にみたFIRRTL上の表現になる。Someの場合はFIRRTL生成時には既にoptOutポートが存在しないためif文でくくってインスタンス時に切り替えないとエラーが発生するが、ビット幅0の場合はFIRRTL上はポートが存在するためエラーにはならない。書いてきましたが、これが今日の本題&やっと気づけたやり方。言っても既に本記事で書いた内容でもあるので簡単に。Chiselのテスターを使って内部の信号を比較するようなケースやデバッグのためにトレースしたい、、といったことを考えた際に、それらのポートは対象モジュールのIOに引き出してやる必要がある。これは実際の回路としては不要になるため、オプション化して最終のRTLからは削除するのが普通だと思う。これを以前に紹介したビット幅を0にする手法でやると、以下のように野暮ったい感じに・・・。io_in;endmodule先に書いたように、所望の結果にはなる。なるんだけどIOの宣言が滅茶めんどくさい。いうことでSomeとBundle使うとすっきり書けます。それだけ(笑)上の例だと以下のようになります。}}これだとif文でくくったこともあり、ブロックで構造化されていい感じ。デバッグに使いたい信号との接続は書く必要はあるが、Bundleを使っているため上層に引き渡す際には<>を使って接続が可能になる。top.io.dbgPort.get}結局長々書いたが要点は実は以下の1点な気がした。Bundleで構造化できるから、しといた方がいろいろ楽に書ける!ということで、BundleとSomeを使ったIOのオプション化の方法でした。ChiselのArbiter前回の記事ではChiselの標準ライブラリからQueueを紹介した。技書博2にChisel本を出してきました月別アーカイブはてなブログをはじめよう!diningyo-kpuku-jougekiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。