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

Virtex 7 pcie

Здравствуйте!

Используется отладочная плата с ПЛИС 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) После передачи ядру запрошенных данных ПЛИС дает команду прерывания на ядро.

 

Счетчик отправляется непосредственно из ПЛИС в ПК:

post-65614-1397017161_thumb.png

 

Получаю на выходе прерывание, а данные в памяти ПК не перезаписываются, то есть вместо ожидаемой "пилы" в памяти лежат нули записываемые туда при инициализации драйвером.

post-65614-1397017472_thumb.png

 

В модели корки показан режим работы IO, но используется интерфейс axis_cq/cc.

 

Проблема может быть в заголовке TLP s_axis_rq? Есть ли примеры работы с интерфейсом s_axis_rq*?

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

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


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

Вот код формирования посылокк на ядро 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

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

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


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

Форумчане, помогите :laughing:. Проблема обрела новую сторону. Изучил pg023. Открыл для себя "чудесный мир" интерфейсов этого ядра.

Анализируя статус ошибок в chipscope из "Devise status register" выявил особенность.

На шине регистрируется ошибка "fatal error". Согласно pg023 это может быть вызвано несоответствием длины передаваемых данных (полезной нагрузки) на шине pcie и в дескрипторе (заголовке tlp пакета). А также неправильным видом запроса.

 

Подскажите в каком направлении копать? И интересно почему после выявлении ошибки система перестает регистрировать прерывания, а ядро pcie их якобы выдает по команде (msi_sent ='1').

 

Используемый драйвер, программа тестирования успешно использовался с отладочной платой virtex 6. Но там и ядро было без AXI).

 

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


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

Проблема решена. :bb-offtopic: при передаче адреса в эвм необходимо отбрасывать два младших бита.

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


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

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...