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

时间:2019-06-19 04:47:03

标签: system-verilog uvm

我是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_)

2 个答案:

答案 0 :(得分:4)

此行有两个问题:

if(!uvm_config_db#(address_list)::get(this, " ", "address", addr_))

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

这(字面上是this)引起了您的错误。您正在从get派生的类中调用uvm_sequenceget的第一个参数期望从uvm_component派生的类。您的问题是序列不是testbench层次结构的一部分,因此您不能将序列用作对get中的set(或uvm_config_db)的调用的第一个参数。相反,约定是使用序列在其上运行的定序器,该定序器由对序列的get_sequencer()方法的调用返回。这可以解决您的问题:

if(!uvm_config_db#(address_list)::get(get_sequencer(), "", "address", addr_))

之所以有用,是因为您在致电set时使用了通配符。

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

答案 1 :(得分:0)

uvm_config_db主要用于在组件之间传递配置。

出于将数据从记分板传递到序列的目的,可以使用uvm_event

  • 使用event.trigger(address_list)在记分板中触发事件
  • 使用event.wait_for_trigger_data(address_list)的序列等待事件