微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > uvm中virtual sequence 的结束

uvm中virtual sequence 的结束

时间:10-02 整理:3721RD 点击:
hi 大家好, 最近在学习UVM时发现如下问题:

3 class base_vseq extends uvm_sequence;
4
5function new(string name="base_vseq");
6super.new(name);
7endfunction
8
9`uvm_object_utils(base_vseq)
10`uvm_declare_p_sequencer(uart_ctrl_virtual_sequencer)
11
12virtual task pre_body();
13if(starting_phase !=null)
14starting_phase.raise_objection(this,"running sequence");
15endtask
16
17virtual task post_body();
18if(starting_phase !=null)
19starting_phase.drop_objection(this,"exitting the sequence");
20endtask
21
22 endclass
23
24 class my_vseq extends base_vseq;
25write_word_seq my_write_word_seq;
26function new(string name="my_vseq");
27super.new(name);
28endfunction
29
30`uvm_object_utils(my_vseq)
31
32virtual task body();
33
34`uvm_info("my_vseq","start virtual sequence",UVM_LOW)
35`uvm_do_on(my_write_word_seq,p_sequencer.apb_seqr)
36`uvm_info("my_vseq","finishedc the virtual sequence",UVM_LOW)
37endtask
38
39 endclass
当我把第35行注释了时,前后两个uvm_info中的信息都可以看到,但是加上后,就一直在产生同一个sequence, 程序也没法退出,请问哪位有没有遇到这种情况,我希望它产生一个sequence后就退出。应该怎样修改啊?
请大家赐教,不甚感激。

UVM 我不清楚,但是OVM中应该是这样的流程(UVM和OVM的流程应该是一样的,我想):
你的程序应该还有一个叫做比如my_vseqr的virtual sequencer,其中肯定包含了一个叫apb_seqr的,这个从你粘贴出来的代码应该可以推断出来。
那么你要做的事情是:
(1)把apb_seqr禁止掉,就是说不让它的run()起作用,否则它会启动default sequence(UVM random
sequence);可以用set_config_int("*.apb_seqr","count",0)来完成,这句配置语句一般在env
层,至少是在包含my_vseqr的那一层;
(2)让my_seqr启动你原本想的那个sequence,也就是你的my_vseq,你应该这么做
用set_config_string("*","default_sequence","my_vseq")来完成。
应该就可以了,如果还不行,那请你检查一下各个sequence和sequencer的各个宏有没有完整,如果宏没有问题再看看你的sequencer的build()函数里有没有调super.build();如果能保证这两个就应该不会有什么问题了,我刚开始的时候很容易把super.build()忘记,导致看到的配置老是没有起作用。
如果还有问题咱么再讨论,祝好运!

前提是uvm这部分机制和OVM是一样的,我只用过VMM和OVM,不懂UVM,既然UVM号称是从OVM继承来的,应该是这样的,你查查UVM user guid确定一下。

要看你在testcase里是如何执行run的操作了,是如楼上说的用宏定义了默认序列?还是使用sequencer的启动操作来启动序列。用后者的话,就可以避免一直不停的循环执行序列了。当然,在你的序列里面要是加上一个停止操作,我想应该也可以,只从你现在的代码无法得到足够的信息。

不好意思, 前几天忙别的事去了,多谢你的回复。
我看的例子中 怎么virutal sequencer 中 都不重载 build_phase 函数,我自己加上时也会报错。

你误解我的意思了,或者我没有说清楚,我的意思是:
“这句配置语句一般在env层,至少是在包含my_vseqr的那一层;”
上述我说的这些配置需要在build里面完成,但是不是在virtual sequencer的build里面,而是在agent或者env层次,总之是在包含virtual sequencer的那层或者比包含virtual sequencer的那层更高的层次,一般也就agent层次和env这两个层。
不知道我说清楚没?

多谢大家,问题已经找到了,是因为我用的APB是不带pready的版本,而APB的vip中是带pready的版本,结果在apb_driver中一直在等待pready,所以apb_collector会一直检测到在读(写)同一个seq。

原来已经找到原因了。

学习了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top