ArtoM23 0 9 апреля, 2014 Опубликовано 9 апреля, 2014 (изменено) · Жалоба Здравствуйте! Используется отладочная плата с ПЛИС xc7vx415t-2ffg1927. Сгенерил корку pcie virtex7 1.6. Ise 14.6. Параметры корки: - pcie gen 2. 5Gb/s - axi data 256 bit - clk 125 mhz - data word aligned Доступ/чтение BAR осуществляется без проблем. В ПЛИС организован DMA. Перекачка идет в тестовом режиме 1 пакета 128 байт. Затем после перекачки ПЛИС генрит прерывание MSI. Логика работы следующая: 1) ПК пишет в BAR начальный адрес оперативной памяти куда попадут данные из ПЛИС, длину запрашиваемых данных в TLP пакетах. Дает команду "СТАРТ". 2) ПЛИС передает данные. На ядро идут команды s_axis_rq*. 3) После передачи ядру запрошенных данных ПЛИС дает команду прерывания на ядро. Счетчик отправляется непосредственно из ПЛИС в ПК: Получаю на выходе прерывание, а данные в памяти ПК не перезаписываются, то есть вместо ожидаемой "пилы" в памяти лежат нули записываемые туда при инициализации драйвером. В модели корки показан режим работы IO, но используется интерфейс axis_cq/cc. Проблема может быть в заголовке TLP s_axis_rq? Есть ли примеры работы с интерфейсом s_axis_rq*? Изменено 9 апреля, 2014 пользователем ArtoM Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ArtoM23 0 9 апреля, 2014 Опубликовано 9 апреля, 2014 (изменено) · Жалоба Вот код формирования посылокк на ядро pcie s_axis_rq*. PIO_TX_DMA_START_DESC : begin // Запись в память ЭВМ (host cpu) дескриптора с начальным адрессом памяти для DMA s_axis_rq_tvalid <= #TCQ 1'b1; s_axis_rq_tlast <= #TCQ 1'b0; s_axis_rq_tkeep <= #TCQ 8'hFF; // 4DW Descriptor and DW Payload For Memory Transaction s_axis_rq_tdata <= #TCQ {DATA_TLP_IN[223:96], // 4DW Payload 1'b0, // Force ECRC 3'b000, // Attributes 3'b000, // Traffic Class 1'b0, // RID Enable to use the Client supplied Bus/Device/Func No 16'b0, // Completer -ID, set only for Completers or ID based routing (AXISTEN_IF_ENABLE_CLIENT_TAG ? 8'h00 : req_tag), // Select Client Tag or core's internal tag 8'h00, // Req Bus No- used only when RID enable = 1 8'h00, // Req Dev/Func no - used only when RID enable = 1 1'b0, // Poisoned Req 4'b0011, // Req Type for MRd Req 11'h20, // DWORD Count 30'h0000_0000, DATA_TLP_IN[255:224],// Memory Write cpu Address [62 bits] 2'b10}; //AT -> 00- Untranslated Address 10-> Translated Address s_axis_rq_tuser <= #TCQ {(AXISTEN_IF_RQ_PARITY_CHECK ? s_axis_rq_tparity : 32'b0), // Parity 4'b1010, // Seq Number 8'h00, // TPH Steering Tag 1'b0, // TPH indirect Tag Enable 2'b0, // TPH Type 1'b0, // TPH Present 1'b0, // Discontinue 3'b000, // Byte Lane number in case of Address Aligned mode 4'hF, // Last BE of the Read Data 4'hF}; // First BE of the Read Data if(s_axis_rq_tready) begin state <= #TCQ PIO_TX_DMA_START_DW; trn_sent <= #TCQ 1'b1; cnt_tx_to_pci <= cnt_tx_to_pci +4; end else state <= #TCQ PIO_TX_DMA_START_DESC; end // PIO_TX_DMA_START_DESC PIO_TX_DMA_START_DW : begin // Запись в память ЭВМ (host cpu) полезной информации из FIFO s_axis_rq_tvalid <= #TCQ 1'b1; s_axis_rq_tlast <= #TCQ 1'b0; s_axis_rq_tkeep <= #TCQ 8'hFF; // 4DW Descriptor and DW Payload For Memory Transaction s_axis_rq_tdata <= #TCQ DATA_TLP_IN; // 4DW Payload s_axis_rq_tuser <= #TCQ {(AXISTEN_IF_RQ_PARITY_CHECK ? s_axis_rq_tparity : 32'b0), // Parity 4'b1010, // Seq Number 8'h00, // TPH Steering Tag 1'b0, // TPH indirect Tag Enable 2'b0, // TPH Type 1'b0, // TPH Present 1'b0, // Discontinue 3'b000, // Byte Lane number in case of Address Aligned mode 4'hF, // Last BE of the Read Data 4'hF}; // First BE of the Read Data if(s_axis_rq_tready) if(cnt_tx_to_pci < 20) begin cnt_tx_to_pci <= cnt_tx_to_pci +8; // на шине 8DW state <= #TCQ PIO_TX_DMA_START_DW; trn_sent <= #TCQ 1'b1; end else begin state <= #TCQ PIO_TX_DMA_START_DW_END; trn_sent <= #TCQ 1'b1; end else state <= #TCQ PIO_TX_DMA_START_DW; end // PIO_TX_DMA_START_DW PIO_TX_DMA_START_DW_END: begin // завершаем передачу данных в ЭВМ для записи в память s_axis_rq_tvalid <= #TCQ 1'b1; s_axis_rq_tlast <= #TCQ 1'b1; s_axis_rq_tkeep <= #TCQ 8'hF0; // 4DW Descriptor and DW Payload For Memory Transaction s_axis_rq_tdata <= #TCQ DATA_TLP_IN; // 4DW Payload s_axis_rq_tuser <= #TCQ {(AXISTEN_IF_RQ_PARITY_CHECK ? s_axis_rq_tparity : 32'b0), // Parity 4'b0000, // Seq Number 8'h00, // TPH Steering Tag 1'b0, // TPH indirect Tag Enable 2'b0, // TPH Type 1'b0, // TPH Present 1'b0, // Discontinue 3'b000, // Byte Lane number in case of Address Aligned mode 4'hF, // Last BE of the Read Data 4'hF}; // First BE of the Read Data if(s_axis_rq_tready) begin state <= #TCQ PIO_TX_RST_STATE; trn_sent <= #TCQ 1'b1; end else state <= #TCQ PIO_TX_DMA_START_DW_END; end // PIO_TX_DMA_START_DW Изменено 9 апреля, 2014 пользователем ArtoM Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ArtoM23 0 18 апреля, 2014 Опубликовано 18 апреля, 2014 · Жалоба Форумчане, помогите :laughing:. Проблема обрела новую сторону. Изучил pg023. Открыл для себя "чудесный мир" интерфейсов этого ядра. Анализируя статус ошибок в chipscope из "Devise status register" выявил особенность. На шине регистрируется ошибка "fatal error". Согласно pg023 это может быть вызвано несоответствием длины передаваемых данных (полезной нагрузки) на шине pcie и в дескрипторе (заголовке tlp пакета). А также неправильным видом запроса. Подскажите в каком направлении копать? И интересно почему после выявлении ошибки система перестает регистрировать прерывания, а ядро pcie их якобы выдает по команде (msi_sent ='1'). Используемый драйвер, программа тестирования успешно использовался с отладочной платой virtex 6. Но там и ядро было без AXI). Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ArtoM23 0 29 апреля, 2014 Опубликовано 29 апреля, 2014 · Жалоба Проблема решена. :bb-offtopic: при передаче адреса в эвм необходимо отбрасывать два младших бита. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться