ちょっと必要になって調査したので、メモ代わりに残しておく。
Chiselはデフォルトでは同期リセットなのだが、これを非同期リセットにするためのトレイトが用意されている。 多分これはChisel3.4あたりで加わった機能かな?あまり詳細なバージョンは追いかけていないけど。
package async_reset import chisel3._ import chisel3.util._ class async_reset extends Module with RequireAsyncReset { val io = IO(new Bundle { val in = Input(UInt(8.W)) val out = Output(UInt(8.W)) }) io.out := RegNext(io.in, 0.U(8.W)) // reset is of type AsyncReset } object async_reset extends App { chisel3.Driver.emitVerilog(new async_reset()) }
RequireAsyncReset
を付加することでレジスタが同期式になる。RegNext
は初期値を指定するための引数を追加する必要がある。これを追加しないと非同期リセットにはならない。
RegNext(io.in) // これでは非同期リセットにならない
always @(posedge clock) begin REG <= io_in; // @[async_reset.scala 13:20] end
非同期リセットの場合は以下のようになる。
RegNext(io.in, 0.U(8.W)) // 非同期リセットになる
always @(posedge clock or posedge reset) begin if (reset) begin REG <= 8'h0; end else begin REG <= io_in; end end
sbt "runMain async_reset.async_reset"