FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Chiselにおける非同期リセットの実現方法

ちょっと必要になって調査したので、メモ代わりに残しておく。

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"