Jump to content

    

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

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

2 hours ago, dxp said:

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

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

Удачи! Rob.

Share this post


Link to post
Share on other sites

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

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

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
Sign in to follow this