You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Specman e中用Keep复制列表:是否有更简洁的单行实现方式?

Specman e:复制已生成列表的简洁实现

你当前用两行keep语句实现了复制已生成列表的逻辑,其实有更简洁的实现方式,完全可以用单行keep语句搞定:

原实现代码

<'
struct A {
    ListA : list of uint;
    keep ListA.size() == 5;
    keep ListA.sum(it) <= 20;
};

struct B {
    ListB : list of uint;
};

extend sys {
    A1 : A;
    B1 : B;

    // Keeps
    keep B1.ListB.size() == read_only(A1.ListA.size());
    keep for each in B1.ListB {
        it == read_only(A1.ListA[index]);
    };
};
'>

简洁实现

直接让B1.ListB等于read_only(A1.ListA)即可,这一行约束会同时保证列表长度一致、每个位置的元素完全相同:

<'
struct A {
    ListA : list of uint;
    keep ListA.size() == 5;
    keep ListA.sum(it) <= 20;
};

struct B {
    ListB : list of uint;
};

extend sys {
    A1 : A;
    B1 : B;

    // 单行完成复制逻辑
    keep B1.ListB == read_only(A1.ListA);
};
'>

这种写法和你原来的两行约束逻辑完全等价,Specman e的列表相等约束会自动检查两个列表的长度是否一致,并且逐个位置比较元素值,省去了手动遍历和长度检查的冗余代码。

内容的提问来源于stack exchange,提问作者Ank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:35:27