SystemVerilog|文法サンプルコードまとめ

田中太郎
田中太郎

サンプルです

module

module(Verilogの回路の単位)を作成します

基本

module sample(
    input clk,
    input rst_b,
    input din,
    output logic dout
);
endmodule

こうも書けます(Verilogはこちらのみ)

module sample;
    input clk;
    input rst_b;
    input din;
    output logic dout;
endmodule

always_ff

Flip-Flopを作成します

基本

always_ff @(posedge clk, negedge rst_n) begin
    if (!rst_n) begin
        dout <= 1'b0;
    end
    else begin
        dout <= din;
    end
end

Verilog ではalways_ff が使えないので下記のように書きます

always @(posedge clk, negedge rst_n) begin
    if (!rst_n) begin
        dout <= 1'b0;
    end
    else begin
        dout <= din;
    end
end

always_comb

組み合わせ回路を作成します

基本

always_comb begin
    if (en) begin
        dout = 1'b0;
    end
    else begin
        dout = din;
    end
end

Verilogではalways_ffが使えないので下記のように書きます

always @(*) begin
    if (en) begin
        dout = 1'b0;
    end
    else begin
        dout = din;
    end
end

always_latch

ラッチを作成します

基本

always_latch begin
    if (en) begin
        dout = din;
    end
end

Verilog ではalways_latch が使えないので下記のように書きます

always @(*) begin
    if (en) begin
        dout = din;
    end
end

if

if文を使用します

always_ff @(posedge clk) begin
    if (!rst_b) begin
        dout = 1'b0;
    end
    else if (set) begin
        dout = 1'b1;
    end
    else begin
        dout = din;
    end
end

case

case文を使用します

always_comb begin
    case (sel)
        2'b00:   dout = 2'b00;
        2'b01:   dout = 2'b01;
        2'b10:   dout = 2'b11;
        default: dout = 2'b10;
    endcase
end

generate-for

generate文を使用します

generateは飾りなので、なくても動きます

genvarはgenerate-forのindexを宣言します

genvar i;
generate
for (i = 0; i < 10; i++) begin
    always_comb begin
        if (sel) begin
            dout[i] = 1'b0;
        end
        else begin
            dout[i] = din[i];
        end
    end
end
endgenerate

generate-if

defineやパラメータの値によって回路を変更できます

`define DEF_SEL 0
generate
if (`DEF_SEL) begin
    always_ff @(posedge clk) begin
        dout <= 1'b0;
    end
end
else begin
    always_ff @(posedge clk) begin
        dout <= 1'b1;
    end
end

foreach

for文のindexを自動で設定してくれます

module sample(
    input [5:0] din,
    output logic [5:0] dout
);
    always_comb begin
        foreach (din[i]) begin
            dout[i] = din[i];
        end
    end
endmodule

function

function文を使用します

functionは組み合わせ回路のみに使用できます

シーケンスをまたぐ記述はできません

function func(
    input din
);
    func = ~din;
endfunction
assign dout = func(din);

task

taskを使用します

taskはfunctionと違い、Delayを入れることができます

task task_sample;
    #10;
    dout = din;
endtask

initial begin
    task_sample;
end

パラメータ

パラメータを設定します

module sample #(
    parameter BW_A = 3,
    parameter BW_B = 4
)(
    input [BW_A-1:0] din,
    output logic [BW_B-1:0] dout
);
endmodule

インスタンス

別なmoduleと接続します

module top(
    input din,
    output logic dout
);
    sub u_sub(
        .din(din),
        .dout(dout)
    );
endmodule

module sub(
    input din,
    output logic dout
);
    assign dout = din;
endmodule

パラメータも継承できます

module top #(
    parameter BW = 3
)(
    input [BW-1:0] din,
    output logic [BW-1:0] dout
);
    sub #(
        .BW(BW)
    ) u_sub(
        .din(din),
        .dout(dout)
    );
endmodule

module sub #(
    parameter BW = 3
)(
    input [BW-1:0] din,
    output logic [BW-1:0] dout
);
    assign dout = din;
endmodule

埋め込みコマンド

$test$plusargs

$test$plusargs("test");

$value$plusargs

$value$plusargs("din=%d", din);

$display

$display("%", a);

コメント

タイトルとURLをコピーしました