Я подозреваю, что вы не использовали правильные временные рамки для задержек в вашем тестовом стенде. Из стандарта IEEE 1800-2017, раздел 22.7 `timescale :
Если не указан` timescale или он был сброшен с помощью директивы `resetall, единицы времени по умолчанию и точность указана для инструмента c.
Если не указано, мой симулятор по умолчанию:
`timescale 1ns/1ns
Я вижу зависание симуляции в момент времени 0, как я думаю, что вы делаете , Поскольку точность по времени равна единице времени (для меня оба 1ns
), задержка 0,1 для clk
округляется до 0, что приводит к бесконечному l oop в блоке clk
always
.
Я исправил это, добавив эту явную шкалу времени перед модулем:
`timescale 1ns/100ps
Это устанавливает точность меньше единицы, позволяя clk
правильно переключаться.
Расхождение, которое вы видите между Vivado и Icarus, вероятно, является результатом использования разных временных шкал. Чтобы узнать, какая временная шкала действует, добавьте этот код в свой стенд:
initial $printtimescale;