序列名称作为任务输入

Sequence name as a task input

我有一个 SPB 寄存器序列,它在特定配置中设置硬件寄存器值。通过将寄存器值分配给 DAI 序列值,此配置的值由后续 DAI 序列使用。我已经使用以下代码将寄存器值分配给临时整数以用于约束 DAI 序列:

 task assign_reg_value();

    `uvm_info ("VIRT_SEQ_MODEL_PRINT", $sformatf ("Initial Register Setup : %s", ljf_reg_wr_seq.model.sprint()), UVM_LOW)



    //------------------------------------------------------------------------------------------------------
    //Get the register field value and assign it to the temporary variable. These are used for the serial 
    //sequence
    //------------------------------------------------------------------------------------------------------
    //DAI_CTRL
    seq_ser_format      = ljf_reg_wr_seq.model.DAI_CTRL.format.get();

    //MORE LINES SIMILAR TO ABOVE HERE 

endtask

但是,如果 运行 在单个模拟中设置多个寄存器序列以具有不同的配置,我需要一种方法来概括上述任务,以便它采用序列名称参数。否则,我将需要复制 ~50 行代码并更改序列名称。下面的伪代码显示了我需要的功能:

seq_ser_format = <seq_name>.model.DAI_CTRL.format.get(); 

我想有一种方法可以通过在运行之前在配置数据库中设置寄存器序列名称,然后在任务完成后在任务中检索它运行ning .有人对此实施有任何建议吗?可以使用配置数据库来完成吗?

在您的 test/virtual 序列中,您可以按如下方式执行您的任务:

task assign_reg_value(my_base_sequence seq);
  // ...
  seq_ser_format = seq.get_format_reg();
endtask

我假设你的序列是从基础 class my_base_sequence 扩展而来的。然后你需要在你的 my_base_sequence 中实现上面的函数 get_format_reg() 作为 virtual 方法并在你的子 classes 中覆盖它。

class my_base_sequence extends uvm_sequence;
  // ...
  virtual function int get_format_reg();
     // leave it empty
     $display("Not implemented in base class");
  endfunction
endclass

class ljf_reg_wr_sequence extends my_base_sequence;
// ...
  virtual function int get_format_reg();
    return this.mode1.DAI_CTRL.format.get();
  endfunction
endclass

然后在您的 test/virtual 序列中:

// ...
ljf_reg_wr_sequence ljf_reg_wr_seq;
other_reg_sequence other_seq;
// ... create sequence

assign_reg_value(ljf_reg_wr_seq);
// do something
assign_reg_value(other_seq);
// ...