田中太郎
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の引数について考えてみました
コメント