Релаксация Гаусса-Зейделя в SV - PullRequest
0 голосов
/ 17 января 2020

Для поведенческой модели (не подлежит синтезу) я использую рекуррентную схему. Все переменные имеют тип 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

Чтобы сериализовать поток симуляции, можно, например, вставить задержки ввода, но мне интересно, если есть более принципиальный способ добиться этого в многомодульном контексте.

1 Ответ

0 голосов
/ 20 января 2020

Существует только два способа ввести порядок в SystemVerilog.

  1. Пишите процедурный код, как вы это делаете в программном обеспечении, используя размещение операторов между блоками начала / конца.
  2. Используйте задержки или часы для последовательного выполнения процедурного кода.

Конечно, аппаратный дизайн - это комбинация обеих парадигм. Это верно даже при написании поведенческих моделей в SystemVerilog.

Кстати, ваш код можно упростить, написав:

module sum(input real in1, in2, output real out);
  always_comb begin
    out = in1 + in2;
  end 
endmodule
...