引き続きChisel3.3.0の変更点を。。Chisel3.4.0はリリース間近!!(ただいまRC3)。
今回はIssueのタイトル読めばほぼ理解できる、次の3つを簡単に紹介。
- (#1283) BitPatで空白文字が使えるようになった
- (#1284) ScalaのDouble/BigDecimalからFixedPointへの変換ができるようになった
- (#1326) Printfがタブ文字をサポートした
なお、補足として説明する部分もほとんどないので、基本サンプルコードと実行結果を貼るだけ。
- #1283 BitPatで空白文字が使えるようになった
- #1284 ScalaのDouble/BigDecimalからFixedPointへの変換ができるようになった
- #1326 Printfがタブ文字をサポートした
#1283 BitPatで空白文字が使えるようになった
Chisel 3.2.xまでのBitPat
では、区切り文字として使用できるのが_
だけだった。これがChisel 3.3.0からは空白文字も使用可能になったとのこと。
使いたい人はどれくらいいるんだろう、、と思わなくもない。
サンプルは次のような感じ。
import chisel3._ import chisel3.stage.ChiselStage import chisel3.util._ class BitPatWithWS extends Module { val io = IO(new Bundle { val in = Input(UInt(8.W)) val out = Output(Bool()) }) io.out := io.in === BitPat("b???? 0001") } object ElaborateBitPatWithWS extends App { println((new ChiselStage).emitVerilog(new BitPatWithWS, args)) }
見ての通りでBitPatWithWS
中のBitPat
に空白文字が含まれている。上記コードのElaborateBitPatWithWS
を実行すると、エラーにならずに
処理されることが確認できた。
[info] running ElaborateBitPatWithWS [info] [0.001] Elaborating design... [info] [0.043] Done elaborating. Computed transform order in: 185.8 ms Total FIRRTL Compile Time: 326.2 ms module BitPatWithWS( input clock, input reset, input [7:0] io_in, output io_out ); wire [7:0] _T = io_in & 8'hf; // @[BitPatWithWS.scala 12:19] assign io_out = 8'h1 == _T; // @[BitPatWithWS.scala 12:10] endmodule [success] Total time: 2 s, completed 2020/09/30 22:29:55
#1284 ScalaのDouble/BigDecimalからFixedPointへの変換ができるようになった
これもほぼそのままで、ScalaのBigDecimal
とDouble
型の変数からChiselのFixedPoint
への変換を行う処理がサポートされた。
なので、次のようなコードが実行可能になる。
import chisel3._ import chisel3.util._ object ExpandToFixedPoint extends App { val bd = BigDecimal("1.125") val bdLit = bd.I(3.BP) // .IでBiGDecimalをFixedPointに変換 // FixedPointをBigDecimalに変換してbdを比較 println(s"${bdLit.litToBigDecimal == bd}") val d = 1.125 val dLit = d.F(3.BP) // .FでDoubleをFixePointに変換 // FixedPointをDoubleに変換してdを比較 println(s"${dLit.litToDouble == d}") }
この機能は、Scalaの暗黙の型変換を使ってDouble
/BigDecimal
にFixedPoint
への変換メソッド(bd.I
/d.F
)を追加することで実現されている。
これによってChisel 3.2.xではエラーになっていたDobule
/BigDecimal
からの変換が可能となった。
また逆の処理を行うためFixedPoint
にはFixedPoint
をDobule
/BigDecimal
に変換するためのメソッドが追加されており、上記のコードではFixedPoint
に変換したものと、もとに戻したものを比較して値が一致することを確認している。
以下が実行結果で、エラーが発生せずに処理できることと、変換の前後で結果が一致することを確認できた。
[success] Total time: 1 s, completed 2020/09/30 22:38:50 [IJ]sbt:chisel33x> runMain ExpandToFixedPoint [warn] Multiple main classes detected. Run 'show discoveredMainClasses' to see the list [info] running ExpandToFixedPoint true true [success] Total time: 0 s, completed 2020/09/30 22:38:51
#1326 Printfがタブ文字をサポートした
これについては、この上なくそのまんま。
Chiselのテスト機構を使った際の、表示に使用するprintf
メソッドでタブ文字が使えるようになった。
ということで、サンプルは次のようなものを試してみた。
import chisel3._ import chisel3.iotesters.PeekPokeTester class SupportTAB extends Module { val io = IO(new Bundle {}) printf("io.in\t0x%x\n", 0xff.U(8.W)) } object TestSupportTAB extends App { iotesters.Driver.execute(args, () => new SupportTAB) { c => new PeekPokeTester(c) { step(2) } } }
見て通りでSupportTAB
のprintf
に\t
が含まれている。
TestSupportTAB
を実行すると、エラーは起きずに次のような出力を得ることができた。
file loaded in 0.043144175 seconds, 14 symbols, 11 statements [info] [0.001] SEED 1601473359685 io.in 0x0ff io.in 0x0ff test SupportTAB Success: 0 tests passed in 7 cycles in 0.009119 seconds 767.66 Hz [info] [0.002] RAN 2 CYCLES PASSED [success] Total time: 1 s, completed 2020/09/30 22:42:40 [IJ]sbt:chisel33x>
ということで、読んだ通りのものですが変更点3種を紹介でした。