微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > 求助:UVM的virtual sequence的问题

求助:UVM的virtual sequence的问题

时间:10-02 整理:3721RD 点击:
各位:
我在继续被UVM折腾。今天的新问题是virtual sequence相关的。我有两个sequence,一个是APB总线写的sequence,另外一个是往video口发送一帧图像sequence。这样的话,我需要使用virtual sequence来给这两个sequence同步,计划先发送APB的sequence,然后再发送图像数据,模拟先配置再开始工作的过程。但是仿真跑起来后,遇到一个问题,就是仿真开始时候进入apb_seq执行,前面的打开文件,统计要发多少个数据都没问题,到了`uvm_do_with()宏的时候就卡住了,根本发不了数据。不知道究竟是哪里不对了。好像我这么描述问题有点乱,还是贴代码吧:
virtual sequencer:
class vsequencer extends uvm_sequencer;
apb_sequencer apb_sqr;
vdo_sequencer vod_sqr;
`uvm_component_utils(vsequencer)
function new(string name,uvm_component parent);
super.new(name,parent);
endfunction
endclass : vsequencer
test_seq_lib:
`include "apb_seq_lib.sv"
`include "vdo_seq_lib.sv"
`include "vsequencer.sv"
class apb_vdo_seq extends uvm_sequence;
`uvm_object_utils(apb_vdo_seq)
`uvm_declare_p_sequencer(vsequencer)
task body();
apb_write_seqapb_seq;
read_two_1080p_bmp_seqvdo_seq;
`uvm_do_on(apb_seq,p_sequencer.apb_sqr)
`uvm_do_on(vdo_seq,p_sequencer.vdo_sqr)
endtask
endclass : apb_vdo_seq
test_lib:
`include "tb.sv"
class apb_vdo_test extends uvm_test;
`uvm_component_utils(apb_vdo_test)
tbtb0;
vsequencer vsqr;
extern function new(string name="apb_vdo_test",uvm_component parent);
function build_phase(uvm_phase phase);
super.build_phase(phase);
tb0 =tb::type_id::create("tb0",this);
vsqr=vsequencer::type_id::create("vsqr",this);
uvm_config_db#(uvm_object_wrapper)::set(this,"tb0.vsqr.run_phase","default_phase",apb_vdo_seq::type_id::get());
endfunction : build_phase
function connect_phase(uvm_phase phase);
vsqr.apb_sqr=tb0.apb0.master.sequencer;
vsqr.vdo_sqr=tb0.vdo0.master.sequencer;
endfunction : connect_phase
endclass : apb_vdo_test
然后apb_write_seq的body部分:
int num=0;
task apb_write_seq::body();
`uvm_info(get_type_name(),"Starting...",UVM_MEDIUM)
fp=$fopen("cfg1.f","r");
repeat(1024) begin
fpoint=$fscanf(fp,"%h",cfg_data);
$display("data in file is %h",cfg_data); ---------->仿真时,此行的信息能看见
`uvm_do_with(req,{req.addr==num;
req.direction==WRITE;
req.data=cfg_data;})------->从dump出的波形上看,apb总线上无任何翻转信号
$display("write one data over");---------------->仿真时,此行信息显示不出
end
endtask : body
谁来救救我呀

补充一下,刚才试了把apb_seq与vdo_seq反过来,也是同样的问题。能够打开图像文件,能够从文件中读取数据,等到执行`uvm_do_with()宏的时候又被卡住了。有谁还遇到过类似的情况么?让我感觉上面贴的那些代码都不是问题所在,virtual sequence能根据代码启动相应的sequence。但是问题在哪里我又说不上,要说是具体的sequence的问题吧,也不像啊。
在test_seq_lib中注释掉一个`uvm_do_on(),也还是是同样的问题。

不是吧?

不是吧

uvm怎么看波形啊

uvm_config_db#(uvm_object_wrapper)::set(this,"tb0.vsqr.run_phase","default_phase",apb_vdo_seq::type_id::get());
------>
uvm_config_db#(uvm_object_wrapper)::set(this,"tb0.vsqr.run_phase","default_sequence",apb_vdo_seq::type_id::get());

代码太乱了,看起来头疼。不过不要用default sequence,显式调用seq.start(env.sequencer)。我以前也碰到过类似问题,default那种方式太麻烦了,也没必要

hi,actually uvm virtual sequences are used when there is multiple no of sequences...

Maybe you should check your driver!
ovm_do_with is just asystem function macro!

你把cfg_data换成具体的数据试下有没有翻转,在sequence中对数据进行限制行不通吧



请问小编,UVM怎么显示的波形?

(1)比较典型的UVM结构,因此代码结构肯定没有问题,vseq的使用也不是问题,也肯定不是defaut seq的问题
(2)肯定是你这个seq对应的driver停在某个仿真时刻,导致仿真的事件队列无法往下进行了。比如driver死锁在某个while(1)或forever中或wait在某个地方无法往下走。

同意楼上的!

我也遇到同样的问题了,小编能具体说下哪儿出错了么

sequencer与sequence没绑好,还是driver与sequencer没绑号,还是virtual sequencer与实际sequencer没绑好的问题。反正不是贴出来的代码的问题。常常问题是在我们觉得有问题的代码之外的问题。

同求~

小编,我现在遇到跟你一样的问题,你当时怎么解决的

真不知道我什么时候才能看明白UVM

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

网站地图

Top