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

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

Chisel3.3.0のリリースノートを確認した(5) - NoChiselNamePrefix

スポンサーリンク

引き続きChisel3.3.0の変更点を。。Chisel3.4.0はリリース間近!!(ただいまRC2)。
今回は#1383@chiselNameの処理を非適用にする機能NoChiselNamePrefixについて。

#1383 @chiselNameの処理を非適用にするトレイトが追加された

この機能は実装部分のscaladocに分かりやすいサンプルが記載されているので、そのサンプルを実行して確認する。

そのサンプルは次のようなもので、肝になるのがNoChiselNamePrefixというトレイトだ。

import chisel3._
import chisel3.experimental.{NoChiselNamePrefix, chiselName}
import chisel3.stage.ChiselStage
import chisel3.util.Counter

// Note that this is not a Module
@chiselName
class Counter(w: Int) {
  val myReg = RegInit(0.U(w.W))
  myReg := myReg + 1.U
}

@chiselName
class TestNoChiselNamePrefix extends Module {
  val io = IO(new Bundle {
    val out = Output(UInt(8.W))
  })

  // Name of myReg will be "counter0_myReg"
  val counter0 = new Counter(8)
  // Name of myReg will be "myReg"
  val counter1 = new Counter(8) with NoChiselNamePrefix
  io.out := counter0.myReg + counter1.myReg
}

object ElaborateNoChiselNamePrefix extends App {
  println((new ChiselStage).emitVerilog(
    new TestNoChiselNamePrefix, args))
}

このサンプルでは、2つのCounterインスタンスを作成し、片方はそのまま、もう一方にはNoChiselNamePrefixをミックスインしている。 NoChiselNamePrefixをミックスインした方のインスタンス@chiselNameの効果が非適用になる。 このトレイトは@chiselNameと同様にchisel3.experimentalに属しているので、仕様時にはインポートを忘れずに。

このサンプルからRTLを生成すると、次のようなRTLが生成される。

module TestNoChiselNamePrefix(
  input        clock,
  input        reset,
  output [7:0] io_out
);
  // そのままインスタンスした場合
  reg [7:0] counter0_myReg; // @[TestChiselName2.scala 10:22]
  wire [7:0] _T_1 = counter0_myReg + 8'h1; // @[TestChiselName2.scala 11:18]
  // NoChiselNamePrefixをミックスインした場合
  reg [7:0] myReg; // @[TestChiselName2.scala 10:22]
  wire [7:0] _T_3 = myReg + 8'h1; // @[TestChiselName2.scala 11:18]
  assign io_out = counter0_myReg + myReg; // @[TestChiselName2.scala 24:10]
  always @(posedge clock) begin
    if (reset) begin
      counter0_myReg <= 8'h0;
    end else begin
      counter0_myReg <= _T_1;
    end
    if (reset) begin
      myReg <= 8'h0;
    end else begin
      myReg <= _T_3;
    end
  end
endmodule

追加として、以下の場合についても確認してみた。

  1. class Counterにのみ@chiselNameを付与
  2. class TestNoChiselNamePrefixにのみ@chiselNameを付与

2つのケースにおいて、Counterインスタンスから生成されるレジスタの名前は、次の表のようになった。

counter0のレジスタ counter1のレジスタ
class Counterにのみ@chiselNameを付与 _T _T_3
class TestNoChiselNamePrefixにのみ@chiselNameを付与 myReg myReg_1

この結果を見る限り@chiselNameは、このアノテーションが付与されたクラス毎に適用されるというのが元々の挙動のようだ。 そこにNoChiselNamePrefixを適用すると、このトレイトを適用したクラスでは@chiselNameの処理がスキップされるという感じ。 前回紹介した「Module以外のクラスにも@chiselNameが適用できるようになった」という機能を追加したことで、この機能も必要になって追加されたような気がする。