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

Линк запустился не на полной скорости (или это я с эзернетом путаю?)

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


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

27 minutes ago, dde29 said:

сконфигурировав IP-блок UltraScale FPGA Gen3 Integrated Block for PCI Express, я должен был получить user_clock частотой 250 МГц, согласно настройкам корки... Вывед данный клок наружу ПЛИС - осциллом наблюдаю 25 Мгц (да, я не гоню, ноликом не ошибься :acute: ). Как можно это объяснить?

Никак, кроме глюков измерения.  

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


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

через map из user_space проблем не должно быть. Испытано годами уже, правда не xilinx. 

Посмотрел суть теста, вы там пишите и читаете по 1,2,4 байта, не понятно тогда из ваших слов, 0 при повторном обращении читается при том же доступе? (например постоянно читаете 4 байта из одного адреса или чередуете 4-2 байта).

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

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


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

On 9/23/2022 at 7:28 PM, RobFPGA said:

Никак, кроме глюков измерения.  

Я понимаю, что могло быть искажение из-за дискретизации, но глюков измерения тут скорее всего нет, но я еще поковыряюсь конечно, так как это нельзя полностью исключать. Спасибо!

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


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

On 9/22/2022 at 12:55 PM, alxkon said:

Подскажите пожалуйста по следующей проблеме:

 Использую XDMA на Kintex девките. Девкит в свою очередь подключен к Jetson TX2 девкиту. Создал простой AXI4 Lite Slave на 4 регистра. Slave прошел через SV AXI4 BFM тест, использвал готовый который генерит Vivado. Подключен он к 32бит BAR 0, выделен 1МБ.

Работаю с Ubuntu, использовал софт по моему автора туториала по XDMA . Получается запись и чтение регистров ведется из user space, а не из ядра линукса. Могут ли быть какие то проблемы с этим? Получается только 1 раз записать и считать определенное значение, далее чтение показывает 0.

sudo ./pcie_test /sys/bus/pci/devices/0000\:01\:00.0/resource0 0x00000000 w 0xDEADAB

Пока разбираюсь с System ILA, посмотреть что реально просходит на шине. Железо на несколько дней недоступно, хотелось бы понять есть ли риск в том что чтение/запись в регистры из user space на самом деле не работает всегда корректно?

 


#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <fcntl.h>
#include <ctype.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <linux/pci.h>


#define PRINT_ERROR \
    do { \
        fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \
        __LINE__, __FILE__, errno, strerror(errno)); exit(1); \
    } while(0)

#define MAP_SIZE 4096UL
#define MAP_MASK (MAP_SIZE - 1)

