k0b0's record.

Computer Engineering, Arts and Books

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