基本的な classの書き方

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

コメント

Copied title and URL