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

    

Выяснить парт-номер ПЛИС

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

Появилась такая задача:

Есть прошивка, которая может быть сгенерирована либо для кристалла малого объема, либо для большого(серия одна).

Есть один 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]

Таким образом не отрабатывается выполнение скрипта через гуй(через коммандную строку все ок)

Подскажите пожалуйста, как решаются такие проблемы? Меня не оставляет чувство, что я перемудрил и все можно сделать намного проще

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


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

Приветствую!

 

...

Добавил вызов его хуком:

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.

 

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


Ссылка на сообщение
Поделиться на другие сайты
Ну и можно не генерировать исходник а просто менять 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. ааа или вашим способом эти апгрейды уже не потребуются?

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


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

Приветствую!

 

В случае если менять параемтры: у меня топлевел это блок дизайн

...

Тут уж как кому нравится. Я просто никогда не делаю BD как top - у меня всегда top это мой rtl даже как просто враппер для BD. Ну а раз он мой то и что хочу то и ворочу. :) В этом случае из BD торчит несколько входов на модуль констант проекта на которые и вешаются глобальные параметры.

 

Удачи! Rob.

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


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

Ваш совет с привязкой к директории скрипта очень помог, спасибо!

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


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

А вот хотелось бы все-таки узнать, если ли возможность изнутри прошивки узнать part-номер ПЛИС, на котором данная прошивка крутится.

Кто-нибудь знает?

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


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

Мож не в тему - однако по пробовал в TCL консоли в открытом проекте в вивадо 2017.4.1

 

set proj_name [current_project]

get_property directory $proj_name

 

Оно выдало путь до места где расположен XXX.XPR

Что я делаю не так ?

 

Теперь понял - Спасибо.

 

А вот хотелось бы все-таки узнать, если ли возможность изнутри прошивки узнать part-номер ПЛИС, на котором данная прошивка крутится.

Кто-нибудь знает?

глубоко не копал - может стоит посмотреть в сторону ICAP ? (или как там его? для частичной реконфигурации ПЛИС). к примеру ug470

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

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


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

Приветствую!

...

Оно выдало путь до места где расположен XXX.XPR

Что я делаю не так ?

Не внимательно читаете :)

 

...

если запускаете компиляцию из GUI то root для proj_name получается внутри proj_name.run/synth_?/ а не там где proj_name.xpr лежит. sad.gif

...

При работе в консоле из GUI и при компиляции разные пути для проекта.

К тому же при запуске синтеза или P&R как таковой xpr не используется.

Там все разворачивается в скрипты и запускается через кашу из tcl и js.

 

Удачи! Rob.

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


Ссылка на сообщение
Поделиться на другие сайты
Мож не в тему - однако по пробовал в TCL консоли в открытом проекте в вивадо 2017.4.1

 

set proj_name [current_project]

get_property directory $proj_name

 

Оно выдало путь до места где расположен XXX.XPR

Что я делаю не так ?

 

Я там написал выше - если с консоли, то все работает, если запускать хуком через гуй на событие запуска синтеза< то тогда проблемы

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


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

Появилась такая задача:

Есть прошивка, которая может быть сгенерирована либо для кристалла малого объема, либо для большого(серия одна).

Есть один elf файл sdk, который может быть запущен на двух разных кристаллах. Нужно софтом определить какой это кристал.

Есть идея дописать tcl скрипт, который в процессе генерации битпотока будет в регистр ядра part_checker прописывать парт номер, а микроблейзом по этому регистру читать(цель в автоматизации процесса - если руками каждый раз прописывать в этот регистрб то можно и забыть). Но наиболее удобным было бы вычитать его непосредственно какими-то стандартными методами - считывается же как-то этот парт номер при подключении программатора. Пробовал использовать DNA, но как я понял этот идентификационный номер не содержит информации о партномере.

 

Конечная цель, которой хотелось бы добиться:

Выбираешь в настройках проекта кристалл -> запускаешь генерацию битпотока -> экспортируешь в SDK -> Заливаешь в плис -> спрашиваешь что за кристалл, софт отвечает

Меняешь в настройках кристалл на другой, проделываешь те же действия, получаешь ответ от плисины, что кристалл другой.

Я бы копал в двух направлениях : 1 узнать DeviceID (если это можно сделать через JTAG, то и изнутри наверняка это доступно, через макрос ICAP или ещё как-то, надо разбираться).

2. В случае Микроблейза можно пользовать PVR регистр, заполнив его значение из дженерика XPS проекта. Деталей не знаю - всего лишь идея.

 

 

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация