Перейти к содержанию
    

Как в SystemVerilog использовать результат вычислений функции в качестве параметра модуля?

Пишу код в 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, но и внутри него?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

съел и не подавился.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, flammmable said:

Это Quartus? Версия Pro или Standard/Lite?

вивадо, но не вижу проблем с любым другим софтом. FEC на ПЛИС - Языки проектирования на ПЛИС (FPGA) - Форум ELECTRONIX вот тут у меня функций в параметрах, как у дурака махорки. и все работает, в том числе под ква. 

ЗЫ. А стандарт все же прочитайте. Почему у вас не сработал вариант с константой и ваш вариант функции(если заметили, они немного разные) ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Спасибо, за то, что попробовали на своей среде и подковырнули данную проблему. Может я сейчас и доколупаюсь до сути происходящего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, flammmable said:

Спасибо, за то, что попробовали на своей среде и подковырнули данную проблему. Может я сейчас и доколупаюсь до сути происходящего.

вот так тоже работает 

  function int my_func();
    int res;
    res = PARAM_A/PARAM_B;
    return res;
  endfunction

а почему, лучше узнать в стандарте)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, des00 said:

вот так тоже работает 


  function int my_func();
    int res;
    res = PARAM_A/PARAM_B;
    return res;
  endfunction

а почему, лучше узнать в стандарте)

Огромное вам спасибо!
Могу я поинтересоваться, какой именно раздел IEEE1800 почитать по теме?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...