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 制約