2013-04-01 32 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 
'> 

希望这有助于!