4

我有一个用 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 个寄存器。

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

4

3 回答 3

6

你可以做

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

然后只有寄存器 a 和 b 会被随机化。

于 2014-01-11T03:53:39.630 回答
1

这不可能工作,因为寄存器没有“值”变量,只有字段有“值”成员变量。

这应该有效:

reg_model.randomize(register_a,register_b) with {register_a.get() > register_b.get();}
于 2018-04-23T21:28:36.310 回答
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
于 2018-05-02T08:41:59.260 回答