Lutovid 1 20 марта, 2018 Опубликовано 20 марта, 2018 · Жалоба Здравствуйте! Появилась такая задача: Есть прошивка, которая может быть сгенерирована либо для кристалла малого объема, либо для большого(серия одна). Есть один elf файл sdk, который может быть запущен на двух разных кристаллах. Нужно софтом определить какой это кристал. Есть идея дописать tcl скрипт, который в процессе генерации битпотока будет в регистр ядра part_checker прописывать парт номер, а микроблейзом по этому регистру читать(цель в автоматизации процесса - если руками каждый раз прописывать в этот регистрб то можно и забыть). Но наиболее удобным было бы вычитать его непосредственно какими-то стандартными методами - считывается же как-то этот парт номер при подключении программатора. Пробовал использовать DNA, но как я понял этот идентификационный номер не содержит информации о партномере. Конечная цель, которой хотелось бы добиться: Выбираешь в настройках проекта кристалл -> запускаешь генерацию битпотока -> экспортируешь в SDK -> Заливаешь в плис -> спрашиваешь что за кристалл, софт отвечает Меняешь в настройках кристалл на другой, проделываешь те же действия, получаешь ответ от плисины, что кристалл другой. Ко всему прочему хотелось бы, что бы сохранилась функциональность кнопок в ГУЕ(запуск синтеза и имплементации). У меня есть вариант как все сделать скриптами, но в этом случае пропадет возможность использовать полноценно ГУЙ. Я написал вот такой скрипт: (Есть system_Part_number_0.v который представляет собой просто блок сидящий на акси и содержащий всего 1 регистр с партномером) set proj_name [current_project] set proj_dir [get_property directory $proj_name] set verilog_filename "$proj_dir/$proj_name.srcs/sources_1/bd/system/ip/system_Part_number_0/synth/system_Part_number_0.v" set verilog_filename_orig "$verilog_filename.orig" set part_var [get_property PART [current_project ]] set part_325 xc7k325tffg676-2 puts "Path:" puts $verilog_filename if {[file exists $verilog_filename]} { file rename -force $verilog_filename $verilog_filename_orig set fp_w [open $verilog_filename w] set fp_r [open $verilog_filename_orig r] set file_data [read $fp_r] set file_lines [split $file_data "\n"] foreach line $file_lines { if {[string match .CONST_VAL('H00000000) $line]} { if {$part_var == $part_325} { set line [string map {'H00000000 'D325} $line] puts "INFO: part 325!" } else { set line [string map {'H00000000 'D410} $line] puts "INFO: part 410!" } } if {[string match .CONST_VAL('D325) $line] || [string match .CONST_VAL('D410) $line]} { if {$part_var == $part_325 && [string match .CONST_VAL('D410) $line]} { set line [string map {'D410 'D325} $line] puts "INFO: part 325!" } elseif {$part_var != $part_325 && [string match .CONST_VAL('D325) $line]} { set line [string map {'H00000000 'D410} $line] puts "INFO: part 410!" } } puts $fp_w $line } close $fp_r close $fp_w } else { puts "File part_checker not found!" } Добавил вызов его хуком: set_property STEPS.SYNTH_DESIGN.TCL.PRE check_part.tcl [get_runs synth_1] И получил ошибку заключающуюся в том, что при вызове скрипта таким образом не отрабатывает set proj_dir [get_property directory $proj_name] Таким образом не отрабатывается выполнение скрипта через гуй(через коммандную строку все ок) Подскажите пожалуйста, как решаются такие проблемы? Меня не оставляет чувство, что я перемудрил и все можно сделать намного проще Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 35 20 марта, 2018 Опубликовано 20 марта, 2018 · Жалоба Приветствую! ... Добавил вызов его хуком: set_property STEPS.SYNTH_DESIGN.TCL.PRE check_part.tcl [get_runs synth_1] И получил ошибку заключающуюся в том, что при вызове скрипта таким образом не отрабатывает set proj_dir [get_property directory $proj_name] Таким образом не отрабатывается выполнение скрипта через гуй(через коммандную строку все ок) Подскажите пожалуйста, как решаются такие проблемы? Меня не оставляет чувство, что я перемудрил и все можно сделать намного проще Таксс - судя по всему имеем дело с Vivado - так как это очень пакостный косяк с $proj_name - если запускаете компиляцию из GUI то root для proj_name получается внутри proj_name.run/synth_?/ а не там где proj_name.xpr лежит. :( Можете попробовать привязать путь к исходнику через путь к скрипту set PRJ_ROOT [file normalize "[file dirname [info script]]../.."] Ну и можно не генерировать исходник а просто менять generic parameters в топе при синтезе на значения полученные из скрипта или из свойств проекта. set_property -name "steps.synth_design.args.more options" -value "-generic COMPILE_DATE=$CompileDate ... -objects [get_runs synth_1] // а в top соответственно module tom #(parameter COMPILE_DATE= 0, ... Успехов! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 1 20 марта, 2018 Опубликовано 20 марта, 2018 · Жалоба Ну и можно не генерировать исходник а просто менять generic parameters в топе при синтезе на значения полученные из скрипта или из свойств проекта. set_property -name "steps.synth_design.args.more options" -value "-generic COMPILE_DATE=$CompileDate ... -objects [get_runs synth_1] // а в top соответственно module tom #(parameter COMPILE_DATE= 0, ... В случае если менять параемтры: у меня топлевел это блок дизайн К модулю акси подключается ip блок constant значение в котором я и меняю. Если я сделаю модуль rtl без constant блока, то это потребует еще update и upgrade модуля после изменений, а моим способом я подменяю исходник, который непосредственно уже вставлен в блок дизайн и эти этапы опускаются Спасибо за совет с путем! буду пробовать! P.S. ааа или вашим способом эти апгрейды уже не потребуются? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 35 20 марта, 2018 Опубликовано 20 марта, 2018 · Жалоба Приветствую! В случае если менять параемтры: у меня топлевел это блок дизайн ... Тут уж как кому нравится. Я просто никогда не делаю BD как top - у меня всегда top это мой rtl даже как просто враппер для BD. Ну а раз он мой то и что хочу то и ворочу. :) В этом случае из BD торчит несколько входов на модуль констант проекта на которые и вешаются глобальные параметры. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 1 20 марта, 2018 Опубликовано 20 марта, 2018 · Жалоба Ваш совет с привязкой к директории скрипта очень помог, спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aabmail 0 20 марта, 2018 Опубликовано 20 марта, 2018 · Жалоба А вот хотелось бы все-таки узнать, если ли возможность изнутри прошивки узнать part-номер ПЛИС, на котором данная прошивка крутится. Кто-нибудь знает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 20 марта, 2018 Опубликовано 20 марта, 2018 (изменено) · Жалоба Мож не в тему - однако по пробовал в TCL консоли в открытом проекте в вивадо 2017.4.1 set proj_name [current_project] get_property directory $proj_name Оно выдало путь до места где расположен XXX.XPR Что я делаю не так ? Теперь понял - Спасибо. А вот хотелось бы все-таки узнать, если ли возможность изнутри прошивки узнать part-номер ПЛИС, на котором данная прошивка крутится. Кто-нибудь знает? глубоко не копал - может стоит посмотреть в сторону ICAP ? (или как там его? для частичной реконфигурации ПЛИС). к примеру ug470 Изменено 20 марта, 2018 пользователем Alex77 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 35 20 марта, 2018 Опубликовано 20 марта, 2018 · Жалоба Приветствую! ... Оно выдало путь до места где расположен XXX.XPR Что я делаю не так ? Не внимательно читаете :) ... если запускаете компиляцию из GUI то root для proj_name получается внутри proj_name.run/synth_?/ а не там где proj_name.xpr лежит. sad.gif ... При работе в консоле из GUI и при компиляции разные пути для проекта. К тому же при запуске синтеза или P&R как таковой xpr не используется. Там все разворачивается в скрипты и запускается через кашу из tcl и js. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lutovid 1 20 марта, 2018 Опубликовано 20 марта, 2018 · Жалоба Мож не в тему - однако по пробовал в TCL консоли в открытом проекте в вивадо 2017.4.1 set proj_name [current_project] get_property directory $proj_name Оно выдало путь до места где расположен XXX.XPR Что я делаю не так ? Я там написал выше - если с консоли, то все работает, если запускать хуком через гуй на событие запуска синтеза< то тогда проблемы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 21 марта, 2018 Опубликовано 21 марта, 2018 · Жалоба Здравствуйте! Появилась такая задача: Есть прошивка, которая может быть сгенерирована либо для кристалла малого объема, либо для большого(серия одна). Есть один elf файл sdk, который может быть запущен на двух разных кристаллах. Нужно софтом определить какой это кристал. Есть идея дописать tcl скрипт, который в процессе генерации битпотока будет в регистр ядра part_checker прописывать парт номер, а микроблейзом по этому регистру читать(цель в автоматизации процесса - если руками каждый раз прописывать в этот регистрб то можно и забыть). Но наиболее удобным было бы вычитать его непосредственно какими-то стандартными методами - считывается же как-то этот парт номер при подключении программатора. Пробовал использовать DNA, но как я понял этот идентификационный номер не содержит информации о партномере. Конечная цель, которой хотелось бы добиться: Выбираешь в настройках проекта кристалл -> запускаешь генерацию битпотока -> экспортируешь в SDK -> Заливаешь в плис -> спрашиваешь что за кристалл, софт отвечает Меняешь в настройках кристалл на другой, проделываешь те же действия, получаешь ответ от плисины, что кристалл другой. Я бы копал в двух направлениях : 1 узнать DeviceID (если это можно сделать через JTAG, то и изнутри наверняка это доступно, через макрос ICAP или ещё как-то, надо разбираться). 2. В случае Микроблейза можно пользовать PVR регистр, заполнив его значение из дженерика XPS проекта. Деталей не знаю - всего лишь идея. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться