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

当gen_and_start_main约束为FALSE时,如何手动启动Specman e的MAIN sequence?

问题:禁用MAIN序列自动启动后,手动启动报NULL对象错误怎么解决?

我来给你捋捋这个问题哈~

你先是通过下面的代码禁用了my_driver里主序列的自动启动:

extend my_driver { keep soft gen_and_start_main == FALSE; };

但之后尝试在TCM里直接调用main_sequence.body()时,碰到了cannot call method - object is NULL的错误:

some_tcm()@clock is { 
    // some logic 
    start sys.my_agent.my_driver.main_sequence.body(); 
};

问题根源

当你把gen_and_start_main设为FALSE时,验证框架不会自动帮你实例化main_sequence这个对象——也就是说sys.my_agent.my_driver.main_sequence现在是个空指针,你直接调用它的方法自然会报错。

正确的手动启动方式

你需要先手动创建序列实例,再通过规范的方式启动它,分两种常用做法:

方法1:在TCM里直接实例化并启动

直接在TCM里创建序列对象,然后调用start()方法绑定到对应的sequencer上(这才是启动序列的标准姿势,别直接调用body()):

some_tcm()@clock is { 
    // some logic 
    // 先实例化主序列对象
    var main_seq : my_driver.main_sequence = new;
    // 把序列挂到driver对应的sequencer上启动
    main_seq.start(sys.my_agent.my_sequencer);
};

方法2:在driver里封装启动方法

如果需要多次手动启动,或者想把逻辑封装在driver内部,可以给driver加一个自定义方法:

extend my_driver {
    // 封装手动启动主序列的方法
    manual_start_main() is {
        var seq : main_sequence = new;
        // 直接用driver内部的sequencer引用
        seq.start(sequencer);
    };
};

然后在TCM里调用这个方法就行:

some_tcm()@clock is { 
    // some logic 
    sys.my_agent.my_driver.manual_start_main();
};

补充提醒

别直接调用body()方法哦!序列的start()方法会帮你处理和sequencer的连接、序列生命周期管理这些底层工作,直接跑body()不仅容易出问题,也不符合验证框架的设计规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:54:33