首页 > 解决方案 > Specman/e 约束(对于每个 in)迭代

问题描述

我可以在约束中仅遍历 e 中列表的一部分吗?例如,此代码将遍历整个 layer_l 列表:

<'

struct layer_s {
  a : int;
    keep soft a == 3;
};

struct layer_gen_s {
  n_layers : int;
    keep soft n_layers == 8;
  layer_l  : list of layer_s;
    keep layer_l.size() == read_only(n_layers);
};

extend sys {
  layer_gen : layer_gen_s;     

  run() is also {
    messagef(LOW, "n_layers = %0d", layer_gen.n_layers);
    for each in layer_gen.layer_l{
      messagef(LOW, "layer[%2d]: a = %0d", index, it.a);
    };
  };
};

-- this will go through all layer_l
extend layer_gen_s {    
  keep for each (layer) using index (i) in layer_l {
    layer.a == 7;
  };
};

但是,我只想通过例如 2 个项目来迭代 for each。我尝试了下面的代码,但它不起作用:

-- this produces an error
extend layer_gen_s {    
  keep for each (layer) using index (i) in [layer_l.all(index < 2)] {
    layer.a == 7;
  };
};

我也不想使用暗示,所以这不是我想要的:

-- not what I want, I want to specify directly in iterated list
extend layer_gen_s {    
  keep for each (layer) using index (i) in layer_l {
    (i < 2) => {
      layer.a == 7;
    };
  };
};

标签: aopverificationspecmane

解决方案


使用列表切片运算符也不起作用,因为pathinfor..each约束仅限于简单的path(例如列表变量)。以下也不起作用:

keep for each (layer) using index (i) in layer_l[0..2] {
  //...
};

这是 Specman 的限制。

要强制循环遍历子列表,您唯一的选择是将该子列表创建为单独的变量:

layer_subl: list of layer_s;
keep layer_subl.size() == 3;
keep for each (layer) using index (i) in layer_subl {
  layer == layer_l[i];
};

现在您可以只循环for..each约束中的前 3 个元素:

keep for each (layer) in layer_subl {
  layer.a == 7;
};

这避免了在约束内使用暗示。这是否值得由您决定。另请注意,列表将包含相同的对象(这很好)。不会创建额外的struct对象。

像这样创建子列表是可以由工具本身处理的样板代码。这将使代码更加简洁和可读。您可以联系您的供应商并请求此功能。


推荐阅读