int main(int argc, char **argv) {
    int fd; 
    void *map_base, *virt_addr;
    uint32_t read_result, writeval;
    char *filename;
    off_t target;
    int access_type = 'w';

    if(argc < 3) {
        // pcimem /sys/bus/pci/devices/0001\:00\:07.0/resource0 0x100 w 0x00
        // argv[0]  [1]                                         [2]   [3] [4]
        fprintf(stderr, "\nUsage:\t%s { sys file } { offset } [ type [ data ] ]\n"
                "\tsys file: sysfs file for the pci resource to act on\n"
                "\toffset  : offset into pci memory region to act upon\n"
                "\ttype    : access operation type : [b]yte, [h]alfword, [w]ord\n"
                "\tdata    : data to be written\n\n",
                argv[0]);
        exit(1);
    }   
    filename = argv[1];
    target = strtoul(argv[2], 0, 0); 

    if(argc > 3)
        access_type = tolower(argv[3][0]);

    if((fd = open(filename, O_RDWR | O_SYNC)) == -1){
        PRINT_ERROR;
    }
    printf("%s opened.\n", filename);
    printf("Target offset is 0x%x, page size is %ld map mask is 0x%lX\n", (int) target, sysconf(_SC_PAGE_SIZE), MAP_MASK);
    fflush(stdout);

    /* Map one page */
#if 0
    //map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (off_t) (target & ~MAP_MASK));
    //map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
#endif
    printf("mmap(%d, %ld, 0x%x, 0x%x, %d, 0x%x)\n", 0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (int) (target & ~MAP_MASK));
    map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (target & ~MAP_MASK));
    if(map_base == (void *) -1){
       printf("PCI Memory mapped ERROR.\n");
        PRINT_ERROR;
        close(fd);
        return 1;
    }

    printf("mmap(%d, %ld, 0x%x, 0x%x, %d, 0x%x)\n", 0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (int) (target & ~MAP_MASK));
    printf("PCI Memory mapped %ld byte region to map_base 0x%08lx.\n", MAP_SIZE, (unsigned long) map_base);
    fflush(stdout);

    virt_addr = map_base + (target & MAP_MASK);
    printf("PCI Memory mapped access 0x %08X.\n", (uint32_t ) virt_addr);
   switch(access_type) {
        case 'b':
                read_result = *((uint8_t *) virt_addr);
                break;  
        case 'h':
                read_result = *((uint16_t *) virt_addr);
                break;  
        case 'w':
                read_result = *((uint32_t *) virt_addr);
                        printf("READ Value at offset 0x%X (%p): 0x%X\n", (int) target, virt_addr, read_result);
                break;
        default:
                fprintf(stderr, "Illegal data type '%c'.\n", access_type);
                exit(2);
    }
    fflush(stdout);

    if(argc > 4) {
        writeval = strtoul(argv[4], 0, 0);
        switch(access_type) {
                case 'b':
                        *((uint8_t *) virt_addr) = writeval;
                        read_result = *((uint8_t *) virt_addr);
                        break;
                case 'h':
                        *((uint16_t *) virt_addr) = writeval;
                        read_result = *((uint16_t *) virt_addr);
                        break;
                case 'w':
                        *((uint32_t *) virt_addr) = writeval;
                        read_result = *((uint32_t *) virt_addr);
                        break;
        }
        printf("Written 0x%X; readback 0x%X\n", writeval, read_result);
        fflush(stdout);
    }

    if(munmap(map_base, MAP_SIZE) == -1) { PRINT_ERROR;}
    close(fd);
    return 0;
}

 

 

Отвечу сам себе - глюки связаны с кривизной в rtl дизайне, не с особенностью линукса

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

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


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

On 9/23/2022 at 7:15 PM, alexadmin said:

Линк запустился не на полной скорости (или это я с эзернетом путаю?)

 

 

On 9/23/2022 at 7:15 PM, alexadmin said:

Линк запустился не на полной скорости (или это я с эзернетом путаю?)

Разобрался с проблемой. Проблема, естесно, не в измерениях):

Я пользовался платой KCU105 к которой в нагрузку идет плата PCIe LoopBack в которой сигнал начального сброса PERST просто никуда не подцеплен!
И по факту, подтянутая к земле, эта линия держала корку PCI в сброшенном состоянии - соотетственно ГУН ПЛЛ находился в крайнем положении.
Поэтому корка выдавала user_clk частотой 25 МГц вне зависимости от настроек лэйнов и частот в визарде корки.

Поэтому, пришлось в визарде на вкладке Basic изменить System reset polarity в значение ACTIVE_HIGH.
Но! Когда плату планируется вставлять в слот ПК (а не в этот недоделанный LoopBack), то данное значение необходимо вернуть в ACTIVE_LOW

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

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


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

On 9/29/2022 at 9:11 AM, dde29 said:

Поэтому корка выдавала user_clk частотой 25 МГц вне зависимости от настроек лэйнов и частот в визарде корки

В реальности оно кстати работает на 125 или 250 МГц действительно независимо от скорости дорожек и даже разрядности. Например, собрали корку на Gen3 x8, так оно и при Gen1 x1 будет давать всё те же бит и мегагерц, просто часто рэди будет пропадать. Я полагаюсь на эту особенность, вроде не подводит.

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


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

При генерации IP корки для PCIe установил галочку "JTAG Debaging", чтобы была возможность отладки.

Сгенерировались скрипты на TCL, но в скриптах в самом начале подключаются нужные пакеты:

package require Tcl 8.5
package require Tk

Так вот первая строка успешно выполняется вот Tk вивадо не видит... В чем может быть проблема. Как выбрать версию интерпретатора TCL, так как в установочных каталогах версии разные имеются...

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


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

