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

Модуль с шиной AXI Master

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

 

Плис 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

Делал на основе этой диаграммы:

post-19695-1499640407_thumb.png

 

Версия квартуса 16.0.1, попробую обновится на днях...

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


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

А почему Вас не устраивает использование 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

Слишком много свободы и вариативности ;)

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


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

Попробуйте воспользоваться synthesis noprune:

http://quartushelp.altera.com/15.0/mergedP...dir_noprune.htm

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


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

Попробуйте воспользоваться synthesis noprune:

http://quartushelp.altera.com/15.0/mergedP...dir_noprune.htm

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

 

Хотя в моём случае проблема была в том, что я поднимал awvalid и ждал, когда в ответ поднимется awready.

А слэйв со стороны моста поднимает awready только тогда, когда будут активны и awvalid, и wvalid.

Подправил код и все пошло...

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


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

А слэйв со стороны моста поднимает awready только тогда, когда будут активны и awvalid, и wvalid.

Подправил код и все пошло...

 

Эх...сколько людей на эти грабли наступило и ещё наступит)

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

 

UPD:

axi4lite_master.v

Изменено пользователем Inanity

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


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

Эх...сколько людей на эти грабли наступило и ещё наступит)

Причём, совершенно непонятно зачем так было сделано. Вроде разные стримы, а зависимость есть.

 

Зависимости между каналами со стороны мастера как раз и не должно быть.

А другая сторона уже решает, сделать простой прием с зависимыми каналами, или накрутить дополнительную логику и регистры для независимого приема.

 

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


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

Зависимости между каналами со стороны мастера как раз и не должно быть.

А другая сторона уже решает, сделать простой прием с зависимыми каналами, или накрутить дополнительную логику и регистры для независимого приема.

 

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

 

Есть электрическая печка. У неё есть ручка регулировки температуры и кнопка включения. Если проводить параллели, то получается, что я не могу сначала выставить температуру, а потом включить печку. Я должен одновременно и ручку крутить и кнопку нажимать, чтобы печка меня поняла. Мне кажется это не нормально.

 

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


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

Можете выставить температуру, потом включить печку, действия независимы. Одновременность не требуется.

А выставить температуру, и ждать реакции от печки перед её включением - это и есть зависимость.

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


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

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

 

Например, если нужен только канал записи - сигналы канала чтения все равно требуется описывать?

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


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

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

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

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

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

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

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

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

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

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