アクセス制御(Class Access)

SVクラスにおいては、クラスアクセス制御指定(local/protected)なければC++で言うpublic になります。つまり、クラス内外を問わず、誰でも参照できることになります。

クラスパラメータとクラスローカルパラメータも publicです。
アクセス制御 機能 C++相当 備考
local 継承したクラス(サブクラス)からは見えない、別クラスからも見えない private 同じクラスの別インスタンスから参照可能
protected 継承したクラス(サブクラス)からは見える。別クラスからは見えない protected 同じクラスまたは、サブクラスの別インスタンスから参照可能

ただし、アクセス制御た附加されても、同じクラスの別インスタンスからは、参照可能です。この点は、C++/JAVAと同じになります。
次の記述は、リーガルです。

01class Packet;
02        local integer i;
03        function integer compare (Packet other);
04                compare = (this.i === other.i);//other.i は、ローカルメンバーだが、同じクラスなのでエラーにはならない
05         
06        endfunction
07        function void set_i(integer i);
08                this.i=i;
09        endfunction
10        task t1;
11                set_i(10);
12        endtask
13         
14         
15endclass
16 
17 
18program local_test;
19        Packet p1,p2;
20        function int func();
21         
22        endfunction
23        initial begin
24                p1=new;
25                p2=new;
26                if (!p1.compare(p1)) $display("Fail");
27                if (!p1.compare(p2)) $display("Fail");
28                p1.set_i(10);
29                if (p1.compare(p2)) $display("Fail");
30                p2.t1();
31                if (!p1.compare(p2)) $display("Fail");
32        end
33 
34endprogram :local_test

例によって、JAVAプログラムをSVに移植すると、次のようになります。


01class Human ;
02        // メンバ変数
03        local string name;
04        local int age;
05 
06        // コンストラクタ
07        function new(string n, int a);
08                name = n;
09                setAge(a); // 年齢の設定はメソッドに任せる
10        endfunction
11 
12        // メソッド
13        function void introduce();
14                string str;
15                str =$sformatf("私の名前は%sで年齢は %2d才です。",name,age);
16                $display("%s ",str);
17        endfunction
18 
19        // 入口
20        function void setAge(int a);
21                if (a < 0)
22                        age = 0;
23                else
24                        age = a;
25                 
26        endfunction
27 
28        // 出口
29        function int getAge();
30                return age;
31        endfunction
32endclass
33 
34program Java08_02;
35 
36        Human human1;
37        initial begin
38                human1 = new ("太郎",-5);
39                human1.introduce();
40 
41                //human2.age = 10; localがついているので直接代入できない
42                //変わりに年齢を代入する専用のメソッドを使う
43                human1.setAge(10);
44                human1.introduce();
45        end
46endprogram

実行結果は次のようになります。

1***** Veritak SV6464 Engine Version 442 Build Apr 15 2013*****
2 
3私の名前は太郎で年齢は  0才です。
4私の名前は太郎で年齢は 10才です。
5 
6---------- シミュレーションを終了します。time=0ns



オーバーロード

は、SVではサポートしていません。

パラメタライズドクラスを使って、例えば次のように定義できますが、インスタンスが別になるのでオーバロードにはならないですね。


01class parameterized_class #(type T = int);
02 function disp(T data1);
03    $display(data1);
04 endfunction
05 endclass
06  
07program quasi_overloading_test;
08    real data1 = 4.5;
09    string string1 = "こんにちは!";
10    parameterized_class#(real) h1;
11    parameterized_class#(string) h2;
12 initial begin
13    h1 = new();
14    h2 = new();
15    h1.disp(data1);
16    h2.disp(string1);
17 end
18 endprogram


実行結果です。

1***** Veritak SV6464 Engine Version 442 Build Apr 15 2013*****
2 
34.500000
4Hello
5 
6---------- シミュレーションを終了します。time=0ns