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

Vivado BD как спрятать параметризируемые порты AXI

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

2 hours ago, dxp said:

Квеста 10.7с выдаёт ошибку, что де объект 'slon' используемый в одном процедурном блоке, используется в другом.

А ошибка при компиляции или при синтезе? 

Удачи! Rob.

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


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

На симе (квеста же). На vopt. vlog проходит нормально, а на сборке vopt'ом выдаёт ошибку. 

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


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

17 hours ago, dxp said:

 а структура - это просто агрегатный тип. Она же не пакованная.

Единственное, гложет сомнение - может я всё-таки что-то делаю не так? Если да, поправьте.

Есть такое, для себя я просто запомнил что структура это полноценный тип) и использую их не часто. Я предпочитаю старый стиль, пусть и писать/генерировать много больше. Зато большую часть моего кода, можно легко под чистый верилог перенести)

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


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

5 часов назад, des00 сказал:

просто запомнил что структура это полноценный тип

Против этого такой аргумент: использование объекта структуры в разных блоках, если задействуются разные поля структуры, не возбраняется. Более того, даже можно обращаться к массиву структур точно так же в разных блоках (если нет пересечения по членам структуры), но только в том случае, если индекс указан явно числом. Если переменная - например, переменная цикла, то всё - ошибка. Казалось бы, какая разница - индексация по переменной не нарушает принципа "один объект, у которого data type == var, можно драйвить только из одного блока" (объектом внимания является член структуры, а сама структура - это просто синтаксическое объединение, чисто для удобства кодирования, это ведь не целостный неделимый объект, каким она была бы в случае пакованной), но нет. Думается, что это косяк квесты.

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


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

1 hour ago, dxp said:

. Думается, что это косяк квесты.

Да и скорее всего плавающий, от версии к версии. Все зависит от того, как очередной программист понял стандарт)

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


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

On 8/15/2019 at 5:25 PM, RobFPGA said:

 


