我在尝试将数据从记分板传递到序列时遇到错误,如何摆脱它?

Gra*_*e90 1 system-verilog uvm

我是 UVM 的新手,我正在尝试验证一个内存设计,在该设计中我尝试多次运行写入序列,然后是相同次数的读取序列,以便我可以读取我正在写入的相同地址并进行比较。为此,我尝试创建一个从 uvm_object 扩展的新类,并带有一个队列来存储我正在写入的地址,以便我可以在读取序列中使用它们,并在记分板中实例化这个类,然后将类的句柄发送到通过 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;
Run Code Online (Sandbox Code Playgroud)

在我的记分牌中,我将带有地址队列的类的句柄传递给读取序列,这是记分牌的片段

       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
Run Code Online (Sandbox Code Playgroud)

在我的阅读序列中,我试图获得句柄

     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_)
Run Code Online (Sandbox Code Playgroud)

Mat*_*lor 5

这条线有两个问题:

if(!uvm_config_db#(address_list)::get(this, " ", "address", addr_))
Run Code Online (Sandbox Code Playgroud)

一个是导致你的错误。一个可能会导致您无法在数据库中找到您要查找的内容。

这(字面意思this)导致了您的错误。您正在get从派生自uvm_sequence. 的第一个参数get是期望派生自 的类uvm_component。你的问题是,一个序列是不是测试平台层次结构的一部分,所以你不能用一个序列作为第一个参数来调用get(或set在)uvm_config_db。相反,约定是使用运行序列的序列器,它通过调用序列的get_sequencer()方法返回。这可以解决您的问题:

if(!uvm_config_db#(address_list)::get(get_sequencer(), "", "address", addr_))
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为您在调用时使用了通配符set

请注意,我还删除了引号之间的空格。这可能不会给您带来问题,因为您在调用 时使用了通配符set,但通常该字符串应该为空或应该是真正的分层路径。(setget调用的层次结构输入在第一个参数 - SystemVerilog 层次结构路径 - 和第二个 - 表示层次结构路径的字符串之间拆分)。