2014-01-10 1 views
3

У меня есть большая карта регистров, смоделированная с помощью RAL, и я хотел бы рандомизировать некоторые регистры. Если я хочу, чтобы ограничить регистры отдельно, то это просто: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;} 

Тогда только регистрирует и б получат рандомизированы.

+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, "Randomization of seq_h.reg_m failed"); // end assert – Joniale