alexadmin 0 23 сентября, 2022 Опубликовано 23 сентября, 2022 · Жалоба Линк запустился не на полной скорости (или это я с эзернетом путаю?) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 31 23 сентября, 2022 Опубликовано 23 сентября, 2022 · Жалоба 27 minutes ago, dde29 said: сконфигурировав IP-блок UltraScale FPGA Gen3 Integrated Block for PCI Express, я должен был получить user_clock частотой 250 МГц, согласно настройкам корки... Вывед данный клок наружу ПЛИС - осциллом наблюдаю 25 Мгц (да, я не гоню, ноликом не ошибься ). Как можно это объяснить? Никак, кроме глюков измерения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 23 сентября, 2022 Опубликовано 23 сентября, 2022 (изменено) · Жалоба через map из user_space проблем не должно быть. Испытано годами уже, правда не xilinx. Посмотрел суть теста, вы там пишите и читаете по 1,2,4 байта, не понятно тогда из ваших слов, 0 при повторном обращении читается при том же доступе? (например постоянно читаете 4 байта из одного адреса или чередуете 4-2 байта). Изменено 23 сентября, 2022 пользователем new123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dde29 0 24 сентября, 2022 Опубликовано 24 сентября, 2022 · Жалоба On 9/23/2022 at 7:28 PM, RobFPGA said: Никак, кроме глюков измерения. Я понимаю, что могло быть искажение из-за дискретизации, но глюков измерения тут скорее всего нет, но я еще поковыряюсь конечно, так как это нельзя полностью исключать. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alxkon 0 27 сентября, 2022 Опубликовано 27 сентября, 2022 (изменено) · Жалоба 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 дизайне, не с особенностью линукса Изменено 27 сентября, 2022 пользователем alxkon Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dde29 0 29 сентября, 2022 Опубликовано 29 сентября, 2022 (изменено) · Жалоба 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 Изменено 29 сентября, 2022 пользователем dde29 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 2 октября, 2022 Опубликовано 2 октября, 2022 · Жалоба On 9/29/2022 at 9:11 AM, dde29 said: Поэтому корка выдавала user_clk частотой 25 МГц вне зависимости от настроек лэйнов и частот в визарде корки В реальности оно кстати работает на 125 или 250 МГц действительно независимо от скорости дорожек и даже разрядности. Например, собрали корку на Gen3 x8, так оно и при Gen1 x1 будет давать всё те же бит и мегагерц, просто часто рэди будет пропадать. Я полагаюсь на эту особенность, вроде не подводит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dde29 0 6 октября, 2022 Опубликовано 6 октября, 2022 · Жалоба При генерации IP корки для PCIe установил галочку "JTAG Debaging", чтобы была возможность отладки. Сгенерировались скрипты на TCL, но в скриптах в самом начале подключаются нужные пакеты: package require Tcl 8.5 package require Tk Так вот первая строка успешно выполняется вот Tk вивадо не видит... В чем может быть проблема. Как выбрать версию интерпретатора TCL, так как в установочных каталогах версии разные имеются... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dde29 0 26 октября, 2022 Опубликовано 26 октября, 2022 · Жалоба Всем привет! Продолжаю разбираться в корке 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 26 октября, 2022 Опубликовано 26 октября, 2022 · Жалоба проблема какая? пишите в map и не видно новых значений в плис? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dde29 0 26 октября, 2022 Опубликовано 26 октября, 2022 · Жалоба On 10/26/2022 at 9:33 PM, new123 said: проблема какая? пишите в map и не видно новых значений в плис? Именно так! Пишем в map и я на интерфейсе CQ не вижу никаких шевелений, цепляясь триггером на valid или last Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 26 октября, 2022 Опубликовано 26 октября, 2022 · Жалоба Мне сейчас не с руки открывать виваду, но раз пока никто не написал, позволю дать совет. Если задача выловить новые значения на плис, упростите для начала задачу. Зацепите на нужный акси корку gpio, настройте ее на заданное смещение, кратное 4 или 16. И со стороны map пишите в это смещение. Gpio автоматом должен обновиться, без всяких своих транзакций Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 31 26 октября, 2022 Опубликовано 26 октября, 2022 · Жалоба Для того чтобы транзакции шли нужно для начала убедится что: линк поднялся, система увидела и сконфигурировала BARы, разрешены соответствующие транзакции (IO, MEM, Master) в регистре command PCIe корки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dde29 0 27 октября, 2022 Опубликовано 27 октября, 2022 · Жалоба 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)". А вот это надо глянуть... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 27 октября, 2022 Опубликовано 27 октября, 2022 · Жалоба Ну раз вы уверены, что транзакций не было, тогда можно мой совет про xilinx api gpio опустить. Я честно говоря, думал, что у вас уже давно драйвер написан, у меня сложилось такое мнение по ветке темы. Тогда наверное стоит накатать драйвер, хотя бы ту часть, которая конфигурирует pcie драйвер с устройством, там как раз конфигурируются и BAR. Я сам даже не пробовал без драйвера замапиться на resource0, не знаю какое будет поведение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться