R 4-53 structではなくclassを使用せよ。

randomize()をもう少し実用的な回路で。。と言うことでDMAC回路。
 まずDMACのレジスタ
typedef struct { head_addr, .... } dmac_reg ;
なんて書いてたらベリフィケーション・メソドロジ・マニュアル(CQ出版
のp144にstructは使うなと。。
 理由は 
   *メソッドが使える。
   *制約が使える。
   *継承できる。
だそうでclassに書き換えた。RTL 下記参照

class dmac_reg_c ; // r.4-53
rand logic [31:0] head_addr ;
logic [31:0] control ;
logic [31:0] status ;
rand logic [31:0] host_base ;
rand logic [11:0] host_width ;
...........省略
function new(
logic [31:0] head_addr,
logic [31:0] control,
.......... 省略
logic [11:0] mem_width
) ;
this.head_addr = head_addr ; //new()で初期値設定出来るように
this.control = control ; // した。
........ 省略
endfunction : new

constraint dmac_const_0 {
(host_base <= 32'h00000000) && (host_base >= 32'hffffffff) ;
}
constraint dmac_const_1 {
(mem_base <= 12'h000) && (mem_base >= 12'hfff) ;
}
......... 省略
constraint dmac_const_4 {
host_width == mem_width ;
}

function randomize_ptm() ;
int rand_val ;

rand_val = $random() ;
host_base = rand_val ;
begin : rand_loop
while(1) begin
rand_val = $random() ;
if((host_base + rand_val[11:0]) <= 32'hffffffff) begin
host_width = rand_val[11:0] ;
............. 省略
return 1 ;
endfunction : randomize_ptm

endclass : dmac_reg_c

class main_data_c extends vmm_data;
int test_mode ;
dmac_reg_c dmac_reg = new(32'h80000000,0,0,0,30,100,30) ;
......... 省略
endclass : main_data_c

RTLを書いてみたところconstraintて最高。。。と思った。
注) modelsimPEでもconstraint文はvlog通る。randomize()がvsimでだめ!!

  プログラミングでrandomize_ptm(パッチモン)は書けるが、constraint(制約)の方が数段
  分かりやすい!!!効率もいいだろうしね。
M社がQueを高く売りつける理由が分かった気がするな。

systemverilog VMM ovl 検証 constraint 制約