単純なデータパスであれば簡単に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を定義できるか?ちょっとやってみよう。