02. パラメタライズ

クラスを定義するとき、まだ決まっていないデータの型があれば、それをパラメタライズによって解決することが出来ます。パラメタライズは、module宣言時などと基本的には同じですが

class $class_name #(type $type_name = $初期型)

のように書きます。

例:

class test_class #(type T=int); T ia;endclass

typeのパラメタライズは、ユーザ定義クラスも使えます。今回の例では、パケットを定義したクラスにおいて、payloadサイズをパラメタライズしてみます。元の定義はbit [31:0]だったので、typeの初期型を同じようにして、

bit [31:0] payload [$];

T payload [$]

にしました。また、インスタンス時に型をbyteに変更しているので、実行結果は1byte分のデータが変化するだけとなっています。

--- test.sv ---

module test; class packet_class #(type T=bit [31:0]); byte header; T payload [$]; function new(byte header_value); header = header_value; for(int i=0; i<4; i++)begin payload.push_back($random); end endfunction function void disp; $display("=================================="); $display(" header : %02xh", header); $display(" payload[0] : %08xh", payload[0]); $display(" payload[1] : %08xh", payload[1]); $display(" payload[2] : %08xh", payload[2]); $display(" payload[3] : %08xh", payload[3]); endfunction endclass initial begin packet_class #(byte) packet; packet_class #(byte) packet_q[$]; for(int i=0; i<4; i++)begin packet = new(i); packet_q.push_back(packet); end while(packet_q.size()!=0)begin packet = packet_q.pop_front(); packet.disp; end endendmodule

実行結果は、

# ==================================# header : 00h# payload[0] : 00000024h# payload[1] : 00000081h# payload[2] : 00000009h# payload[3] : 00000063h# ==================================# header : 01h# payload[0] : 0000000dh# payload[1] : 0000008dh# payload[2] : 00000065h# payload[3] : 00000012h# ==================================# header : 02h# payload[0] : 00000001h# payload[1] : 0000000dh# payload[2] : 00000076h# payload[3] : 0000003dh# ==================================# header : 03h# payload[0] : 000000edh# payload[1] : 0000008ch# payload[2] : 000000f9h# payload[3] : 000000c6h