Jump to content

    
Sign in to follow this  
Nick_K

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

Recommended Posts

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

2 hours ago, dxp said:

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

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

Удачи! Rob.

Share this post


Link to post
Share on other sites
17 hours ago, dxp said:

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

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

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

Share this post


Link to post
Share on other sites
5 часов назад, des00 сказал:

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

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

Share this post


Link to post
Share on other sites
1 hour ago, dxp said:

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

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

Share this post


Link to post
Share on other sites
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). Вроде как всё сделал, как подсказали и проект собирается как положено, но Цинк упорно не хочет читать с этих интерфейсов...

Share this post


Link to post
Share on other sites

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

1 hour ago, Nick_K said:

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

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

Удачи! Rob.

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
Share on other sites

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

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.  

Share this post


Link to post
Share on other sites

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

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

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

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

Удачи! Rob.

Share this post


Link to post
Share on other sites
13 часов назад, RobFPGA сказал:

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

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

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