Implicit port connection

SystemVerilogでは、ポートの接続方法の略記法が拡張されている。これは、implicit port connetionと呼ばれている。

Implicit port connectionには2つの方法があり、一つはポート名を指定する方法、もう一つは複数ポート一括接続する方法である。

ポート名を指定するほうのサンプルから見てみよう。

module test1();

wire [3:0] command;

wire [7:0] wdata;

wire [7:0] rdata;

host hostIns(.command, .wdata, .rdata);

target targetIns(.command, .rdata, .wdata);

initial begin

#10

$display("command = %x, wdata = %x, rdata = %x",

command, wdata, rdata);

$finish();

end

endmodule

module host(

output logic [3:0] command,

output logic [7:0] wdata,

input logic [7:0] rdata);

assign command = 4'hf;

assign wdata = 8'h55;

endmodule

module target(

output logic [7:0] rdata,

input logic [3:0] command,

input logic [7:0] wdata);

assign rdata = wdata + 8'b1;

endmodule

注目してほしいのは、トップのモジュールtest1の中でサブモジュール、hostInstとtargetInsをインスタンス化している部分だ。

この行は、Verilogであれば

host hostIns(.command(commnad), .wdata(wdata), .rdata(rdata));

target targetInst(.command(commnad), .rdata(rdata), .wdata(wdata));

でなければならない。

SystemVerilogは、ポート名と信号名が同じ名前、同じビット幅の場合、カッコ内を省略することができる。

これが、ポート名を指定したimplicit port connectionになる。

次が、複数ポートの一括接続例だ。

module test2();

wire [3:0] command;

wire [7:0] wdata;

wire [7:0] rdata;

host hostIns(.*);

target targetIns(.*, .wdata(8'h11));

initial begin

#10

$display("command = %x, wdata = %x, rdata = %x",

command, wdata, rdata);

$finish();

end

endmodule

module host(

output logic [3:0] command,

output logic [7:0] wdata,

input logic [7:0] rdata);

assign command = 4'hf;

assign wdata = 8'h55;

endmodule

module target(

output logic [7:0] rdata,

input logic [3:0] command,

input logic [7:0] wdata);

assign rdata = wdata + 8'b1;

endmodule

.*により、ポート名と信号名、およびそのビット幅が一致しているもの全てを自動で接続することができる。

targetInsの例に見られるように、従来のVerilogスタイルとの併用も可能で、その場合、従来のVerilogスタイルの記述が優先され、残ったものについて、ポート名と信号名が一致するものの接続が行われる。

実行結果を以下に示す。

# 6.5e

# vsim -do {run -all; quit} -c test2

# Loading sv_std.std

# Loading work.test2

# Loading work.host

# Loading work.target

# run -all

# command = f, wdata = 55, rdata = 12

さてこの機能、私ははじめて見たときとても便利そうだと思ったのだが、いざ使ってみるとポート名と信号名を一致させることができるケースが意外に少なく、あまり活用できる場面が無いというのが正直な感想だ。ともあれ、本機能が全く使われないわけではないので、知識としては覚えておくべきだとは思う。