RobFPGA 0 Posted October 24, 2019 · Report post Приветствую! Как можно получить число использованной памяти в так сказать в натуральном виде - штуках, а не в битах всего ? И желательно сразу поле синтеза/partition_merge процесса, не дожидаясь окончания fit. Вот выдает мне это Qu статистику после partition_merge ..../auto_generated|ALTSYNCRAM tyime_RAM:AUTO Simple Dual Port depth_A:32 width_A:32 depth_B:32 width_B:32 Bits:1024 ... и как мне догадаться столько блоков памяти этот кю использовал? Удачи! Rob. Quote Ответить с цитированием Share this post Link to post Share on other sites
des00 0 Posted October 25, 2019 · Report post если найдете, сообщите пожалуйста, меня тоже бесит факт сей) Quote Ответить с цитированием Share this post Link to post Share on other sites
RobFPGA 0 Posted October 25, 2019 · Report post Приветствую! Как говорится утопление утопающих их же и заслуга # brams.tcl # Get collection of block RAM proc get_brams {{mask "*ram_block*"}} { if {$mask != "*ram_block*"} { set brams [get_cells -compatibility_mode $mask] } else { set brams [get_cells -hierarchical $mask] } return $brams } # Count number of block ram proc count_brams {{mask "*ram_block*"}} { set brams [get_brams $mask] puts "Total block_ram cells:[get_collection_size $brams]" } # Report to file proc report_brams {{mask "*ram_block*"}} { set brams [get_brams $mask] set fo [open [file normalize "./brams.txt"] w] puts $fo "Total block_ram cells:[get_collection_size $brams]" foreach_in_collection cell $brams { set wtype [get_cell_info -wysiwyg_type $cell] set name [get_cell_info -name $cell] # set pins [get_cell_info -pins $cell] set pin_names [lsort -dictionary [get_cell_info -pin_names $cell]] set addrA_wh [llength [lsearch -all $pin_names {portaaddr*}]] set dataA_in [llength [lsearch -all $pin_names {portadatain*}]] set dataA_ou [llength [lsearch -all $pin_names {portadataout*}]] set weA [llength [lsearch -all $pin_names {portawe*}]] set addrB_wh [llength [lsearch -all $pin_names {portbaddr*}]] set dataB_in [llength [lsearch -all $pin_names {portbdatain*}]] set dataB_ou [llength [lsearch -all $pin_names {portbdataout*}]] set weB [llength [lsearch -all $pin_names {portbwe*}]] puts $fo [format "$wtype, portA: addr:%02d, din%03d, dou:%03d, we:%1d - portB: addr:%02d, din%03d, dou:%03d, we:%1d - $name" \ $addrA_wh $dataA_in $dataA_ou $weA $addrB_wh $dataB_in $dataB_ou $weB] } close $fo } Пока по-быстрому придумал такое - после partition_merge открыть TimeAnalyzer в режиме post_map нетлиста. А затем лазать по нетлисту выколупывая требуемую инфу. count_brams - выдает общее количество block_ram. count_brams module_name|*|ram_block* - только для конкретного модуля report_brams ... создает файл с основными параметрами всех найденных ram_block Приветствуются комментарии и дополнения. Превратим совместными усилиями Qu в Vviado! Успехов! Rob. Quote Ответить с цитированием Share this post Link to post Share on other sites
des00 0 Posted October 25, 2019 · Report post 18 minutes ago, RobFPGA said: Пока по-быстрому придумал такое - после partition_merge открыть TimeAnalyzer в режиме post_map нетлиста. А затем лазать по нетлисту выколупывая требуемую инфу. говорила мне мама, учи TCL сынок (с)... Кстати, вспомнил, на этапе фиттера, некоторые блоки памяти могут быть слиты в один. Поэтому это не совсем достоверная информация Quote Ответить с цитированием Share this post Link to post Share on other sites
RobFPGA 0 Posted October 25, 2019 · Report post Приветствую! Just now, des00 said: Кстати, вспомнил, на этапе фиттера, некоторые блоки памяти могут быть слиты в один. Поэтому это не совсем достоверная информация Может так и быть - так как от беглого анализ report файла волосы дыбом стоят - например память 256 слов х 128 бит набрана из 128 ram_block 256 x 1! Теперь надо ждать 4 часа что бы посмотреть как эта же память будет выглядеть после fit. Удачи! Rob. Quote Ответить с цитированием Share this post Link to post Share on other sites
novartis 0 Posted October 25, 2019 · Report post 13 minutes ago, RobFPGA said: Приветствую! Может так и быть - так как от беглого анализ report файла волосы дыбом стоят - например память 256 слов х 128 бит набрана из 128 ram_block 256 x 1! Теперь надо ждать 4 часа что бы посмотреть как эта же память будет выглядеть после fit. Удачи! Rob. А с каким семейством вы работаете? Quote Ответить с цитированием Share this post Link to post Share on other sites
RobFPGA 0 Posted October 25, 2019 · Report post Приветствую! 37 minutes ago, novartis said: А с каким семейством вы работаете? Пока с Stratix V Удачи! Rob. Quote Ответить с цитированием Share this post Link to post Share on other sites
novartis 0 Posted October 25, 2019 · Report post 2 minutes ago, RobFPGA said: Приветствую! Пока с Stratix V Удачи! Rob. Я к чему спросил. Например, в стратикс 4 три типа Memory Blocks: MLABs, M9K, M144K. До фиттрера квартус может прикинет и задействует только M9K, но в процессе фиттера вполне может переложить часть памяти на блоки M144K, если это будет ему удобнее и если жестко не прописали какие блоки юзать. Quote Ответить с цитированием Share this post Link to post Share on other sites
dvlwork 0 Posted October 25, 2019 · Report post 1 час назад, des00 сказал: некоторые блоки памяти могут быть слиты в один Обычно это касается двух однопортовых блоков, размером не более половины блока памяти. 1 час назад, RobFPGA сказал: волосы дыбом стоят - например память 256 слов х 128 бит набрана из 128 ram_block 256 x 1! Это следствие того, что биты памяти взаимозаменяемы. Qu тасует их внутри блока памяти для удобства трассировки. Эти маленькие блочки объединяются в группы по имени (один из параметров блока). Если сможете получить параметры блока, то несложно будет посчитать их группировку. Как оценочная характеристика вполне приемлемо Quote Ответить с цитированием Share this post Link to post Share on other sites
wolfman 0 Posted October 25, 2019 · Report post Как современных версия Ква не знаю, а вот в 12, 13 версия в логах точно был вывод о кол-ва занятых блоков. Помню пришлось воевать с Ква по этому поводу, т.к. по битам был запас, а по блокам нет. Quote Ответить с цитированием Share this post Link to post Share on other sites
RobFPGA 0 Posted October 25, 2019 · Report post Приветствую! Обновленный вариант. Spoiler package require cmdline array unset ar_wtype # Crete array: wysiwyg_type -> list of cell_id proc mkt_cell_bd {} { global ar_wtype array unset ar_wtype set cells [get_cells -compatibility_mode "*"] foreach_in_collection cell $cells { set wtype [get_cell_info -wysiwyg_type $cell] lappend ar_wtype($wtype) $cell } foreach name [lsort -dictionary [array names ar_wtype]] { puts [format ">> count:%6d, :%-40s " [llength $ar_wtype($name)] $name] } } # Get list of block RAM proc get_brams {{mask "*"}} { global ar_wtype mkt_cell_bd set brams $ar_wtype(stratixv_ram_block) set l_names {} foreach cell $brams { set name [get_cell_info -name $cell] if {[string match $mask $name]} { lappend l_names $cell $name } } set l_names [lsort -dictionary -stride 2 -index 1 $l_names] set l_brams {} foreach {cell name} $l_names { lappend l_brams $cell } puts "Total block_ram cells:[llength $brams]" puts "Matched block_ram cells:[llength $l_brams]" return $l_brams } # Count number of block ram proc count_brams {{mask "*"}} { set brams [get_brams $mask] puts "Total block_ram cells:[llength $brams]" } # Report to file proc report_brams args { set proc_opt { {mask.arg "*" "mathing mask"} {fname.arg "./brams.txt" "report filename"} } array set opt [cmdline::getoptions args $proc_opt] set brams [get_brams $opt(mask)] set fo stdout if {$opt(fname)!=""} { set fo [open [file normalize $opt(fname)] w] } puts $fo "Total block_ram cells:[llength $brams]" foreach cell $brams { set wtype [get_cell_info -wysiwyg_type $cell] set name [get_cell_info -name $cell] set pin_names [lsort -dictionary [get_cell_info -pin_names $cell]] set addrA_wh [llength [lsearch -all $pin_names {portaaddr*}]] set dataA_in [llength [lsearch -all $pin_names {portadatain*}]] set dataA_ou [llength [lsearch -all $pin_names {portadataout*}]] set weA [llength [lsearch -all $pin_names {portawe*}]] set addrB_wh [llength [lsearch -all $pin_names {portbaddr*}]] set dataB_in [llength [lsearch -all $pin_names {portbdatain*}]] set dataB_ou [llength [lsearch -all $pin_names {portbdataout*}]] set weB [llength [lsearch -all $pin_names {portbwe*}]] puts $fo [format "$wtype, portA: addr:%02d, din%03d, dou:%03d, we:%1d - portB: addr:%02d, din%03d, dou:%03d, we:%1d - $name" \ $addrA_wh $dataA_in $dataA_ou $weA $addrB_wh $dataB_in $dataB_ou $weB] } close $fo } И как оказалось почти бесполезного скрипта - действительно пока fit не закончен число реальных BRAM не получишь. А что делать если как раз из-за этого fit и не заканчивается? "Error (170048): Selected device has 2640 RAM location(s) of type M20K block. However, the current design needs more than 2640 to successfully fit" И блин молчок на сколько это more. Удачи! Rob. Quote Ответить с цитированием Share this post Link to post Share on other sites
StewartLittle 0 Posted October 25, 2019 · Report post 3 часа назад, RobFPGA сказал: И блин молчок на сколько это more. А если синтезировать то же самое в Synplify Pro или Precision, и на их отчеты по ресурсам посмотреть? Quote Ответить с цитированием Share this post Link to post Share on other sites
des00 0 Posted October 26, 2019 · Report post 19 hours ago, dvlwork said: Обычно это касается двух однопортовых блоков, размером не более половины блока памяти. не точлько. М20К, в обсуждаемом чипе, разбивается на два М10К Quote Ответить с цитированием Share this post Link to post Share on other sites
dvlwork 0 Posted November 13, 2019 · Report post В 26.10.2019 в 13:08, des00 сказал: М20К, в обсуждаемом чипе, разбивается на два М10К Вот в упор не вижу. В stratix5_handbook.pdf в разделе Embedded Memory Blocks - не нашел такого. Мы же о Stratix V ? Quote Ответить с цитированием Share this post Link to post Share on other sites
des00 0 Posted November 14, 2019 · Report post 19 hours ago, dvlwork said: Вот в упор не вижу. В stratix5_handbook.pdf в разделе Embedded Memory Blocks - не нашел такого. Мы же о Stratix V ? чорт возьми, вы абсолютно правы. им не хватило тяму реализовать хилый режим разбиения большого блока на два независимых и полноценных, меньшего размера. Не ожидал, что там на аппартном уровне полный ноль. Моя неправда) Quote Ответить с цитированием Share this post Link to post Share on other sites