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

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

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

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

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


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

если найдете, сообщите пожалуйста, меня тоже бесит факт сей)

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


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

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

Как говорится утопление утопающих их же и заслуга :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. 

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


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

18 minutes ago, RobFPGA said:

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

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

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

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


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

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

Just now, des00 said:

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

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

Удачи! Rob.

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


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

13 minutes ago, RobFPGA said:

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

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

Удачи! Rob.

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

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


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

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

37 minutes ago, novartis said:

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

Пока с Stratix V 

Удачи! Rob.

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


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

2 minutes ago, RobFPGA said:

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

Пока с Stratix V 

Удачи! Rob.

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

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


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

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

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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.

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


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

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

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

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

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


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

19 hours ago, dvlwork said:

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

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

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


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

В 26.10.2019 в 13:08, des00 сказал:

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

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

Мы же о Stratix V ?

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


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

19 hours ago, dvlwork said:

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

Мы же о Stratix V ?

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

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...