Для поведенческой модели (не подлежит синтезу) я использую рекуррентную схему. Все переменные имеют тип real и все операции выполняются в одном и том же временном интервале.
Простой пример, приведенный ниже, можно найти на EDAplayground :
fun fun1 (.in(x), .out(out1));
fun fun2 (.in(x), .out(out2));
sum sum (.in1(out1), .in2(out2), .out(x));
Схема сходится в устойчивое состояние:
top.fun1: in = 0, out = 0
top.fun2: in = 0, out = 0
top.fun1: in = 0.2, out = 0.1
top.fun2: in = 0.2, out = 0.1
top.fun1: in = 0.24, out = 0.12
top.fun2: in = 0.24, out = 0.12
...
top.fun1: in = 0.25, out = 0.125
top.fun2: in = 0.25, out = 0.125
Во время релаксации, после оценки экземпляра fun1, оценивается экземпляр fun2, но пока не используется только что измененный ввод. Это соответствует операции в стиле Гаусса-Якоби.
Для аппаратного обеспечения это параллельное поведение имеет смысл, и в противном случае могло бы вызвать условия гонки. Но для описанной выше поведенческой модели может быть предпочтительнее работать в стиле Гаусса-Зейделя:
top.fun1: in = 0, out = 0
top.fun2: in = 0, out = 0.1
top.fun1: in = 0.1, out = 0.11
top.fun2: in = 0.21, out = 0.121
top.fun1: in = 0.231, out = 0.1231
...
top.fun2: in = 0.25, out = 0.125
Чтобы сериализовать поток симуляции, можно, например, вставить задержки ввода, но мне интересно, если есть более принципиальный способ добиться этого в многомодульном контексте.