sonycman 0 9 июля, 2017 Опубликовано 9 июля, 2017 · Жалоба Приветствую! Плис SoC Cyclone V, в QSys собрана HPS и несколько подключенных модулей, все на AvalonMM. Проблем не было. Но вот пробую добавить ещё один свой модуль, подключить надо к мосту FPGA-HPS теперь уже через AXI шину (надо тянуть AxCACHE и AxUSER линии). Нужно всего-то записывать около сотни байтов в память HPS. Написал простенький AXI мастер, подключил в QSys - всё нормально вроде бы, компилируется и синтезируется, но Квартус, собака, выкидывает после оптимизации почти весь код модуля! Как я понял, шерстить он начинает внутренности сгенерированного QSys интерконнекта (судя по логам), а затем выбрасывает и мой модуль, так как считает, что данные отправить мне уже никуда не получится... :( Если путём недолгих корректировок заменить AXI на Avalon - то всё остаётся на месте, ничего лишнего не "оптимизируется". Что же за чертовщина получается? Может, я что-то не то делаю, как правильно организовать обмен по AXI? Вот кусок кода с записью одного слова, простая машина состояний адрес->данные->ответ: always_ff @(posedge clk or negedge reset_n) begin if (!reset_n) begin axi_state <= 0; axm_awvalid <= 0; axm_wvalid <= 0; axm_bready <= 0; axm_awaddr <= 0; axm_wdata <= 0; start <= 0; end else begin if (avs_write) begin if (!avs_address) axm_awaddr <= avs_writedata; else begin axm_wdata <= avs_writedata; start <= 1'b1; end end case (axi_state) 2'd0: begin if (start) begin axm_awvalid <= 1'b1; start <= 0; axi_state <= 2'd1; end end 2'd1: begin if (axm_awready) begin axm_awvalid <= 0; axm_wvalid <= 1'b1; axi_state <= 2'd2; end end 2'd2: begin if (axm_wready) begin axm_wvalid <= 0; axm_bready <= 1'b1; axi_state <= 2'd3; end end 2'd3: begin if (axm_bvalid && axm_bid == axm_awid) begin axm_bready <= 0; axi_state <= 0; end end endcase end end Делал на основе этой диаграммы: Версия квартуса 16.0.1, попробую обновится на днях... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 10 июля, 2017 Опубликовано 10 июля, 2017 · Жалоба А почему Вас не устраивает использование Avalon-MM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 10 июля, 2017 Опубликовано 10 июля, 2017 · Жалоба А почему Вас не устраивает использование Avalon-MM? Хочу записывать данные сразу в кэш процессора, а для этого записывать их надо через ACP (Accelerator Coherency Port) порт. Этот порт требует установки линий AWCACHE и AWUSER, которых в Avalon-MM нет. Видел посты буржуев, что они всё равно работают в этом случае через Avalon, но путём правок сгенерированных файлов interconnect вставляют нужные AWCACHE и AWUSER. Но это чистое шаманство и необходимость править файлы на низком уровне после каждой генерации - глупость какая-то. Поэтому логично было бы вместо авалона (и обёртки Avalon -> AXI, которую генерирует QSys) использовать напрямую AXI. Вроде простая шина, но вот затык случился нехороший... Авалон очень удобно работает - присутствует только то направление, которое нужно - только запись, к примеру, или только чтение с минимумом сигналов. AXI вроде тоже имеет независимые каналы записи и чтения, но при создании модуля в QSys порт AXI требует наличия ВСЕХ сигналов, и для записи, и для чтения, не зависимо от того, используются ли они в коде. У меня чтение не используется, и я просто жёстко задал неактивные уровни для этого канала. Может быть это и является причиной, по которой синтезатор удаляет шину? И пофигу ему, что запись-то необходима! Может, стоит попробовать 17 версию квартуса? Хотя не думаю, что поможет, если честно... Нашёл косяк, с моей стороны, конечно. Ещё раз повнимательнее почитал условия транзакций, и понял, что нарушил парочку: the slave can wait for AWVALID or WVALID, or both before asserting AWREADY the slave can wait for AWVALID or WVALID, or both, before asserting WREADY Слишком много свободы и вариативности ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
g700 0 12 июля, 2017 Опубликовано 12 июля, 2017 · Жалоба Попробуйте воспользоваться synthesis noprune: http://quartushelp.altera.com/15.0/mergedP...dir_noprune.htm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 12 июля, 2017 Опубликовано 12 июля, 2017 · Жалоба Попробуйте воспользоваться synthesis noprune: http://quartushelp.altera.com/15.0/mergedP...dir_noprune.htm Спасибо, учту на будущее. Хотя в моём случае проблема была в том, что я поднимал awvalid и ждал, когда в ответ поднимется awready. А слэйв со стороны моста поднимает awready только тогда, когда будут активны и awvalid, и wvalid. Подправил код и все пошло... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Inanity 1 12 июля, 2017 Опубликовано 12 июля, 2017 (изменено) · Жалоба А слэйв со стороны моста поднимает awready только тогда, когда будут активны и awvalid, и wvalid. Подправил код и все пошло... Эх...сколько людей на эти грабли наступило и ещё наступит) Причём, совершенно непонятно зачем так было сделано. Вроде разные стримы, а зависимость есть. Если не забуду завтра выложу свою версию AXI4-Lite Master с "человеческим" интерфейсом с другой стороны. UPD: axi4lite_master.v Изменено 13 июля, 2017 пользователем Inanity Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Opex 0 14 июля, 2017 Опубликовано 14 июля, 2017 · Жалоба Эх...сколько людей на эти грабли наступило и ещё наступит) Причём, совершенно непонятно зачем так было сделано. Вроде разные стримы, а зависимость есть. Зависимости между каналами со стороны мастера как раз и не должно быть. А другая сторона уже решает, сделать простой прием с зависимыми каналами, или накрутить дополнительную логику и регистры для независимого приема. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Inanity 1 14 июля, 2017 Опубликовано 14 июля, 2017 · Жалоба Зависимости между каналами со стороны мастера как раз и не должно быть. А другая сторона уже решает, сделать простой прием с зависимыми каналами, или накрутить дополнительную логику и регистры для независимого приема. Мы с вами как-то по-разному понимаем независимость каналов. Есть электрическая печка. У неё есть ручка регулировки температуры и кнопка включения. Если проводить параллели, то получается, что я не могу сначала выставить температуру, а потом включить печку. Я должен одновременно и ручку крутить и кнопку нажимать, чтобы печка меня поняла. Мне кажется это не нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Opex 0 15 июля, 2017 Опубликовано 15 июля, 2017 · Жалоба Можете выставить температуру, потом включить печку, действия независимы. Одновременность не требуется. А выставить температуру, и ждать реакции от печки перед её включением - это и есть зависимость. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 21 июля, 2017 Опубликовано 21 июля, 2017 · Жалоба Интересно, а у Xilinx тоже, при создании модуля с шиной AXI, необходимо создавать абсолютно все сигналы для всех каналов? Например, если нужен только канал записи - сигналы канала чтения все равно требуется описывать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться