05. classの使い方

classは、複数の変数を持った、新たなdata_typeを定義する…と書きましたが、これだとstructでいいわけで、メソッドを加えられる点がclassのメリットです(が、以下の文章はメソッドを入れた話はしていなくてスミマセン)。

例えば、

class packet_class; byte header; bit [31:0] payload_q[$];endclass

と定義したとします。packet_class、というclassを定義したわけですが、この中には2つのデータ

    • byte header
    • bit [31:0] payload_q [$] ///queue

があります。payloadはいわゆる転送データを格納する変数として定義しました。32bitのデータを複数格納できるように、ここではqueue配列を用いました。

さて、冒頭で「新たなdata_typeを定義する」と書きました。これはどういうことかというと、int型やbit型などと同じ扱いで、新たにpacket_classという「data_type」を使えるようになった、ということなんです。データ転送規格などのモデリングでは、このように特定のデータ構造を1つにまとめて使えると便利です。

最初に定義したパケットのclassを使って、実際にパケットを生成してみます。

--- test.sv ---module test; class packet_class; byte header; bit [31:0] payload_q [$];
function new; header = 8'h04; for(int i=0; i<4; i++)begin payload_q.push_back($random); end endfunction
function void disp; $display("=================================="); $display(" header : %02xh", header); $display(" payload[0] : %08xh", payload_q[0]); $display(" payload[1] : %08xh", payload_q[1]); $display(" payload[2] : %08xh", payload_q[2]); $display(" payload[3] : %08xh", payload_q[3]); $display("=================================="); endfunction
endclass
initial begin packet_class packet; packet = new; packet.disp; end
endmodule

classは、ユーザが定義する「data_type」と書きました。ただ、初めから存在するint型などのdata_typeと異なるところがあります。それは、newしなければならないということです。

上記module定義の中のinitial文の中で、packet_class型の変数、packetを定義

    • 変数packetをnew

しています。これをしないと、定義した変数(ここではpacket)が使えないので注意が必要です。また、class定義をみると、2つのfunctionが定義してあります。1つ目のfunction newは、classを使うのにnewが必要と書きましたが、このnewをしたときにclassの中の変数を初期化することができるんです。

この例では、headerは4が入ることになります。また、payloadは32bit☓4=128bitのデータが生成されるようになっており、そのデータはrandom生成するようになっています。2つ目のfunction dispはユーザ拡張関数で、このclass専用の関数を定義しました。

newで生成されたパケットデータを表示させるために使います。ここでは決め打ちですが、もう少し丁寧に記述すれば、汎用的に使えるコードにすることもできます。

--- 実行結果 ---

# ==================================# header : 04h# payload[0] : 12153524h# payload[1] : c0895e81h# payload[2] : 8484d609h# payload[3] : b1f05663h# ==================================

このように、パケットを生成してデータの中身を表示することができました。