2013-04-01 28 views
1

信號x是位'n'的一個熱信號 我想只覆蓋信號的一個熱值並且對其他值不感興趣。例如:如果一個信號x是3位,那麼我希望x達到低於數值的值不是。如何在specman中動態約束coverage項目的範圍?

x == 3'b001 
x == 3'b010 
x == 3'b100 

我想下面來實現目標。

struct ABC { 
x :uint(bits:n); 
event pqrs; 
cover pqrs is { 
    item x using ranges={ 
         range([1]); 
         range([2]); 
         range([4]); 
         }; 
}; 

但是上面的代碼並不優雅,因爲'n'定義了可以根據環境變化的值。 請幫我寫一下以上案例的報道。

感謝您的幫助。 Regards, Srikanth

回答

0

你可以自己寫一個define-as-computed宏來創建covergroup。 請注意,宏必須展開爲完整的語法元素,您不能只創建一個創建範圍表達式的宏。 (我有這樣一個宏,但不能透露它)。

Thorsten。

1

你可以寫一個簡單的'定義爲計算'宏來這樣做。 我在下面寫了一個簡短的例子。

宏應該是這樣的:

define <RANGE1'struct_member> "COVER_ITEM_WITH_DEFAULT_RANGES <struct_member>" as computed { 

var x:uint(bits:NBITS) = 1; 
var str := append("cover covT_e is also {", 
    "item ", <1>," using ranges = {"); 
while(x!=0){ 
    str =append(str,"range([",x,"]);"); 
    x=x<<1; 
}; 
    str=append(str,  "};", 
        "}" 
       ); 
return str; 
}; 

和您可以使用在你的代碼如下所示:

<' 
define NBITS 4; 
import cover0; 

extend sys { 

field1 : uint(bits:NBITS); 
event covT_e; 

cover covT_e is empty;   

COVER_ITEM_WITH_DEFAULT_RANGES field1; 

run() is also { 
    for i from 1 to 20 { 
     gen field1; 
      emit covT_e; 
     print field1; 
    }; // for i from 1 to... 
}; // run() is also 


finalize() is also{ 
    specman("show cover"); 
}; 
}; // extend sys 
'> 

希望這有助於!