0

我有一个结构(例如 mystruct_s),在该结构下,不同层次结构中有几个相同类型的结构(例如 packet_s)。

struct packet_s {
   size:uint;
   active:bool;
};

struct mystruct_s {
   // packet struct paths:
   // p
   // q.p
   // w.p
};

我想生成一个 mystruct_s 实例并强制所有活动数据包的大小总和小于 1K。

var s : mystruct_s;
gen s keeping {
     // it.p.size (if it.p.active) + it.q.p.size (if it.q.p.active) + it.w.p.size (if it.w.p.active) < 1024 ;
};

有没有一种简单的方法来解决这个问题?

4

4 回答 4

2

直接的解决方案是使用三元和加来对大小求和(如果是活动的):

var s : mystruct_s;
gen s keeping {
    (it.p.active ? it.p.size : 0) + (it.q.p.active ? it.q.p.size : 0) + (it.w.p.active ? it.w.p.size : 0) < 1024 ;
};

如果您使用 Specman 14.1(或更高版本),您可以使用生成文字列表和总和来编写以下约束:

var s : mystruct_s;
gen s keeping {
    {it.p; it.q.p; it.w.p}.sum(it.active ? it.size : 0)) < 1024 ;
};

使用生成文字列表还将为您提供更好的尺寸分布。

如果您使用 Specman 14.2(或更高版本),您可以使用条件求和而不是三元求和:

var s : mystruct_s;
gen s keeping {
    {it.p; it.q.p; it.w.p}.sum(it.size, it.active) < 1024 ;
};
于 2015-04-27T15:27:57.983 回答
0

尝试(不确定这是否可行):

扩展 my_struct { 保持 {p.size p.active.as_a(bit),wpsize w.p.active.as_a(bit),...}.sum(it) < 1024; }

于 2015-04-27T13:01:16.330 回答
0

用一个列表替换所有 packet_s 实例。然后使用列表伪方法 .sum 约束

于 2015-04-27T08:00:26.727 回答
-1
Keep %{mystruct.p.size, mystruct.q.p, ...}.count(it) < 1K
于 2015-04-27T08:08:13.773 回答