【发布时间】:2016-09-21 15:58:33
【问题描述】:
我需要监控寄存器的状态。我创建了一个 UVM 序列来读取寄存器并将它们存储在本地。现在在我的测试代码中,我需要访问这些 寄存器。这是一个 sudo 代码:
typedef struct {
int a;
} my_regs;
class my_seq extends uvm_sequence;
// register to uvm db
reg_map map;
my_regs regs;
uvm_status_e status;
task build_phase(uvm_phase phase);
endtask
task run_phase(uvm_phase phase);
map.CORE.reg_a.read(status, regs.a, UVM_BACKDOOR)
endtask
endclass
class test_reg extends uvm_test;
// register to uvm db
my_seq seq;
my_regs regs;
task build_phase(uvm_phase phase);
seq = my_seq::type_id::create("reg_seq", this);
regs = seq.regs;
endtask
task run_phase(uvm_phase phase);
reg_seq.start(null);
// read reg values from seq??????
if(rqgs.a>1)
//do some thing
endtask
endclass
如您所见,我不断启动序列,以免错过任何更新。我相信 start 任务顺序不会创建新对象 所以对象内部的值应该在开始调用之间保持不变。
假设我不是每次都从 seq 读取 regs 值,那么测试类的 regs 不会从 seq 获取更新。这意味着 regs = seq.regs; 不会创建对 seq.regs 的实际引用。我想知道为什么会这样以及如何创建对该对象的绝对引用? (这样我就不会浪费模拟周期来读取和更新测试类中的 regs 值)。如果有更好的方法,请告诉我。
【问题讨论】:
标签: system-verilog uvm