我有一个用RAL建模的大型寄存器映射,我想随机化一些寄存器。如果我想单独限制寄存器,那么这很简单:
reg_model.register_a.randomize() with {value > 5;}
reg_model.register_b.randomize() with {value < 2;}
reg_model.update(status);
但是,如果我想要写两个值之间的关系,我想我必须在整个寄存器模型中添加一个约束:
reg_model.randomize() with {register_a.value > register_b.value;}
reg_model.register_a.update(status);
reg_model.register_b.update(status);
这里的问题是模型中的其他254个寄存器也将被随机化。我可以只更新我想要随机化的两个寄存器,但镜像将与硬件不匹配。如果我有后门访问工作,我可以刷新镜像,但我没有,我当然不想通过前门读回254寄存器。
有没有办法随机化这两个寄存器但仍然有约束求解器维持它们之间的关系?
答案 0 :(得分:6)
你可以做到
reg_model.randomize(register_a,register_b) with {register_a.value > register_b.value;}
然后只注册a和b将被随机化。
答案 1 :(得分:1)
这可能无法奏效,因为寄存器没有&#34;值&#34;变量,只有字段具有&#34;值&#34;成员变量。
这应该有效:
reg_model.randomize(register_a,register_b) with {register_a.get() > register_b.get();}
答案 2 :(得分:0)
这是我的两分钱, 这里所有寄存器和所有字段都被限制为零。
top_regm.get_registers(regs, UVM_HIER); //NOW take ALL registers (regs) inside the block
regs.sort with (item.get_address()); //sort ascending by address
for (int unsigned r=0; r<regs.size(); r++) begin
assert(regs[r].randomize with {
regs[r].get() == 0; //constraint with function is heavy consumming
} );
reg_value_q.push_back(regs[r].get()); //store all the constrained values in a queue
end