реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Модуль с шиной AXI Master, Квартус оптимизирует (выкидывает) код
sonycman
сообщение Jul 9 2017, 22:39
Сообщение #1


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



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

Плис SoC Cyclone V, в QSys собрана HPS и несколько подключенных модулей, все на AvalonMM.
Проблем не было.

Но вот пробую добавить ещё один свой модуль, подключить надо к мосту FPGA-HPS теперь уже через AXI шину (надо тянуть AxCACHE и AxUSER линии).

Нужно всего-то записывать около сотни байтов в память HPS.
Написал простенький AXI мастер, подключил в QSys - всё нормально вроде бы, компилируется и синтезируется, но Квартус, собака, выкидывает после оптимизации почти весь код модуля!

Как я понял, шерстить он начинает внутренности сгенерированного QSys интерконнекта (судя по логам), а затем выбрасывает и мой модуль, так как считает, что данные отправить мне уже никуда не получится... sad.gif

Если путём недолгих корректировок заменить 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, попробую обновится на днях...
Go to the top of the page
 
+Quote Post
des333
сообщение Jul 10 2017, 05:08
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



А почему Вас не устраивает использование Avalon-MM?


--------------------
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 10 2017, 09:54
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(des333 @ Jul 10 2017, 09:08) *
А почему Вас не устраивает использование 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

Слишком много свободы и вариативности wink.gif
Go to the top of the page
 
+Quote Post
g700
сообщение Jul 12 2017, 19:27
Сообщение #4





Группа: Участник
Сообщений: 14
Регистрация: 22-06-17
Из: Санкт-Петербург
Пользователь №: 97 789



Попробуйте воспользоваться synthesis noprune:
http://quartushelp.altera.com/15.0/mergedP...dir_noprune.htm
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 12 2017, 19:55
Сообщение #5


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(g700 @ Jul 12 2017, 23:27) *
Попробуйте воспользоваться synthesis noprune:
http://quartushelp.altera.com/15.0/mergedP...dir_noprune.htm

Спасибо, учту на будущее.

Хотя в моём случае проблема была в том, что я поднимал awvalid и ждал, когда в ответ поднимется awready.
А слэйв со стороны моста поднимает awready только тогда, когда будут активны и awvalid, и wvalid.
Подправил код и все пошло...
Go to the top of the page
 
+Quote Post
Inanity
сообщение Jul 12 2017, 22:35
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 221
Регистрация: 6-07-12
Пользователь №: 72 653



Цитата(sonycman @ Jul 12 2017, 22:55) *
А слэйв со стороны моста поднимает awready только тогда, когда будут активны и awvalid, и wvalid.
Подправил код и все пошло...


Эх...сколько людей на эти грабли наступило и ещё наступит)
Причём, совершенно непонятно зачем так было сделано. Вроде разные стримы, а зависимость есть. Если не забуду завтра выложу свою версию AXI4-Lite Master с "человеческим" интерфейсом с другой стороны.

UPD:
Прикрепленный файл  axi4lite_master.v ( 7.79 килобайт ) Кол-во скачиваний: 97


Сообщение отредактировал Inanity - Jul 13 2017, 11:57
Go to the top of the page
 
+Quote Post
Opex
сообщение Jul 14 2017, 08:14
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 13-03-11
Из: Екатеринбург
Пользователь №: 63 574



Цитата(Inanity @ Jul 13 2017, 03:35) *
Эх...сколько людей на эти грабли наступило и ещё наступит)
Причём, совершенно непонятно зачем так было сделано. Вроде разные стримы, а зависимость есть.


Зависимости между каналами со стороны мастера как раз и не должно быть.
А другая сторона уже решает, сделать простой прием с зависимыми каналами, или накрутить дополнительную логику и регистры для независимого приема.
Go to the top of the page
 
+Quote Post
Inanity
сообщение Jul 14 2017, 11:56
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 221
Регистрация: 6-07-12
Пользователь №: 72 653



Цитата(Opex @ Jul 14 2017, 11:14) *
Зависимости между каналами со стороны мастера как раз и не должно быть.
А другая сторона уже решает, сделать простой прием с зависимыми каналами, или накрутить дополнительную логику и регистры для независимого приема.


Мы с вами как-то по-разному понимаем независимость каналов.

Есть электрическая печка. У неё есть ручка регулировки температуры и кнопка включения. Если проводить параллели, то получается, что я не могу сначала выставить температуру, а потом включить печку. Я должен одновременно и ручку крутить и кнопку нажимать, чтобы печка меня поняла. Мне кажется это не нормально.
Go to the top of the page
 
+Quote Post
Opex
сообщение Jul 15 2017, 15:25
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 13-03-11
Из: Екатеринбург
Пользователь №: 63 574



Можете выставить температуру, потом включить печку, действия независимы. Одновременность не требуется.
А выставить температуру, и ждать реакции от печки перед её включением - это и есть зависимость.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 21 2017, 05:28
Сообщение #10


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Интересно, а у Xilinx тоже, при создании модуля с шиной AXI, необходимо создавать абсолютно все сигналы для всех каналов?

Например, если нужен только канал записи - сигналы канала чтения все равно требуется описывать?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 13:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01518 секунд с 7
ELECTRONIX ©2004-2016