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

    

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
	

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

 

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

 

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


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

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

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

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

Удачи! Rob.

 

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


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

 

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

`define XILINX

module foo

	#(
	    
	)
	(...)

     fifo fifo_inst
	 
	`ifdef  XILINX
	    
	    (
	    ...
	    );

	`else

	    (
	    ...
	    );

	`endif

endmodule

 

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


Ссылка на сообщение
Поделиться на другие сайты
38 минут назад, Zwerg_nase сказал:

 

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


`define XILINX

module foo

 

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

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


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

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

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

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

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


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

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти