VoltageCurrent 0 30 мая, 2022 Опубликовано 30 мая, 2022 · Жалоба Пишу код в Quartus на SystemVerilog. В ходе синтеза необходимо вычислить по входным параметрам модуля некое значение и использовать его в качестве параметра модуля более низкого уровня. То есть, есть модуль верхнего уровня main в котором используется целевой модуль test_module: `ifndef TEST_MODULE_LIB `define TEST_MODULE_LIB `include "test_module.sv" `endif module main ( input clk, output reg some_out ); test_module #( .PARAM_A (12.3), .PARAM_B (45.6) ) my_module ( .clk (clk), .some_out(some_out) ); endmodule И есть код целевого модуля test_module и его под-модуля sub_module: module test_module #( parameter real PARAM_A, parameter real PARAM_B )( input clk, output reg some_out ); function int my_func(); int res = PARAM_A/PARAM_B; return res; endfunction //const int FUNC_RESULT = my_func(); //parameter FUNC_RESULT = my_func(); sub_module #( .FUNC_RESULT (FUNC_RESULT) ) sub_module ( .clk (clk), .some_out(some_out) ); endmodule module sub_module #( parameter FUNC_RESULT )( input clk, output reg some_out ); assign some_out = clk; endmodule В случае, если я расскоментирую строку с объявлением параметра: parameter FUNC_RESULT = my_func(); ...я получу ошибку в самом объявлении параметра: Цитата Error (10192): Verilog HDL Defparam Statement error at test_module.sv(15): value for parameter "FUNC_RESULT" must be constant expression В случае, если я раскомментирую строку с объявлением константы типа int: const int FUNC_RESULT = my_func(); ...я получу ошибку при передаче константы в под-модуль: Цитата Error (10912): SystemVerilog error at test_module.sv(14): const-qualified variable "FUNC_RESULT" is not legal in constant expressions В последнем случае, технически, я бы мог перенести функционал под-модуля в основной модуль и всё бы заработало (внутри модуля test_module использовать полученную константу синтезатор позволяет). Но есть ли возможность всё же как-либо забросить результат вычисления функции в под-модуль через параметр, чтобы всё было красиво не только снаружи test_module, но и внутри него? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 30 мая, 2022 Опубликовано 30 мая, 2022 · Жалоба localparam не работает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 1 30 мая, 2022 Опубликовано 30 мая, 2022 · Жалоба 4 minutes ago, des00 said: localparam не работает? На localparam синтезатор Quartus говорит тоже самое, что и на parameter. localparam FUNC_RESULT = my_func(); Quote Error (10192): Verilog HDL Defparam Statement error at test_module.sv(16): value for parameter "FUNC_RESULT" must be constant expression Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 30 мая, 2022 Опубликовано 30 мая, 2022 · Жалоба module test_module #( parameter real PARAM_A = 5.0, parameter real PARAM_B = 2.0 )( input clk, output some_out ); function int my_func(); my_func = PARAM_A/PARAM_B; endfunction localparam int FUNC_RESULT = my_func(); assign some_out = FUNC_RESULT; endmodule съел и не подавился. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 1 30 мая, 2022 Опубликовано 30 мая, 2022 · Жалоба 3 minutes ago, des00 said: module test_module #( parameter real PARAM_A = 5.0, parameter real PARAM_B = 2.0 )( input clk, output some_out ); function int my_func(); my_func = PARAM_A/PARAM_B; endfunction localparam int FUNC_RESULT = my_func(); assign some_out = FUNC_RESULT; endmodule съел и не подавился. Это Quartus? Версия Pro или Standard/Lite? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 30 мая, 2022 Опубликовано 30 мая, 2022 · Жалоба 6 minutes ago, flammmable said: Это Quartus? Версия Pro или Standard/Lite? вивадо, но не вижу проблем с любым другим софтом. FEC на ПЛИС - Языки проектирования на ПЛИС (FPGA) - Форум ELECTRONIX вот тут у меня функций в параметрах, как у дурака махорки. и все работает, в том числе под ква. ЗЫ. А стандарт все же прочитайте. Почему у вас не сработал вариант с константой и ваш вариант функции(если заметили, они немного разные) ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 1 30 мая, 2022 Опубликовано 30 мая, 2022 · Жалоба 12 minutes ago, des00 said: вивадо, но не виду проблем с любым другим софтом. FEC на ПЛИС - Языки проектирования на ПЛИС (FPGA) - Форум ELECTRONIX вот тут у меня функций в параметрах, как у дурака махорки. и все работает, в том числе под ква. Ммм. Если делать возврат в одну строчку (через имя функции, либо через return), то всё ок: function int my_func(); //my_func = PARAM_A/PARAM_B; return PARAM_A/PARAM_B; endfunction Но если возвращать значение переменной внутри функции, то не ок (синтезатор ругается на неконстантность выражения, даже если res объявлен, как const int res): function int my_func(); int res = PARAM_A/PARAM_B; my_func = res; //return res; endfunction Спасибо, за то, что попробовали на своей среде и подковырнули данную проблему. Может я сейчас и доколупаюсь до сути происходящего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 30 мая, 2022 Опубликовано 30 мая, 2022 · Жалоба 5 minutes ago, flammmable said: Спасибо, за то, что попробовали на своей среде и подковырнули данную проблему. Может я сейчас и доколупаюсь до сути происходящего. вот так тоже работает function int my_func(); int res; res = PARAM_A/PARAM_B; return res; endfunction а почему, лучше узнать в стандарте) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 1 30 мая, 2022 Опубликовано 30 мая, 2022 · Жалоба 2 hours ago, des00 said: вот так тоже работает function int my_func(); int res; res = PARAM_A/PARAM_B; return res; endfunction а почему, лучше узнать в стандарте) Огромное вам спасибо! Могу я поинтересоваться, какой именно раздел IEEE1800 почитать по теме? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 31 мая, 2022 Опубликовано 31 мая, 2022 · Жалоба 12 hours ago, flammmable said: Могу я поинтересоваться, какой именно раздел IEEE1800 почитать по теме? я бы начал с IEEE Std 1800™-2012 разделы 6.20 Constants/6.21 Scope and lifetime/10.5 Variable declaration assignment (variable initialization) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться