2015-06-04 80 views
0
class conf; 
    typedef struct packed 
    { 
    int ns_size; 
    int limit; 
    } ns; 

    int num_ns_supported; 
    ns num_ns[]; 

    function new(input int s=5);  
    num_ns_supported = s; 
    num_ns = new[s]; 
    foreach(num_ns[i]) 
    begin 
     num_ns[i].ns_size = (1000 * (i+1));   
    end 
    endfunction 
endclass 

class pac; 
    int nsid=1; 
    int slba; 
endclass 

class c; 
    pac p; 
    conf cfg; 

    covergroup x; 
    option.per_instance = 1; 
    a : coverpoint p.slba 
    { 
     bins range[3] = {[32'h0000_0000 : cfg.num_ns[p.nsid-1].ns_size]}; 
    } 
    endgroup 

    function new(input conf ca);  
    p = new(); 
    cfg = ca; 
    x = new(); 
    endfunction 

    function void sample(input pac p1); 
    p = p1; 
    x.sample(); 
    endfunction 
endclass 

program p1; 
    conf cfg = new(6); 
    pac p = new(); 
    c co = new(cfg); 

    initial 
    begin 
    p.nsid = 1; 
    p.slba = 550; 
    co.sample(p); 
    p.nsid = 2; 
    co.sample(p); 
    end 
endprogram 

在此代碼中,我需要覆蓋與尊重的num_ns結構關聯的範圍的slba。覆蓋範圍內的動態覆蓋點SystemVilog

但是,在這種代碼中,範圍將根據num_ns被劃分[0]只。

所以,我怎麼能重複使用相同的coverpoint生成動態範圍取決於對採樣時間變量的值?

回答

2

你所要求的不能做什麼,也沒有任何意義。看到這個問題的https://verificationacademy.com/forums/coverage/how-get-values-different-bins-coverpoint

+1

確定,所以,如果動態coverpoints是不可能的,那麼有沒有其他的辦法來解決thorugh正常/固定coverpoints的問題,因爲我有這樣的場景在我的報道? –

+0

您將不得不解釋您是如何計算覆蓋範圍的,即如果您更改每個樣本的垃圾箱結構,您希望如何達到100%的覆蓋率? 覆蓋範圍應該工作的方式是在模擬開始時設置一組容器,並且每個樣本點擊一個容器。如果在模擬結束時所有箱都被擊中,那麼您將獲得該覆蓋點的100%覆蓋率。試着用一個較小的例子來解釋你想要做什麼,顯示每個樣本會碰到哪個箱,並顯示足夠的樣本來解釋如何獲得100%的覆蓋率。 –

+0

這裏我會試着向你解釋你的要求。 (1)我想覆蓋所有num_ns結構的ns_size字段的3個範圍。 (2)現在,在這種情況下,num_ns結構數量是動態的,並作爲新方法中的參數傳遞。所以我不能使用不同的覆蓋點來達到同樣的目的,因爲我不知道會需要多少個覆蓋點......由於systemverilog中沒有動態覆蓋點,那麼爲什麼我可以符合要求? –

2

答案被@ dave_59給出。但我只會用他的邏輯發佈更新後的代碼。

動態封面是不可能的。所以這裏是另一個解決方案,用於相同的目的,具有固定的覆蓋點。

class conf; 
    typedef struct packed 
    { 
    int ns_size; 
    int limit; 
    } ns; 

    int num_ns_supported; 
    ns num_ns[]; 

    function new(input int s=5);  
    num_ns_supported = s; 
    num_ns = new[s]; 
    foreach(num_ns[i]) 
    begin 
     num_ns[i].ns_size = (1000 * (i+1));   
    end 
    endfunction 
endclass 

class pac; 
    int nsid=1; 
    int slba; 
endclass 

covergroup x (int nsid, input conf cfg) with function sample(int slba); 
option.per_instance = 1; 
    a : coverpoint slba 
    { 
    bins range[3] = {[32'h0000_0000 : cfg.num_ns[nsid].ns_size]}; 
    } 
endgroup 

class c; 
    pac p; 
    conf cfg; 
    x cg[]; 

    function new(input conf ca);  
    p = new(); 
    cfg = ca; 
    cg = new[cfg.num_ns_supported]; 
    foreach(cfg.num_ns[i]) 
     cg[i] = new(i, cfg); 
    endfunction 

    function void sample(input pac p1); 
    p = p1; 
    cg[p.nsid-1].sample(p.slba); 
    endfunction 
endclass 

program p1; 
    conf cfg = new(6); 
    pac p = new(); 
    c co = new(cfg); 

    initial 
    begin 
    p.nsid = 1; 
    p.slba = 550; 
    co.sample(p); 
    p.nsid = 2; 
    co.sample(p); 
    end 
endprogram