Jump to content

    
Sign in to follow this  
RobFPGA

Quartus статистика использования памяти M20K

Recommended Posts

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

Как можно получить число использованной памяти в так сказать в натуральном виде - штуках, а не в битах всего ?  И желательно сразу поле синтеза/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.

Share this post


Link to post
Share on other sites

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

Как говорится утопление утопающих их же и заслуга :wink2:

# 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! :biggrin:

Успехов! Rob. 

Share this post


Link to post
Share on other sites
18 minutes ago, RobFPGA said:

Пока по-быстрому придумал такое  - после partition_merge открыть TimeAnalyzer  в режиме post_map нетлиста.   А затем лазать по нетлисту выколупывая требуемую инфу.

говорила мне мама, учи TCL сынок (с)...

Кстати, вспомнил, на этапе фиттера, некоторые блоки памяти могут быть слиты в один. Поэтому это не совсем достоверная информация

Share this post


Link to post
Share on other sites

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

Just now, des00 said:

Кстати, вспомнил, на этапе фиттера, некоторые блоки памяти могут быть слиты в один. Поэтому это не совсем достоверная информация

Может так и быть - так как от беглого анализ  report файла волосы дыбом стоят  - например  память 256 слов х 128 бит  набрана  из 128 ram_block 256 x 1! :shok:  Теперь надо ждать  4 часа что бы посмотреть как эта же память будет выглядеть после fit.

Удачи! Rob.

Share this post


Link to post
Share on other sites
13 minutes ago, RobFPGA said:

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

Может так и быть - так как от беглого анализ  report файла волосы дыбом стоят  - например  память 256 слов х 128 бит  набрана  из 128 ram_block 256 x 1! :shok:  Теперь надо ждать  4 часа что бы посмотреть как эта же память будет выглядеть после fit.

Удачи! Rob.

А с каким семейством вы работаете?

Share this post


Link to post
Share on other sites
2 minutes ago, RobFPGA said:

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

Пока с Stratix V 

Удачи! Rob.

Я к чему спросил. Например, в стратикс 4 три типа Memory Blocks: MLABs, M9K, M144K. До фиттрера квартус может прикинет и задействует только M9K, но в процессе фиттера вполне может переложить часть памяти на блоки M144K, если это будет ему удобнее и если жестко не прописали какие блоки юзать.

Share this post


Link to post
Share on other sites
1 час назад, des00 сказал:

некоторые блоки памяти могут быть слиты в один

Обычно это касается двух однопортовых блоков, размером не более половины блока памяти.

1 час назад, RobFPGA сказал:

волосы дыбом стоят  - например  память 256 слов х 128 бит  набрана  из 128 ram_block 256 x 1! :shok:

Это следствие того, что биты памяти взаимозаменяемы. Qu тасует их внутри блока памяти для удобства трассировки. Эти маленькие блочки объединяются в группы по имени (один из параметров блока). Если сможете получить параметры блока, то несложно будет посчитать их группировку.

Как оценочная характеристика вполне приемлемо

Share this post


Link to post
Share on other sites

Как современных версия Ква не знаю, а вот в 12, 13 версия в логах точно был вывод о кол-ва занятых блоков.

Помню пришлось воевать с Ква по этому поводу, т.к. по битам был запас, а по блокам нет.

Share this post


Link to post
Share on other sites

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

Обновленный вариант.

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. :dash1:

Удачи! Rob.

Share this post


Link to post
Share on other sites
3 часа назад, RobFPGA сказал:

И блин молчок на сколько это more. :dash1:

А если синтезировать то же самое в Synplify Pro или Precision, и на их отчеты по ресурсам посмотреть?

Share this post


Link to post
Share on other sites
19 hours ago, dvlwork said:

Обычно это касается двух однопортовых блоков, размером не более половины блока памяти.

не точлько. М20К, в обсуждаемом чипе, разбивается на два М10К

Share this post


Link to post
Share on other sites
В 26.10.2019 в 13:08, des00 сказал:

М20К, в обсуждаемом чипе, разбивается на два М10К

Вот в упор не вижу. В stratix5_handbook.pdf в разделе Embedded Memory Blocks - не нашел такого.

Мы же о Stratix V ?

Share this post


Link to post
Share on other sites
19 hours ago, dvlwork said:

Вот в упор не вижу. В stratix5_handbook.pdf в разделе Embedded Memory Blocks - не нашел такого.

Мы же о Stratix V ?

чорт возьми, вы абсолютно правы. им не хватило тяму реализовать хилый режим разбиения большого блока на два независимых и полноценных, меньшего размера. Не ожидал, что там на аппартном уровне полный ноль. Моя неправда)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this