Jump to content

    

verilog: parameter in ifdef

Прошу прощения, но в Гугле не нашёл.

Есть модуль, который должен работать на двух FPGA разных вендоров (Intel и Xilinx). В модуле используется FIFO, оно сгенерено как IP core. В остальном код платформенно-независимый. Проблема в том, интерфейсы FIFO разные.

Хотелось бы так: параметризовать модуль и использовать параметр в препроцессоре:

	module foo
	#(
	    parameter XILINX = 1
	)
	(...)
	 
	`if (XILINX != 0)
	    fifo fifo_inst
	    (
	    ...
	    );
	`else
	    fifo fifo_inst
	    (
	    ...
	    );
	`endif
	endmodule
	

Тут вопрос: будет ли в препроцессоре использоваться значение параметра, установленного при инстанцировании модуля, или препроцессор отработает раньше?

 

Второе, что приходит в голову, это generate:

	module foo
	#(
	    parameter XILINX = 1
	)
	(...)
	 
	generate
	if (XILINX != 0)
	    fifo fifo_inst
	    (
	    ...
	    );
	else
	    fifo fifo_inst
	    (
	    ...
	    );
	endgenerate
	endmodule
	

Но мне это не очень нравится.

 

Третий вариант -- написать врапперы. Но это мне не нравится совсем, так как появляются в проекте лишние файлы.

 

Share this post


Link to post
Share on other sites

Приветствую!

Первый вариант не будет работать - так как препроцессор ни чего не знает о подстановке параметров.  В этом случае нужен глобальный define задающий тип вендора либо в общем include файле, либо в опциях компилятора/синтезатора.

Вариант с generate более уместный.  Но как по мне так вариант с враппером  наиболее достоин использования! Нужно только один раз написать свой враппер для FIFO  покрывающий  ваши основные запросы к интерфейсу и параметрам FIFO.  И везде использовать его. А уж весь зоопарк реализаций разводить внутри этого враппера.  Приводя интерфейс вендоровских корок к своему любимому. Ну а там недалеко и до своей реализации FIFO.

Удачи! Rob.

 

Share this post


Link to post
Share on other sites

 

Можно написать:

`define XILINX

module foo

	#(
	    
	)
	(...)

     fifo fifo_inst
	 
	`ifdef  XILINX
	    
	    (
	    ...
	    );

	`else

	    (
	    ...
	    );

	`endif

endmodule

 

Share this post


Link to post
Share on other sites
38 минут назад, Zwerg_nase сказал:

 

Можно написать:


`define XILINX

module foo

 

Это самый очевидный и наихудший вариант. Его я даже упоминать не стал. Нужно иметь модуль, который был бы полностью идентичен в двух проектах. А так получатся два файла, отличающихся дифайном.

Share this post


Link to post
Share on other sites

Тогда можно убрать `define XILINX из модуля и задавать этот define в скрипте при компиляции.

в виваде:
"-verilog_define XILINX=1"

как я понимаю про это писал RobFPGA.

Share this post


Link to post
Share on other sites

Вот только недавно у меня была похожая задачка. Делал wrapper для FIFO и многих других модулей, которые должны были быть портабельными между ПЛИС разных вендоров. Вот у Altera я такого не нашел. Поэтому решил если нет дефайна то значит Altera, а если есть то это Xilinx.

В Vivado это Project Settings -> General -> Verilog Options и просто "плюсируем" туда нужные define.

 

Более того, у Vivado есть аналогичные Verilog Options, куда можно ляпнуть SIM. И таким образом код может автоматом модифицироваться когда он для симулятора (меньше задержки, другие инит состояния), и когда для железа. У Modelsim, что я использую для Altera, можно так: vlog +define+SIM my_sweet_module.v

 

Таким образом, у меня есть глобальные define, о которых я не думаю и не парюсь, которые всегда актуальны в своей среде своего вендора, и актуальны для симуляции. Удобно, просто то, о чем я мечтал как раз.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now