微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > 烦请各位帮看下我的test里面设置的transfer次数为什么sequence没有收到

烦请各位帮看下我的test里面设置的transfer次数为什么sequence没有收到

时间:10-02 整理:3721RD 点击:
本人最近在研究UVM,尝试搭一个AHB RAM的验证环境,但是在设置transfer循环次数的时候sequence里面没法接收参数,我完全是参照uvm1.1中那个ubus的例子在做,烦请各位帮忙看下有什么问题
class ahb_test extends uvm_test;
`uvm_component_utils(ahb_test)
ahb_env t_env ;
function new (string name="ahb_test", uvm_component parent=null);
super.new (name, parent);
t_env = new("t_env",this);
endfunction : new

virtual function void build_phase(uvm_phase phase);
uvm_config_db#(int)::set(this, "t_env.ahb_mseqr.ahb_master_sequence","num_trans",2);
uvm_config_db#(uvm_object_wrapper)::set(this,"t_env.ahb_mseqr.main_phase",
"default_sequence", ahb_master_sequence::type_id::get());
......
endfunction
endclass
class ahb_master_sequence extends uvm_sequence #(ahb_master_transaction);
int num_trans = 1;
function new(string name="ahb_master_sequence");
super.new(name);
endfunction
`uvm_object_utils(ahb_master_sequence)
ahb_master_transaction ahb_m_tr;
virtual task body();
if(!(uvm_config_db#(int)::get(null,get_full_name(),"num_trans", num_trans)));
`uvm_info("No transaction fed:",{get_full_name(), " use default num_trans"}, UVM_LOW);
uvm_report_info(get_full_name(),"Start transfering...",UVM_LOW);
for(int i=0; i<num_trans; i++)
`uvm_do(ahb_m_tr);
endtask
endclass
运行的时候得到这个
UVM_INFO ../tb/ahb_master_sequence.sv(15) @ 0: uvm_test_top.t_env.ahb_mseqr@@ahb_master_sequence [No transaction fed:] uvm_test_top.t_env.ahb_mseqr.ahb_master_sequence use default num_trans
UVM_INFO @ 0: uvm_test_top.t_env.ahb_mseqr@@ahb_master_sequence [uvm_test_top.t_env.ahb_mseqr.ahb_master_sequence] Start transfering...
请问怎么回事呢?非常感谢

目前我判断应该是sequence和sequencer没有关联上,因为driver没有收到transaction,但是下面这句
uvm_config_db#(uvm_object_wrapper)::set(this,"t_env.ahb_mseqr.main_phase",
"default_sequence", ahb_master_sequence::type_id::get());
应该就是关联sequencer和sequence吧?说实话这个是从uvm自带的那个ubus的例子抄来的,我也没看明白,例子里面sequencer是直接用的uvm_sequence定义的instance,也就是说sequencer的成员里面显然不包含sequence,仿真结果打印的topology也印证了这一点,那么例子里是怎么关联上的呢?而且从这个build_phase看,先设置了seqr.seq.num_trans的值,然后才关联seqr和seq?

t_env是不是应该在build_phase里用create出来啊?

谢谢这位朋友,我按你说的做了,把new里面去掉,改在build_phase里面用create创建,但是还是不行,log可以看到UVM_INFO ../tb/ahb_master_sequence.sv(15) @ 0: uvm_test_top.t_env.ahb_mseqr@@ahb_master_sequence [No transaction fed:] uvm_te st_top.t_env.ahb_mseqr.ahb_master_sequence use default num_trans
UVM_INFO @ 0: uvm_test_top.t_env.ahb_mseqr@@ahb_master_sequence [uvm_test_top.t_env.ahb_mseqr.ahb_master_sequence] Start tran sfering...
这个是不是说ahb_mseqr已经有ahb_master_sequence这个成员了啊,但是ahb_master_sequence是类,不是实例,怎么回事呢?ubus的demo仿真log也是一样的结果,但是就可以正常产生数据并发送到driver,有人仔细研究过这个demo吗?

我改在env类里面定义一个sequence成员ahb_mseq,然后在env的run_phase中用这个ahb_mseq.start(ahb_mseqr, null)
,driver就可以从sequencer收到数据了,但参数num_trans还是无法传递。

这个set 就指定sqr里面default sequence 为ahb_master_sequence不代表这个sqr里面有ahb_master_sequence ,只是让sqr执行default sequence时候 执行的ahb_master_sequence.而你set num_trans 到sqr里面的ahb_master_sequence,实际上sqr里面没有ahb_master_sequence这个member ,所以get不到

1. 在sequencer里面定义一个num_trans
2. 在env::build_phase里面改为uvm_config_db#(int)::set(this, "t_env.ahb_mseqr","num_trans",2);
3. 在sequence里面将
if(!(uvm_config_db#(int)::get(null,get_full_name(),"num_trans", num_trans)));
`uvm_info("No transaction fed:",{get_full_name(), " use default num_trans"}, UVM_LOW);
变成num_trans=m_sequencer.num_trans;
--good luck

感谢各位朋友热情帮忙,昨晚在试的时候把那个main_phase改成run_phase就可以了,循环的次数随着我设置的值在增加,但是sequence里面仍然打印出了"no transaction fed..."的信息。暂时还不知道为什么。另外demo里面用main_phase却又可以

犯了个低级错误,打印出了"no transaction fed..."的信息是因为if语句后面多了个分号:(

哈哈,我说呢,如果你打开transaction的打印,估计就知道有没有set/get成功了吧

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

网站地图

Top