ハードウェアの気になるあれこれ

技術的に興味のあることを調べて書いてくブログ。主にハードウェアがネタ。

Chisel3.3.0のリリースノートを確認した(4) - @chiselNameが強化された

スポンサーリンク

あっという間に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のBundleModuleになるのは当たり前で、他に広げても意味ないんじゃ??と思っていた。

、、、が、考えて&試してみると、次のようなコードは普通にエラボレートが出来るので@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が強化された話でした。