我是UVM的新手,我正在尝试验证一种内存设计,在该设计中,我尝试多次运行一个写入序列,然后依次运行相同次数的读取序列,以便可以读取要写入的相同地址,并且比较。为此,我尝试创建一个新的类,该类从uvm_object扩展,并使用队列存储要写入的地址,以便可以在read seq中使用它们,并在记分板上实例化该类,然后将类的句柄发送到通过uvm_config_db读取序列,现在的问题是我能够将地址存储在队列中,但无法按读取序列获取类句柄……这是正确的检查方法,还是有更好的方法来检查写和读回内存,请帮助我!
整个代码链接(尚未完成):https://www.edaplayground.com/x/3iTr 相关代码段: 这是我创建的用于存储地址的类
class address_list extends uvm_object;
reg[7:0]addr_q[$];
function new(string name);
super.new(name);
endfunction
endclass;
在我的记分板上,我将带有地址队列的类的句柄传递给读取序列,这是记分板中的代码段
virtual function void write(mem_seq_item pkt);
if(pkt.wr_en==1)
begin
pkt_qu_write.push_back(pkt);
addr.addr_q.push_back(pkt.addr);
uvm_config_db#(address_list)::set(uvm_root::get(),"*","address",addr);
end
if(pkt.rd_en==1)
pkt_qu_read.push_back(pkt);
`uvm_info(get_type_name(),$sformatf("Adder list is
%p",addr.addr_q),UVM_LOW)
endfunction : write
在我的读取顺序中,我正在尝试获取手柄
virtual task body();
repeat(3)
`uvm_do(wr_seq)
if(!uvm_config_db#(address_list)::get(this, " ", "address", addr_))
`uvm_fatal("NO_VIF",{"virtual interface must be set for:",get_full_name(),".addr_"});
`uvm_info(get_type_name(),$sformatf("ADDR IS %p",addr_),UVM_LOW)
repeat(3)
`uvm_do(rd_seq)
endtask
Error-[ICTTFC] Incompatible complex type usage
mem_sequence.sv, 137 {line where i try to get from uvm_config_db}
Incompatible complex type usage in task or function call.
The following expression is incompatible with the formal parameter of the
function. The type of the actual is 'class $unit::wr_rd_sequence', while
the
type of the formal is 'class uvm_pkg::uvm_component'. Expression: this
Source info: uvm_config_db#
(_vcs_unit__3308544630::address_list)::get(this,
" ", "address", this.addr_)
答案 0 :(得分:4)
此行有两个问题:
if(!uvm_config_db#(address_list)::get(this, " ", "address", addr_))
一个导致您的错误。可能会导致您无法在数据库中找到要查找的内容。
这(字面上是this
)引起了您的错误。您正在从get
派生的类中调用uvm_sequence
。 get
的第一个参数期望从uvm_component
派生的类。您的问题是序列不是testbench层次结构的一部分,因此您不能将序列用作对get
中的set
(或uvm_config_db
)的调用的第一个参数。相反,约定是使用序列在其上运行的定序器,该定序器由对序列的get_sequencer()
方法的调用返回。这可以解决您的问题:
if(!uvm_config_db#(address_list)::get(get_sequencer(), "", "address", addr_))
之所以有用,是因为您在致电set
时使用了通配符。
请注意,我也删除了引号之间的空格。这可能不会给您带来问题,因为您在调用set
时使用了通配符,但是通常该字符串应该为空或为真实的分层路径。 (输入到set
和get
调用中的层次结构在第一个参数-SystemVerilog层次结构路径-和第二个参数-代表层次结构路径的字符串之间分配)。
答案 1 :(得分:0)
uvm_config_db
主要用于在组件之间传递配置。
出于将数据从记分板传递到序列的目的,可以使用uvm_event
。
event.trigger(address_list)
在记分板中触发事件event.wait_for_trigger_data(address_list)
的序列等待事件