2014-01-10 87 views
3

我有一个用RAL建模的大型寄存器映射,我想随机化一些寄存器。如果我要限制寄存器seperately那么这很简单:UVM 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个寄存器。

有没有办法随机化这两个寄存器,但仍然有约束求解器维持它们之间的关系?

回答

6

你可以做

reg_model.randomize(register_a,register_b) with {register_a.value > register_b.value;} 

然后只注册A和B将获得随机的。

+1

这是我找到的解决方法,因为这会导致我编译错误:使用'rand_mode'来禁用整个寄存器模型的随机化,然后再次使用它来为需要的寄存器启用随机化随机。 – nguthrie

+1

2。5年后,我的工作被打破了我的模拟器的新版本。但现在真正的答案有效! – nguthrie

+0

对我来说,寄存器的直接约束不起作用,因为寄存器没有“值”变量。我不得不去一个领域。见下文 断言(seq_h.reg_m.randomize(* solvefaildebug *)与{ \t \t info_registers.BLK_PKG_STORAGE_START_ADDR_REG_BYTE.BLK_PKG_STORAGE_START_ADDR_REG_BYTE_F.value == 32'h0; info_registers.BLK_PKG_STORAGE_SIZE_REG_BYTE.BLK_PKG_STORAGE_SIZE_REG_BYTE_F.value == 32'h1000; // 4096 })else $ fatal(0,“随机化seq_h.reg_m失败”); // end assert – Joniale