Всем привет!
Продолжаю разбираться в корке pcie3_ultrascale_0 в Vivado2018.1
Пытаюсь зафиксировать транзакции между Хостом и Таргетом, наблюдая за сигналами в ПЛИС через JTAG.
В Вивадо имеется полезная функция Open IP Example Design. 
Т.е. имеется возможность сгенерировать полностью заведомо рабочий (по крайней мере задумано так) проект с настроенной мной IP-коркой pcie3_ultrascale_0.
Таким образом, создается проект где можно и записать в регистры ПЛИС и считать.
Проделав все вышеописанное, при записи в БАР никаких транзакция не наблюдаю. Вообще никакого шевеления...
Любая транзация, не важно запись/чтение memory или запись/чтения I/O производится через интерфейс Completer Request (CQ) протокола AXI4-Stream.
Через следующие сигналы:

wire [63 : 0] m_axis_cq_tdata;
wire [1 : 0] m_axis_cq_tkeep;
wire m_axis_cq_tlast;
wire m_axis_cq_tready;
wire [84 : 0] m_axis_cq_tuser;
wire m_axis_cq_tvalid;

Может местные эксперты по PCIe на Xilinx посмотрят на настройки корки, вдруг где-то заветную галочку не установил... (скрины корки прикрепил в ПДФ)
Также прикрепляю архив сгенерированного проекта: pcie3_ultrascale_0_ex_1.xpr.zip

P.S. Дополнительная информация:
ОС Линукс, убунту
Попытка чтения/записи в БАРы осуществляется без какого-либо собственного драйвера через отмапенную виртуальную память
ПЛИС UltraScale
Есть использовать корку AXI Bridge for PCI Express Gen3 Subsystem, но там интерфейс с еще большим количеством сигналов, а я про эту то корку начитался...

P.P.S: Любые подсказки и нецензурная брань приветствуются!)
 

Настроки корки.pdf

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


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

On 10/26/2022 at 9:33 PM, new123 said:

проблема какая? пишите в map и не видно новых значений в плис?

Именно так! Пишем в map и я на интерфейсе CQ не вижу никаких шевелений, цепляясь триггером на valid или last

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


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

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

Если задача выловить новые значения на плис, упростите для начала задачу. Зацепите на нужный акси корку gpio, настройте ее на заданное смещение, кратное 4 или 16. И со стороны map пишите в это смещение. Gpio автоматом должен обновиться, без всяких своих транзакций

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


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

Для того чтобы транзакции  шли нужно для начала убедится что: 
линк поднялся, 
система увидела и сконфигурировала BARы, 
разрешены соответствующие транзакции (IO, MEM, Master) в регистре command  PCIe корки.   

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


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

On 10/26/2022 at 11:59 PM, new123 said:

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

Если задача выловить новые значения на плис, упростите для начала задачу. Зацепите на нужный акси корку gpio, настройте ее на заданное смещение, кратное 4 или 16. И со стороны map пишите в это смещение. Gpio автоматом должен обновиться, без всяких своих транзакций

Какую конкретно ip-корку вы имеете в виду под "корка gpio"?

В этом проекте имется память. JTAGом я смотрел числе и сигналы память - при операции чтения/запись шевеления на сигналах памяти не было, соответственно делаю вывод, что память не читается и не записывается...

И еще: как понять фразу " Gpio автоматом должен обновиться, без всяких своих транзакций"? Ведь, если не было никаких транзакция, то ничего и не должно поменяться, или я что-то не понимаю?

On 10/27/2022 at 2:36 AM, RobFPGA said:

Для того чтобы транзакции  шли нужно для начала убедится что: 
линк поднялся, 
система увидела и сконфигурировала BARы, 
разрешены соответствующие транзакции (IO, MEM, Master) в регистре command  PCIe корки.   

1. Линк поднялся, так как через lspci мое устройство отображается с некоторыми параметрами. С какими конкретно, если нужно, могу позже написать сюда...

2. Так же отображаются адреса BARов и их размер, можно сделать вывод, что система их сконфигурировала?

3. "разрешены соответствующие транзакции (IO, MEM, Master)". А вот это надо глянуть...

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


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

Ну раз вы уверены, что транзакций не было, тогда можно мой совет про xilinx api gpio опустить. 

Я честно говоря, думал, что у вас уже давно драйвер написан, у меня сложилось такое мнение по ветке темы. Тогда наверное стоит накатать драйвер, хотя бы ту часть, которая конфигурирует pcie драйвер с устройством, там как раз конфигурируются и BAR. 
Я сам даже не пробовал без драйвера замапиться на resource0, не знаю какое будет поведение.

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


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

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

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

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

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

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

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

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

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

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