あっという間に9月になりました。。
本題に入る前に少し宣伝的な事も書いてみます。
過ぎ去った8月末に、昨年同人誌で出版したChiselの本の商業誌版が出版されました。
内容的には同人誌版をベースに執筆時点で書ききれなかった内容+執筆時点からのアップデートが追加されたものになっています。ざっくりとは次の点を追加しました。
- 書き漏らしていたトピックの追加
- desiredName
- おまけ扱いにしたUartをエコー制御するシステムの解説
- Chisel3.3.0のトピックをいくつか追加
- ChiselStageを使ったRTLの生成
- RequireAsyncResetの解説
あとは自分で発見できた限りの誤字や画像の修正などなど。。。
商業誌版の出版にあたって、サンプルコードはgithubに公開しています。多分こっちをざっと見るだけでもそれなりに役に立つかと思いますので「Chisel始めたいけど、サンプルとかが見つからないしなー」と思ったことのある方は是非、ご覧になってみてください(本も見てもらえるとなお嬉しい)。
以上、宣伝でした。
ということで、引き続きChisel3.3.0の変更点を確認していく、、、、んだけど、早くしないとChisel3.4.0が出てきそう(ただいまRC1)。
今回は#1209の@chiselName
がChiselのモジュール以外にも適用可能になったという件について。
#1209 @chiselName
がChiselのモジュール以外にも適用可能になった
最初PRを読んでいて、どーいうこと??となっていたんだけど、それはそもそもChiselのモジュール以外(non-module)という表現がしっくり来ていなかったことが原因だった。
通常Chiselでクラスを使うケースは
- モジュールを作る →
class Module
を継承 - 複数の信号を束ねる →
class Bundle
を継承
の2つが主な用途になる。このときChiselでHWになる要素を示すためにChiselの特定クラスを継承するので、@chiselName
の対象がChiselのBundle
やModule
になるのは当たり前で、他に広げても意味ないんじゃ??と思っていた。
、、、が、考えて&試してみると、次のようなコードは普通にエラボレートが出来るので@chiselName
の対象範囲を拡大することには意味があることに気づいた。(chisel3.util
とかでも使われてた。。。)
// Sample自体はただのScalaのクラス class Sample { val a = Reg(Bool()) // これはChiselのハードウェア } class TestChiselName extends MultiIOModule{ val io = IO(new Bundle { val in = Input(Bool()) val out = Output(Bool()) }) val s = new Sample s.a := io.in io.out := s.a }
この例ではSample
クラス自体はChiselのBundle
を継承していないので、上記の"non-module"という表現に当てはまるクラスになっている。
そして、そのクラスの中のa
がChiselのハードウェア要素なので、Sample
クラスをインスタンスすると、この信号a
には普通に他の信号を接続することが出来る、というのが上記のサンプルの内容になる。
このコードを実際にエラボレートしてRTLを生成すると、次のようなRTLが生成された。
module TestChiselName( input clock, input reset, input io_in, output io_out ); reg _T; // @[TestChiselName1.scala 9:14] assign io_out = _T; // @[TestChiselName1.scala 21:10] always @(posedge clock) begin _T <= io_in; end endmodule
sample.a
という信号は中間変数として扱われて_T
という変数になっている。
このときSample
に@chiselName
を付与してエラボレートし直すと、次のようにSample
クラス内のa
という変数名が消えること無く、維持される結果となった。
module TestChiselName( input clock, input reset, input io_in, output io_out ); reg a; // @[TestChiselName1.scala 9:14] assign io_out = a; // @[TestChiselName1.scala 21:10] always @(posedge clock) begin a <= io_in; end endmodule
使いわますような、制御系の論理をまとめておく、、、とかは出来たりするので、そういうユーティリティ的な
論理を構築する時には@chiselName
を付与しておくと、RTLの可読性が上がって良さそう。(例えばchisel3.util.counter
のような感じで、モジュールでは無いけど、テンプレート化したいような論理)。
ということで、@chiselName
が強化された話でした。