SystemVerilog|taskの引数の方向について考える

Systemverilog
田中太郎
田中太郎

taskの引数は一癖あります

引数の方向(input/output/ref/inout)

taskは引数の方向として以下を取ることができます

input:入力
ouput:出力
ref:参照
inout:入出力

上記のそれぞれを使用したサンプルコードを以下に示します

module tb;
    task automatic tmp(
        input logic [1:0] a,
        output logic [1:0] b,
        inout logic [1:0] c,
        ref logic [1:0] d[]
    );
        b = ~a;
        c = ~c;
        d[0] = ~d[0];
    endtask

    logic [1:0] a, b, c;
    logic [1:0] d[];
    initial begin
        a = 2'b00;
        c = 2'b00;
        d = new[1];
        d[0] = 2'b00;
        tmp(a, b, c, d);

        $display("a = %b", a);
        $display("b = %b", b);
        $display("c = %b", c);
        $display("d = %b", d[0]);
        $finish;
    end
endmodule
// 出力
// a = 00
// b = 11
// c = 11
// d = 11

引数の方向を付けないとinputとして扱われる

次に引数に方向を付けないでみます

module tb;
    task automatic tmp(
        logic [1:0] a
    );
        a = ~a;
    endtask

    logic [1:0] a;
    initial begin
        a = 2'b01;
        tmp(a);

        $display("a = %b", a);
        $finish;
    end
endmodule
// 出力
// a = 01

taskでaの値が反転していません

デフォルトではinputとして扱われるようです

taskの引数は前の引数の方向を引き継ぐ

次に、最初の引数にoutputを付けて2つ目には付けないで見ます

このとき、2つ目の引数の方向はinputになるのでしょうか?

module tb;
    task automatic tmp(
        output logic [1:0] a,
        logic [1:0] b
    );
        a = ~b;
    endtask

    logic [1:0] a, b;
    initial begin
        b = 2'b10;
        tmp(a, b); // bはinput?

        $display("a = %b", a);
        $display("b = %b", b);
        $finish;
    end
endmodule
// 出力
// a = xx
// b = xx

taskで「a」には「output」を付けて「b」には付けていません

デフォルトで「input」になるはずなので「a = 01」, 「b = 10」になっていそうですが出力を見ると

「a = xx」, 「b = xx」 (xは不定)になっています

このことから「b」が「output」になっていることがわかります

taskの引数の特性に前の引数の方向性を引き継ぐというものがあることがわかります

試してみましょう

module tb;
    task automatic tmp(
        output logic [1:0] a,
        logic [1:0] b,
        input logic [1:0] c
    );
        a = c;
        b = ~c;
    endtask

    logic [1:0] a, b, c;
    initial begin
        c = 2'b10;
        tmp(a, b, c); // aはcの値、bはcを反転したものを出力するtask

        $display("a = %b", a);
        $display("b = %b", b);
        $display("c = %b", c);
        $finish;
    end
endmodule
// 出力
// a = 10
// b = 01
// c = 10

「a」、「b」は「output」で、「c」は「input」になっていそうですね

まとめ

taskの引数について考えてみました

コメント

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