当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
相关产品推荐
相关产品推荐

