Здравствуйте!
Появилась такая задача:
Есть прошивка, которая может быть сгенерирована либо для кристалла малого объема, либо для большого(серия одна).
Есть один 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]
Таким образом не отрабатывается выполнение скрипта через гуй(через коммандную строку все ок)
Подскажите пожалуйста, как решаются такие проблемы? Меня не оставляет чувство, что я перемудрил и все можно сделать намного проще