Я запускаю тестовый стенд с UVM. В одной из задач run_phase()
компонента я выполняю fork...join_none
, чтобы запустить следующий цикл, который проходит через всю симуляцию:
fork
forever @(posedge trigger) begin
force dut.a = $urandom_range('h00,'hFF);
force dut.b = $urandom_range( 'h0, 'hF);
force dut.c = $urandom_range('h00,'hFF);
force dut.d = $urandom_range( 'h0, 'hF);
force dut.e = $urandom_range('h00,'hFF);
force dut.f = $urandom_range( 'h0, 'hF);
end
...
some other stuff
...
join_none
Дело в том, что сигналы a, c и e приводятся к одному и тому же значению. То же самое для b, d и e.
Если позже появляется новая постановка триггера, новые значения рандомизируются и форсируются, но снова я получаю a == c == e
и b == d == e
.
Кажется, что $urandom_range
вызывается только один раз для выбора каждого параметра (от 0 до FF и от 0 до F), а возвращаемое значение повторно используется для трех команд force
.
РЕДАКТИРОВАТЬ: мне удалось воспроизвести проблему на минимальном ТБ: http://www.edaplayground.com/x/4_ph
Похоже, проблема с поставщиком, которого я использую, при выборе других инструментов проблема исчезает.
РЕДАКТИРОВАТЬ 2: я точно не понял, почему это происходит, но, похоже, это связано с тем фактом, что оператор force подобен непрерывному присваиванию (т. е. если сигнал RHS изменится в будущем, принудительно LHS будет следовать за ним до тех пор, пока force не станет выпускомd, это не похоже на присваивание '=').
Итак, я предполагаю, что проблема заключается в использовании возвращаемого значения функции в качестве RHS. (Я не знаю, какое время жизни имеет это возвращаемое значение)
Решение в моем случае состояло в том, чтобы сохранить значение $urandom в переменной со статическим временем жизни, а затем принудительно перевести эту переменную в RTL (как предложил Дж. Рейд)