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

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

Chisel3.3.0のリリースノートを確認した(6) - 簡単なやつを3つ

スポンサーリンク

引き続きChisel3.3.0の変更点を。。Chisel3.4.0はリリース間近!!(ただいまRC3)。
今回はIssueのタイトル読めばほぼ理解できる、次の3つを簡単に紹介。

なお、補足として説明する部分もほとんどないので、基本サンプルコードと実行結果を貼るだけ。

#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への変換ができるようになった

これもほぼそのままで、ScalaBigDecimalDouble型の変数から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/BigDecimalFixedPointへの変換メソッド(bd.I/d.F)を追加することで実現されている。 これによってChisel 3.2.xではエラーになっていたDobule/BigDecimalからの変換が可能となった。 また逆の処理を行うためFixedPointにはFixedPointDobule/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)
    }
  }
}

見て通りでSupportTABprintf\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種を紹介でした。