uvm reg_model 求助
task body();
cpu_sequence cpu_seq;
send_sequence send seq;
`uvm_do_on(send_seq,p_sequencer.send_seq);
`uvm_do_on(cpu_seq,p_sequencer.cpu_seq);
endtask
第一个sequence(send_seq)已经跑完,
跑到第二个sequence(cpu_seq)的task body时报错,
task cpu_sequence::body();
uvm_status_e status;
reg_model.TXRX.write(status,32'h00_00_00_01);//在这一行报错
endtask
错误如下:
The object at deference depth 1 is being used defore it was constructed/allocted.
请问有可能是什么原因?是reg_model没有实例化一个对象还是怎么的?
reg_model是在env里实例化的吗?
你没有进行连接,当然找不到reg_model了。使用uvm_config_db#(reg_model)方式,注意层次路径,否则找不到
放在哪个模块链接呢?
reg_model已经在env模块实例化了,你说的连接,是什么的连接?
就是在你的cpu_seq这个类中使用了reg_model,但没有在这个类中实例化或其他地方实例化但没有进行句柄copy,就不能使用。
不是说对象实例化就能可以任意使用了,可以任意使用的就是全局的了,要考虑类的特性
简单的说就是要在seq执行write的地方,拿到reg_model的句柄。
可以:
1.通过参数传递的方法取得
2.通过config机制,配置
3.通过hierarchy直接调用,找到你例化的reg_model
等等。
在env里把reg_model和vsequence实例化,
然后,
uvm_config_db#(reg_model)::set(this,"vseq.cpu_sequence","regmodel",regmodel);
在cpu_sequence里,
task body();
uvm_config_db#(reg_model)::get(this,"","regmodel",regmodel)//这一行报错
endtask
Incompatible complex type usage in task or function call.
The flowing epression is incompatible with the formal parameter of the function.
The type of the actual
is 'class $unit::cpu_sequence',while the type of the formal is 'class uvm_pkg::uvm_component'.
是不是因为env和sequence之间不能直接用config传递数据。
怎么才能把在env里实例化的regmodel传递到cpu_sequence内?
config_db机制只能在component之间传输,怎么把在env里实例化的句柄传递到sequence里?
?
uvm_config_db#(reg_model)::set(this,“*”,“reg_model”,reg_model);
uvm_config_db#(reg_model)::get(get_sequencer(),“”,“reg_model”,reg_model);
非常感谢!
sequence不是专门产生transaction的吗?为什么要这样做?
`uvm_do_on(send_seq,p_sequencer.send_seq);
`uvm_do_on(cpu_seq,p_sequencer.cpu_seq);
括号里面是不是应该是(cpu_seq,p_sequencer.cpu_seqr),(send_seq,p_sequencer.send_seqr)?小编我是新手,麻烦给我说说,见谅了