アクセス制御(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