`define AXI4_SLAVE_IF_MAP(sel, pname, ifname)\
  if ((sel)) begin : g_map_``pname           \
  assign ifname``.awaddr = pname``_awaddr;   \
  ...
  assign pname``_awready = ifname``.awready; \
  end                                        \
  else begin : g_skip_``pname                \
  assign pname``_awready = 1'b1;             \
  ...
  assign pname``_rdata = 'x;                 \
  end

 

А можно ли в интерфейс, к примеру, выходного порта (out) присваивать значение входного порта (input). Вроде как всё сделал, как подсказали и проект собирается как положено, но Цинк упорно не хочет читать с этих интерфейсов...

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


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

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

1 hour ago, Nick_K said:

А можно ли в интерфейс, к примеру, выходного порта (out) присваивать значение входного порта (input).

Не понятен вопрос,  свой примерчик приведите - а то перед обедом манна телепатии на нуле :smile:.

Удачи! Rob.

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


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

6 minutes ago, RobFPGA said:

Не понятен вопрос,  свой примерчик приведите - а то перед обедом манна телепатии на нуле :smile:.

Я сделал как посоветовали, только порты прописал с направлением. Получилась такая штука:

Quote

	`define AXI4_PORT_SLAVE(name_num)						\
		input wire [11 : 0] s_axi_``name_num``_s_axi_awaddr,\
		input wire [7 : 0] s_axi_``name_num``_s_axi_awlen,	\
		input wire [2 : 0] s_axi_``name_num``_s_axi_awsize,	\
		input wire [1 : 0] s_axi_``name_num``_s_axi_awburst,\
		input wire s_axi_``name_num``_s_axi_awlock,			\
		input wire [3 : 0] s_axi_``name_num``_s_axi_awcache,\
		input wire [2 : 0] s_axi_``name_num``_s_axi_awprot,	\
		input wire s_axi_``name_num``_s_axi_awvalid,		\
		output wire s_axi_``name_num``_s_axi_awready,		\
		input wire [31 : 0] s_axi_``name_num``_s_axi_wdata,	\
		input wire [3 : 0] s_axi_``name_num``_s_axi_wstrb,	\
		input wire s_axi_``name_num``_s_axi_wlast,			\
		input wire s_axi_``name_num``_s_axi_wvalid,			\
		output wire s_axi_``name_num``_s_axi_wready,		\
		output wire [1 : 0] s_axi_``name_num``_s_axi_bresp,	\
		output wire s_axi_``name_num``_s_axi_bvalid,		\
		input wire s_axi_``name_num``_s_axi_bready,			\
		input wire [11 : 0] s_axi_``name_num``_s_axi_araddr,\
		input wire [7 : 0] s_axi_``name_num``_s_axi_arlen,	\
		input wire [2 : 0] s_axi_``name_num``_s_axi_arsize,	\
		input wire [1 : 0] s_axi_``name_num``_s_axi_arburst,\
		input wire s_axi_``name_num``_s_axi_arlock,			\
		input wire [3 : 0] s_axi_``name_num``_s_axi_arcache,\
		input wire [2 : 0] s_axi_``name_num``_s_axi_arprot,	\
		input wire s_axi_``name_num``_s_axi_arvalid,		\
		output wire s_axi_``name_num``_s_axi_arready,		\
		output wire [31 : 0] s_axi_``name_num``_s_axi_rdata,\
		output wire [1 : 0] s_axi_``name_num``_s_axi_rresp,	\
		output wire s_axi_``name_num``_s_axi_rlast,			\
		output wire s_axi_``name_num``_s_axi_rvalid,		\
		input wire s_axi_``name_num``_s_axi_rready


	`define AXI4_SLAVE_IF_MAP(sel, pname, ifname)							\
		if ((sel)) begin : g_map_``pname									\
			assign ifname``.s_axi_awaddr = s_axi_``pname``_s_axi_awaddr;	\
			assign ifname``.s_axi_awlen = s_axi_``pname``_s_axi_awlen;		\
			assign ifname``.s_axi_awsize = s_axi_``pname``_s_axi_awsize;	\
			assign ifname``.s_axi_awburst = s_axi_``pname``_s_axi_awburst;	\
			assign ifname``.s_axi_awlock = s_axi_``pname``_s_axi_awlock;	\
			assign ifname``.s_axi_awcache = s_axi_``pname``_s_axi_awcache;	\
			assign ifname``.s_axi_awprot = s_axi_``pname``_s_axi_awprot;	\
			assign ifname``.s_axi_awvalid = s_axi_``pname``_s_axi_awvalid;	\
			assign ifname``.s_axi_awready = s_axi_``pname``_s_axi_awready;	\
			assign ifname``.s_axi_wdata = s_axi_``pname``_s_axi_wdata;		\
			assign ifname``.s_axi_wstrb = s_axi_``pname``_s_axi_wstrb;		\
			assign ifname``.s_axi_wlast = s_axi_``pname``_s_axi_wlast;		\
			assign ifname``.s_axi_wvalid = s_axi_``pname``_s_axi_wvalid;	\
			assign ifname``.s_axi_wready = s_axi_``pname``_s_axi_wready;	\
			assign ifname``.s_axi_bresp = s_axi_``pname``_s_axi_bresp;		\
			assign ifname``.s_axi_bvalid = s_axi_``pname``_s_axi_bvalid;	\
			assign ifname``.s_axi_bready = s_axi_``pname``_s_axi_bready;	\
			assign ifname``.s_axi_araddr = s_axi_``pname``_s_axi_araddr;	\
			assign ifname``.s_axi_arlen = s_axi_``pname``_s_axi_arlen;		\
			assign ifname``.s_axi_arsize = s_axi_``pname``_s_axi_arsize;	\
			assign ifname``.s_axi_arburst = s_axi_``pname``_s_axi_arburst;	\
			assign ifname``.s_axi_arlock = s_axi_``pname``_s_axi_arlock;	\
			assign ifname``.s_axi_arcache = s_axi_``pname``_s_axi_arcache;	\
			assign ifname``.s_axi_arprot = s_axi_``pname``_s_axi_arprot;	\
			assign ifname``.s_axi_arvalid = s_axi_``pname``_s_axi_arvalid;	\
			assign ifname``.s_axi_arready = s_axi_``pname``_s_axi_arready;	\
			assign ifname``.s_axi_rdata = s_axi_``pname``_s_axi_rdata;		\
			assign ifname``.s_axi_rresp = s_axi_``pname``_s_axi_rresp;		\
			assign ifname``.s_axi_rlast = s_axi_``pname``_s_axi_rlast;		\
			assign ifname``.s_axi_rvalid = s_axi_``pname``_s_axi_rvalid;	\
			assign ifname``.s_axi_rready = s_axi_``pname``_s_axi_rready;	\
		end																	\
		else begin : g_skip_``pname											\
			assign ifname``.s_axi_awaddr = 'x;								\
			assign ifname``.s_axi_awlen = 'x;								\
			assign ifname``.s_axi_awsize = 'x;								\
			assign ifname``.s_axi_awburst = 'x;								\
			assign ifname``.s_axi_awlock = 'x;								\
			assign ifname``.s_axi_awcache = 'x;								\
			assign ifname``.s_axi_awprot = 'x;								\
			assign ifname``.s_axi_awvalid = 'x;								\
			assign ifname``.s_axi_awready = 'x;								\
			assign ifname``.s_axi_wdata = 'x;								\
			assign ifname``.s_axi_wstrb = 'x;								\
			assign ifname``.s_axi_wlast = 'x;								\
			assign ifname``.s_axi_wvalid = 'x;								\
			assign ifname``.s_axi_wready = 'x;								\
			assign ifname``.s_axi_bresp = 'x;								\
			assign ifname``.s_axi_bvalid = 'x;								\
			assign ifname``.s_axi_bready = 'x;								\
			assign ifname``.s_axi_araddr = 'x;								\
			assign ifname``.s_axi_arlen = 'x;								\
			assign ifname``.s_axi_arsize = 'x;								\
			assign ifname``.s_axi_arburst = 'x;								\
			assign ifname``.s_axi_arlock = 'x;								\
			assign ifname``.s_axi_arcache = 'x;								\
			assign ifname``.s_axi_arprot = 'x;								\
			assign ifname``.s_axi_arvalid = 'x;								\
			assign ifname``.s_axi_arready = 'x;								\
			assign ifname``.s_axi_rdata = 'x;								\
			assign ifname``.s_axi_rresp = 'x;								\
			assign ifname``.s_axi_rlast = 'x;								\
			assign ifname``.s_axi_rvalid = 'x;								\
			assign ifname``.s_axi_rready = 'x;								\
		end

 

Всё бы хорошо и подмена через макрос вида: assign s_axi4[0].s_axi_awaddr = s_axi_0_s_axi_awaddr; выглядит логично (s_axi_awaddr - input).

Но что если сделать так: assign s_axi4[0].s_axi_awready = s_axi_0_s_axi_awready; тогда как s_axi_awready - output?

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


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

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

1 hour ago, Nick_K said:

Но что если сделать так: assign s_axi4[0].s_axi_awready = s_axi_0_s_axi_awready; тогда как s_axi_awready - output?

:biggrin:  

Quote

`define AXI4_SLAVE_IF_MAP(sel, pname, ifname)\
  if ((sel)) begin : g_map_``pname           \
  assign ifname``.awaddr = pname``_awaddr;   \
  ...
  assign pname``_awready = ifname``.awready; \
  end                                        \

Надо всего лишь быть внимательнее. :unknw:

Удачи! Rob.  

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


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

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

On 9/10/2019 at 3:22 AM, dxp said:

На симе (квеста же). На vopt. vlog проходит нормально, а на сборке vopt'ом выдаёт ошибку. 

Это может лечится  "vsim -suppress vsim-12003 ... " (ну или другой номер ошибки)

Удачи! Rob.

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


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

13 часов назад, RobFPGA сказал:

Это может лечится  "vsim -suppress vsim-12003 ... "

Чёт как-то костыльно, имхо, и неизвестно, что скажет на это синтез (проверять особенно не хочется).

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


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

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

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

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

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

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

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

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

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

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