Introduction to SystemVerilog. Latch, register
ラッチ、レジスタ
SystemVerilogで簡単なラッチ、レジスタを記述してみる。
ラッチ回路
ラッチ回路(d_latch.sv)
Nbitラッチ回路の記述。always_latch文を用いて記述している。en(許可信号)が'1'の時のみ入力信号dを取り込む。
/* d_latch.sv */ module d_latch #(parameter WIDTH = 4) (input logic en, input logic [WIDTH-1:0] d, output logic [WIDTH-1:0] q); always_latch if(en) q <= d; endmodule
レジスタ
レジスタ(register_d.sv)
Nbitレジスタの記述。always_ff文を用いて記述している。clk(クロック信号)の立ち上がり時に入力信号dを取り込む。
/* register_d.sv */ module register_d #(parameter WIDTH = 4) (input logic clk, input logic [WIDTH-1:0] d, output logic [WIDTH-1:0] q); always_ff @(posedge clk) q <= d; endmodule
リセット付きレジスタ(register_dr.sv)
上記のレジスタに非同期リセット入力を付け加えた記述。reset(リセット信号)の立ち上がり時にレジスタの値を'0'にリセットする。
/* register_dr.sv */ module register_dr #(parameter WIDTH = 4) (input logic clk, input logic reset, input logic [WIDTH-1:0] d, output logic [WIDTH-1:0] q); always_ff @(posedge clk, posedge reset) begin if(reset) q <= 4'b0000; else q <= d; end endmodule
リセット・イネーブル付きレジスタ(register_dre.sv)
上記の記述にイネーブル入力を付け加えた記述。clk(クロック信号)の立ち上がり時にen(エネーブル信号)が'1'の時のみ入力信号dの値を取り込む。
/* register_dre.sv */ module register_dre #(parameter WIDTH = 4) (input logic clk, input logic en, input logic reset, input logic [WIDTH-1:0] d, output logic [WIDTH-1:0] q); always_ff @(posedge clk, posedge reset) begin if(reset) q <= 4'b0000; else if(en) q <= d; end endmodule