Утверждение о длительном сбросе
Я вижу, что утверждения всегда связаны с n числом циклов часов. Можно ли как-нибудь проверить продолжительность по шкале времени? Имея в виду
скажем, я хочу проверить, удерживается ли сброс для 100 нс или меньше, как мы пишем утверждение assert для этого?
3 ответа
Да, концептуально вы можете написать подобное утверждение, используя локальные переменные в SVA.
Это может выглядеть так:
property reset_chk;
time current_time;
@(rst) (~rst, current_time = $time) |=> ($time - current_time == 100);
endproperty
Но этого типа утверждений следует избегать, так как они пишутся не по часам.
В качестве альтернативы всегда можно сделать опорные часы, достаточно быстрые, чтобы приспособиться к любым таким временным интервалам сигнала.
Для локальных переменных в утверждении, вы можете прочитать локальные переменные в SVA
Сначала я бы подумал, был ли SVA лучшим способом проверить это вообще.
Если вы так думаете, как насчет создания фиктивных часов в тестовом стенде с подходящим периодом и (с помощью иерархического именования) используйте это. Подходящий период может быть
100 нс, если вы искали минимальную ширину импульса
намного быстрее, если вы искали максимальную ширину импульса (например, период 10 нс позволит вам проверить, что ширина импульса была меньше 110 нс, то есть 11 циклов).
Утверждения лучше всего делать синхронно. Это не означает, что вы не можете проверять асинхронные объекты, но вам все равно нужно синхронно сэмплировать рассматриваемые сигналы. Таким образом, таким образом вы синхронизируете свой асинхронный сигнал синхронно, используя фиктивные часы.
Это асинхронная проверка. Лучший способ - проверить это традиционным способом или в чистом системном логе, вместо использования одновременного утверждения SVA.
Если вы хотите, вы все равно можете добавить немедленное утверждение в целях покрытия. Быстрый пример кода:
//
task assert_reset_hold_100ns();
fork : fk1
begin : blk1
@(reset);
$fatal;
end
begin : blk2
#100ns;
ASSERT_RESET_HOLD_100NS: assert(1);
end
join_any
disable fork;
endtask
// checker
initial forever begin
wait(reset === 0);
assert_reset_hold_100ns();
wait(reset === 1);
end
//