アクセス制御(Class Access)
SVクラスにおいては、クラスアクセス制御指定(local/protected)なければC++で言うpublic
になります。つまり、クラス内外を問わず、誰でも参照できることになります。
クラスパラメータとクラスローカルパラメータも publicです。
アクセス制御 | 機能 | C++相当 | 備考 |
local | 継承したクラス(サブクラス)からは見えない、別クラスからも見えない | private | 同じクラスの別インスタンスから参照可能 |
protected | 継承したクラス(サブクラス)からは見える。別クラスからは見えない | protected | 同じクラスまたは、サブクラスの別インスタンスから参照可能 |
ただし、アクセス制御た附加されても、同じクラスの別インスタンスからは、参照可能です。この点は、C++/JAVAと同じになります。
次の記述は、リーガルです。
01 | class 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 | |
15 | endclass |
16 |
17 |
18 | program 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 |
34 | endprogram :local_test |
例によって、JAVAプログラムをSVに移植すると、次のようになります。
01 | class 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 |
32 | endclass |
33 |
34 | program 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 |
46 | endprogram |
実行結果は次のようになります。
1 | ***** Veritak SV6464 Engine Version 442 Build Apr 15 2013***** |
2 |
3 | 私の名前は太郎で年齢は 0才です。 |
4 | 私の名前は太郎で年齢は 10才です。 |
5 |
6 | ---------- シミュレーションを終了します。time=0ns |
オーバーロード
は、SVではサポートしていません。
パラメタライズドクラスを使って、例えば次のように定義できますが、インスタンスが別になるのでオーバロードにはならないですね。
01 | class parameterized_class #( type T = int ); |
02 | function disp(T data1); |
03 | $display (data1); |
04 | endfunction |
05 | endclass |
06 | |
07 | program 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 |
3 | 4.500000 |
4 | Hello |
5 |
6 | ---------- シミュレーションを終了します。time=0ns |