2014-01-10 112 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