引き続き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
追加として、以下の場合についても確認してみた。
-
class Counter
にのみ@chiselName
を付与 -
class TestNoChiselNamePrefix
にのみ@chiselName
を付与
2つのケースにおいて、Counter
のインスタンスから生成されるレジスタの名前は、次の表のようになった。
counter0のレジスタ名 | counter1のレジスタ名 | |
---|---|---|
class Counter にのみ@chiselName を付与 |
_T | _T_3 |
class TestNoChiselNamePrefix にのみ@chiselName を付与 |
myReg | myReg_1 |
この結果を見る限り@chiselName
は、このアノテーションが付与されたクラス毎に適用されるというのが元々の挙動のようだ。
そこにNoChiselNamePrefix
を適用すると、このトレイトを適用したクラスでは@chiselName
の処理がスキップされるという感じ。
前回紹介した「Module
以外のクラスにも@chiselName
が適用できるようになった」という機能を追加したことで、この機能も必要になって追加されたような気がする。