Jump to content

    
Sign in to follow this  
GAYVER

Генерация нескольких экземпляров интерфейса

Recommended Posts

Помню что несколько лет назад натыкался на подобное обсуждение (может даже и сам его создавал :)), но через поиск его не нашел. Собственно задача - как при описании портов устройства автоматически сгенерить несколько экземпляров одного и того же интерфйеса, используя дженерик-параметр? Насколько помню старое обсуждение - на ВХДЛе этого нельзя было сделать. Ну кроме как объединить одноименные порты в одну шину и разделить потом на нижележащие устройства. Но такой вариант мне не подходит. А вот на верилоге что то подобное можно было провернуть... Но с верилогом пока знаком очень плохо и на скорую руку гугл ничего не подсказал. Поэтому буду благодарен за примеры :)

 

зы

если использовать интрефейсы в системверилоге, то как параметризировать объявление портов модуля на топ-лвл?

 

 

Share this post


Link to post
Share on other sites

Всё зависит от задачи, для которой нужно "несколько экземпляров". Если говорить про Верилог, то можно через `define'ы сделать описание интерфейса и затем размножать его как хочется:

`define INTERFACE_IN(x)					\
	input i_my_wire_``x

module test_mod (
		INTERFACE_IN(0),
		INTERFACE_IN(1),
		INTERFACE_IN(2),
		output o_my_wire
	)

Если же нужно уменьшить количество протов/интерфейсов объявления, то лучше задействовать array'и. Их можно объявлять как в Верилоге, так и VHDL с различными индексами.

Возможно есть вариант прописать скриптом TCL объявление интерфейса, а дальше мучится с растягиванием соответствуцющих net'ов по подблокам, но я так и не нашёл как можно подсунуть тиклевский файл в виде исходника в проект.

Параметризация объявления портов? Не совсем понял вопрос, но если дело в разрядностях, тогда описываете интерфейс:

interface if_axi_lite #(
	parameter integer C_S00_AXI_DATA_WIDTH	= 32,	// Data width to AXI lite
	parameter integer C_S00_AXI_ADDR_WIDTH	= 7)	// Addr width to AXI lite
(
	input	[C_S00_AXI_ADDR_WIDTH - 1 : 0] S00_AXI_awaddr,
	input	[2 : 0] S00_AXI_awprot,
	input	S00_AXI_awvalid,
	output	S00_AXI_awready,
  ...
)

дальше подставляете нужные значения при объявлении интерфейса:

	if_axi_lite #(
		.C_S00_AXI_DATA_WIDTH(32),
		.C_S00_AXI_ADDR_WIDTH(16))
	S_00_AXI ();

и подставляете по нужным интерфейсам S_00_AXI.

Share this post


Link to post
Share on other sites

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

1 hour ago, GAYVER said:

если использовать интрефейсы в системверилоге, то как параметризировать объявление портов модуля на топ-лвл?

В общем случае задавать через параметры модуля  число и тип портов  в V/SV нельзя.  Можно только менять параметры  уже объявленных - ширину вектора/размер массивов/ в отдельных случаях тип данных порта.  Поэтому  вам надо  подумать - либо менять  принцип построения системы  чтобы не требовалось  "динамически" создавать порты - либо  использовать  что-то для автоматической генерации исходников модулей. 

Удачи! Rob.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this