classの構成
一般的なclassの記述例を以下に示します。
classの定義はclass~endclassでくくります。
次に変数やメソッド(TASKやFUNCTION)を記述します。
変数の前にprotectedをつけると外部からアクセスできないようにします。
変数の前にrand(またはrandc)をつけると、randomize()を実行するとランダムな値が割り当てられます。
constraintでランダマイズの条件を付加します。
オーバライドできるよう、メソッドには先頭にvirtualをつけます。
class内に宣言したタスクの中身を別途記入します。
class XXX //クラスを定義
//メンバ変数の宣言
bit [10:0] aaa ;
protected bit bbb ; //外部からのアクセス禁止
rand int ccc ; //randを使用するとランダマイズの対象となる。
extern virtual task YYY() ; //taskやfunctionの宣言
constraint CCC {ccc inside {0,2,[4:6]}; } //ランダマイズ実行時の制約
endclass //クラスの終了
task XXX::YYY(); //タスク記述(どのクラスのタスクかを明記)
//適当な記述をここに
endtask
記述例
class test_class ;
bit [10:0] aaa ;
protected bit bbb ;
rand int ccc ;
constraint C01 { ccc <10 ;}
extern virtual task t_display() ;
endclass
task test_class::t_display() ;
bbb=1 ;
$display("aaa=%3d",aaa) ;
$display("bbb=%3d",bbb) ;
$display("ccc=%3d",ccc) ;
endtask
module test() ;
test_class class00 ; //クラスのインスタンス宣言
initial begin
class00=new() ;
class00.randomize() ;
class00.t_display() ;
#10;
$display("2nd") ;
class00.aaa = 11 ;
class00.ccc = 22 ;
class00.t_display() ;
end
endmodule
実行結果
class00にランダマイズを実行するとrandが付加されているcccだけがランダム値となっています。
制約でランダムの範囲は0から10と設定しているので、その範囲の値8が表示されています。
protectedが付加されていない変数は外部から書き換えできます。aaaを11にcccを22に変更しています。
protectedが付加されている変数を書き換えようとclass00.bbb=0 など実行するとアクセスできませんとシミュレータがエラーを返します。(エラーになるので記述していません)
aaa= 0
bbb= 1
ccc= 8
2nd
aaa= 11
bbb= 1
ccc= 22

コメント