Рекурсивная функция iverilog вызывает ошибку сегментации

Вот проблемный код:

function automatic [31:0] W;
    input [6:0] param;
    W = (param<16) ? 32'b0 : W(param-7);
endfunction

По сути, iverilog (Icarus Verilog) просто выдает ошибку Segmentation fault: 11 vvp svsim.
Я попробовал немного отладить, и мне кажется, что рекурсия мне не нравится, хотя у меня есть якорь рекурсии.
Вызов функции изнутри сам по себе недопустим. хотя это не проблема. Это тоже проверено.
Любая помощь приветствуется!

EDIT:
Здесь у меня есть фрагмент кода, который безуспешно вызывает эту функцию:

always @(negedge clk) begin
    t1 <= W(j);
end

person unixb0y    schedule 04.02.2018    source источник
comment
как вы вызываете функцию?   -  person Serge    schedule 04.02.2018
comment
@unixb0y Опубликуйте MCVE. У меня код работает нормально, когда я вызываю W(5) или W(55). Обратите внимание, что функция всегда будет возвращать 0.   -  person sharvil111    schedule 04.02.2018
comment
Ладно, позже напишу @sharvil111 . Вы тоже использовали Icarus Verilog или какой-то другой инструмент?   -  person unixb0y    schedule 04.02.2018
comment
Ваша функция никогда не вернет ничего, кроме 0. Это то, что вы хотели? (Пробовал на иверилоге и др.)   -  person dave_59    schedule 04.02.2018
comment
@ unixb0y Да, я пробовал iverilog на EDAPlayground и других симуляторах, и он работал нормально.   -  person sharvil111    schedule 04.02.2018
comment
@ dave_59 Да, верно. Якорь базового случая/рекурсии будет заменен чем-то другим, но у меня это так для этого этапа приложения.   -  person unixb0y    schedule 04.02.2018
comment
@ sharvil111 Я разместил код, который может быть полезен   -  person unixb0y    schedule 04.02.2018
comment
Ваш код будет работать в stacktrace, бесконечный цикл с нулевой задержкой, если j неизвестен (x). Было бы полезно проверить, является ли j x или z при вызове функции. Управление j в текущем коде неясно.   -  person sharvil111    schedule 04.02.2018
comment
Хорошая идея, попробую!   -  person unixb0y    schedule 04.02.2018
comment
@ sharvil111 sharvil111 Если вы добавите это в качестве ответа, я буду рад принять его. Это решило мою проблему! Спасибо!   -  person unixb0y    schedule 04.02.2018
comment
Это нормально .. Приятно видеть, что проблема решена :)   -  person sharvil111    schedule 04.02.2018
comment
Нет, правда, так другие люди тоже найдут ответ быстрее, чем поиск в комментариях ;-) В противном случае я добавлю его!   -  person unixb0y    schedule 04.02.2018


Ответы (3)


Измените свой код на

function automatic [31:0] W (input [6:0] param);
    if (param>=16)
       W = W(param-7);
    else
       W = 0;
endfunction

Таким образом, если параметр неизвестен, он не войдет в бесконечную рекурсию.

person dave_59    schedule 04.02.2018

Как предложил @sharvil111, значение, которое я передал, было 1'bX в тот момент времени.
Поэтому я обязательно установил его на 0 перед вызовом.
Спасибо за другие предложения, но, например. то, что сказал @dave_59, не сработало в моем случае, поскольку param не было слишком маленьким, оно просто еще не было определено.

person unixb0y    schedule 08.02.2018

Если вы даете правильные входные данные, вы не должны увидеть ошибку Seg. если вы все еще видите, то необходимо уточнить у поставщика инструмента.

person TgP    schedule 06.02.2018