我有一个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();
我想有一种方法可以通过在配置数据库运行之前设置寄存器序列名称,然后在任务运行完毕后在任务内部检索它来实现。有人对此实施有任何建议吗?可以使用配置数据库完成吗?
答案 0 :(得分:1)
在测试/虚拟序列中,您可以按如下方式实现任务:
task assign_reg_value(my_base_sequence seq);
// ...
seq_ser_format = seq.get_format_reg();
endtask
我假设您的序列是从基类my_base_sequence
扩展而来的。然后,您需要在get_format_reg()
my_base_sequence
方法中实现上述函数virtual
,并在子类中覆盖它。
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
然后在你的测试/虚拟序列中:
// ...
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);
// ...