FPGA開発日記

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

FIRRTLに入門する (8. FIRRTLのレジスタアップデートの動作を確認する)

https://raw.githubusercontent.com/freechipsproject/firrtl/master/doc/images/firrtl_logo.svg?sanitize=true

単純なデータパスであれば簡単にFIRの記述を書くことができる。次に、レジスタアップデートについて挙動を確認しよう。レジスタアップデートには、クロックとリセットの記述が必要である。

クロックは独自の型が定義されているが、リセットは独自の型が定義されていない。後述するAsynchronous Resetでは独自の型が定義されているようだ。Reset信号は通常の信号線として定義する。

circuit SimpleCircuit :
  module SimpleCircuit :
    input clk : Clock
    input rst : UInt<1>
...

FIRてレジスタを定義する場合には、使用するクロックと、必要ならばリセット信号を接続し、初期値を設定する。when文でアップデートする条件を記述していく。when文の条件は、調査してみると下の行から適用されるようだ。下記の実装では、clrが先の条件に入っている。

    reg myreg : UInt<32>, clk with : (reset => (rst, UInt<32>("h0")))
    when en :
      myreg <= io.in
      skip
    when clr :
      myreg <= UInt<32>("h1")
      skip
    io.out <= myreg
  always_ff @(posedge clk) begin
    if (rst) begin
      myreg <= 32'h0;
    end else if (clr) begin
      myreg <= 32'h1;
    end else if (en) begin
      myreg <= io_in;
    end
  end

ちなみに、Chisel3.2で入ったAsynchronous Resetは下記のようにして記述する。FIRRTLの独自の文法ではなく、Asynchronous Reset向けの独自の信号型を使用する。

circuit SimpleCircuit :
  module SimpleCircuit :
    input clk : Clock
    input arst : AsyncReset # AsyncReset型を使用する
...
    reg myreg2 : UInt<32>, clk with : (reset => (arst, UInt<32>("h0")))
    when en :
      myreg2 <= io.in
      skip
    when clr :
      myreg2 <= UInt<32>("h1")
      skip
    myreg_out <= myreg2
  always @(posedge clk or posedge arst) begin
    if (arst) begin
      myreg2 <= 32'h0;
    end else if (clr) begin
      myreg2 <= 32'h1;
    end else if (en) begin
      myreg2 <= io_in;
    end
  end

ということはこれ、Negative Edge用のReset信号の型を定義すればNegative Resetを定義できるか?ちょっとやってみよう。