アクセス制御(Class Access)
SVクラスにおいては、クラスアクセス制御指定(local/protected)なければC++で言うpublic
になります。つまり、クラス内外を問わず、誰でも参照できることになります。
クラスパラメータとクラスローカルパラメータも publicです。
アクセス制御 | 機能 | C++相当 | 備考 |
local | 継承したクラス(サブクラス)からは見えない、別クラスからも見えない | private | 同じクラスの別インスタンスから参照可能 |
protected | 継承したクラス(サブクラス)からは見える。別クラスからは見えない | protected | 同じクラスまたは、サブクラスの別インスタンスから参照可能 |
ただし、アクセス制御た附加されても、同じクラスの別インスタンスからは、参照可能です。この点は、C++/JAVAと同じになります。
次の記述は、リーガルです。
class Packet; local integer i; function integer compare (Packet other); compare = (this.i === other.i);//other.i は、ローカルメンバーだが、同じクラスなのでエラーにはならない endfunction function void set_i(integer i); this.i=i; endfunction task t1; set_i(10); endtask endclass program local_test; Packet p1,p2; function int func(); endfunction initial begin p1=new; p2=new; if (!p1.compare(p1)) $display("Fail"); if (!p1.compare(p2)) $display("Fail"); p1.set_i(10); if (p1.compare(p2)) $display("Fail"); p2.t1(); if (!p1.compare(p2)) $display("Fail"); end endprogram :local_test
例によって、JAVAプログラムをSVに移植すると、次のようになります。
class Human ; // メンバ変数 local string name; local int age; // コンストラクタ function new(string n, int a); name = n; setAge(a); // 年齢の設定はメソッドに任せる endfunction // メソッド function void introduce(); string str; str =$sformatf("私の名前は%sで年齢は %2d才です。",name,age); $display("%s ",str); endfunction // 入口 function void setAge(int a); if (a < 0) age = 0; else age = a; endfunction // 出口 function int getAge(); return age; endfunction endclass program Java08_02; Human human1; initial begin human1 = new ("太郎",-5); human1.introduce(); //human2.age = 10; localがついているので直接代入できない //変わりに年齢を代入する専用のメソッドを使う human1.setAge(10); human1.introduce(); end endprogram
実行結果は次のようになります。
***** Veritak SV6464 Engine Version 442 Build Apr 15 2013***** 私の名前は太郎で年齢は 0才です。 私の名前は太郎で年齢は 10才です。 ---------- シミュレーションを終了します。time=0ns
オーバーロード
は、SVではサポートしていません。
パラメタライズドクラスを使って、例えば次のように定義できますが、インスタンスが別になるのでオーバロードにはならないですね。
class parameterized_class #(type T = int); function disp(T data1); $display(data1); endfunction endclass program quasi_overloading_test; real data1 = 4.5; string string1 = "こんにちは!"; parameterized_class#(real) h1; parameterized_class#(string) h2; initial begin h1 = new(); h2 = new(); h1.disp(data1); h2.disp(string1); end endprogram
実行結果です。
***** Veritak SV6464 Engine Version 442 Build Apr 15 2013***** 4.500000 Hello ---------- シミュレーションを終了します。time=0ns