В прошлой статье мы создали проект устройства в Xilinx ISE, и узнали как описывать поведение простейшего устройства а также как выполнять его имплементацию. Что при этом происходит "за кулисами" интерфейса мы попробуем разобраться в данной статье. Для этого мы рассмотрим стадии, которые проходит наше описание перед тем, как превратится в "прошивку" для ПЛИС. В статье я дам вывод отдельных утилит, которые реализуют имплементацию, и постараюсь дать некоторые краткие комментарии. Большой проблемой в объяснении всего происходящего является "проприетарность" (то есть закрытость) форматов файлов учавствующих в процессе имплементации, поэтому сразу скажу, что рассмотрение будет весьма поверхностное, и направленное скорей на составление общей картины, чем на подробное описание всех тонкостей.

Прежде всего стоит сказать, что процесс имплементации состоит из нескольких последовательных стадий. В принципе, их можно разбивать на под-стадии или объединять вместе, но мы в данной статье примем их такими:

  1. Syntesis
  2. Translate
  3. Map
  4. Place and Route

Каждая последующая стадия зависит от предыдущей: стадия Translate не сможет выполнится если не будет выполнена стадия Syntesis, а стадия Map обязательно выполняется только после стадии Translate. Далее рассмотрим все стадии последовательно.

Синтез (Syntesis)

Во время синтеза исходное описание (в нашем случае описание на VHDL) превращаются в так называемый список связей (NetList). Эти связи устанавливаются между специфичными для архитектуры примитивами. В нашем случае это примитивы LUT2 , IBUF и OBUF, рассмотренные в прошлой статье.

Запустив синтез, в окне Console мы можем увидеть такие строки: (я выкинул некоторые пустые секции)

Started : "Synthesize - XST".
Running xst...
Command Line: xst -intstyle ise -ifn "/test2/vhdl_dev.xst" -ofn "/test2/vhdl_dev.syr"
Reading design: vhdl_dev.prj
=========================================================================
*                          HDL Parsing                                  *
=========================================================================
Parsing VHDL file "C:\Dropbox\work\forblogplis\test2\test_dev.vhd" into library work
Parsing entity <vhdl_dev>.
Parsing architecture <Behavioral> of entity <vhdl_dev>.
=========================================================================
*                            HDL Elaboration                            *
=========================================================================
Elaborating entity <vhdl_dev> (architecture <Behavioral>) from library <work>.
=========================================================================
*                           HDL Synthesis                               *
=========================================================================
Synthesizing Unit <vhdl_dev>.
    Related source file is "C:\Dropbox\work\forblogplis\test2\test_dev.vhd".
    Summary:
Unit <vhdl_dev> synthesized.
=========================================================================
HDL Synthesis Report
Macro Statistics
# Xors                                                 : 1
 1-bit xor2                                            : 1
=========================================================================
*                            Design Summary                             *
=========================================================================
Timing Summary:
---------------
Speed Grade: -3
   Minimum period: No path found
   Minimum input arrival time before clock: No path found
   Maximum output required time after clock: No path found
   Maximum combinational path delay: 5.259ns

В самом начале мы видим, что для синтеза вызывается отдельная утилита-синтезатор xst (Xilinx Synthesis Technology). Причем этой утилите передаются следующие аргументы:

-intstyle ise - указывает что xst запускается внутри ISE а не отдельно, особого интереса не представляет

-ifn "/test2/vhdl_dev.xst" - определяет файл с другими ключами для синтезатора

-ofn "/test2/vhdl_dev.syr" - файл отчета

Вот несколько первых строк файла vhdl_dev.xst:

set -tmpdir "xst/projnav.tmp"
set -xsthdpdir "xst"
run
-ifn vhdl_dev.prj
-ofn vhdl_dev
-ofmt NGC
-p xc6slx9-3-tqg144
-top vhdl_dev

Тут указываются файл со списком всех файлов описаний (vhdl_dev.prj), имя выходного файла (vhdl_dev), формат выходного файла (NGC), имя экземпляра ПЛИС. 

Файл .syr (sythesiser report) - подробный отчет синтезатора, который будет сгенерирован по окончании процесса синтеза. Часть отчёта попала в вывод консоли. Одна из полезных секций файла отчета - Design Summary:

=========================================================================
*                            Design Summary                             *
=========================================================================
Top Level Output File Name         : vhdl_dev.ngc
Primitive and Black Box Usage:
------------------------------
# BELS                             : 1
#      LUT2                        : 1
# IO Buffers                       : 3
#      IBUF                        : 2
#      OBUF                        : 1
Device utilization summary:
---------------------------
Selected Device : 6slx9tqg144-3 
Slice Logic Utilization: 
 Number of Slice LUTs:                    1  out of   5720     0%  
    Number used as Logic:                 1  out of   5720     0%  
Slice Logic Distribution: 
 Number of LUT Flip Flop pairs used:      1
   Number with an unused Flip Flop:       1  out of      1   100%  
   Number with an unused LUT:             0  out of      1     0%  
   Number of fully used LUT-FF pairs:     0  out of      1     0%  
   Number of unique control sets:         0
IO Utilization: 
 Number of IOs:                           3
 Number of bonded IOBs:                   3  out of    102     2%  
Specific Feature Utilization:
---------------------------
Partition Resource Summary:
---------------------------
  No Partitions were found in this design.
---------------------------
=========================================================================
Timing Report
NOTE: THESE TIMING NUMBERS ARE ONLY A SYNTHESIS ESTIMATE.
      FOR ACCURATE TIMING INFORMATION PLEASE REFER TO THE TRACE REPORT
      GENERATED AFTER PLACE-and-ROUTE.
Clock Information:
------------------
No clock signals found in this design
Asynchronous Control Signals Information:
----------------------------------------
No asynchronous control signals found in this design
Timing Summary:
---------------
Speed Grade: -3
   Minimum period: No path found
   Minimum input arrival time before clock: No path found
   Maximum output required time after clock: No path found
   Maximum combinational path delay: 5.259ns
Timing Details:
---------------
All values displayed in nanoseconds (ns)
=========================================================================
Timing constraint: Default path analysis
  Total number of paths / destination ports: 2 / 1
-------------------------------------------------------------------------
Delay:               5.259ns (Levels of Logic = 3)
  Source:            I1 (PAD)
  Destination:       O (PAD)
  Data Path: I1 to O
                                Gate     Net
    Cell:in->out      fanout   Delay   Delay  Logical Name (Net Name)
    ----------------------------------------  ------------
     IBUF:I->O             1   1.222   0.684  I1_IBUF (I1_IBUF)
     LUT2:I0->O            1   0.203   0.579  Mxor_O_xo<0>1 (O_OBUF)
     OBUF:I->O                 2.571          O_OBUF (O)
    ----------------------------------------
    Total                      5.259ns (3.996ns logic, 1.263ns route)
                                       (76.0% logic, 24.0% route)

Указанные значения ресурсов (device utilization summary) и временных задержек (timing summary) являются только оценочными, реальное их значение может отличаться. Это вызвано тем, что в результате синтеза исходное описание конвертируется в так называемые  Xilinx Basic ELements (BELs), LUT-ы триггеры, I/O BUF-ы и т.д., которые еще не привязаны к конкретной модели ПЛИС. 

На выходе синтезатора формируется файл списка цепей в проприетарном формате NGC (не аббривиатура, в документации подписан как Netlist file with Constraint information).

Translation (Трансляция)

Во время трансляции файл списка цепей NGC переводится в файл NGD (Native Generic Database). При этом учитываются ограничения пользователя (User Constraints). Ограничения пользователя это всяческие правила вроде указания максимальной частоты какого-нибудь сигнала. При этом что бы обеспечить такую частоту, программа-транслятор должна будет использовать более оптимальные элементы. Ограничения задаются в файле .ucf (User Constraints File) Файлов NGC может быть несколько: при этом они все будут собраны в один. Например это могут быть уже синтезированные файлы коммерческих компонетов, код которых закрыт.

Программой-транслятором выступает утилита ngdbuild, вот её вывод в консоли ISE:

Started : "Translate".
Running ngdbuild...
Command Line: ngdbuild -intstyle ise -dd _ngo -nt timestamp -i -p xc6slx9-tqg144-3 vhdl_dev.ngc vhdl_dev.ngd
Command Line: C:\Xilinx\14.4\ISE_DS\ISE\bin\nt64\unwrapped\ngdbuild.exe
-intstyle ise -dd _ngo -nt timestamp -i -p xc6slx9-tqg144-3 vhdl_dev.ngc
vhdl_dev.ngd
Reading NGO file "C:/Dropbox/work/forblogplis/test2/vhdl_dev.ngc" ...
Gathering constraint information from source properties...
Done.
Resolving constraint associations...
Checking Constraint Associations...
Done...
Checking expanded design ...
NGDBUILD Design Results Summary:
  Number of errors:     0
  Number of warnings:   0
Writing NGD file "vhdl_dev.ngd" ...
Writing NGDBUILD log file "vhdl_dev.bld"...

Map (отображение)

В результате Map-а примитивы со стадии транслейта "упаковываются" в слайсы, но слайсы при этом еще не получают реальных мест в ПЛИС. Также тут генерируется файл .PCF (Physical Constraints File), в котором ограничения указываются в терминах уже физических элементов, этот файл понадобится для следующей стадии. В результате отображения образуется файл NCD (Native Circuit Description), в этом файле учитываются ресурсы конкретной модели ПЛИС.

Вывод утилиты map выглядит так:

Started : "Map".
Running map...
Command Line: map -intstyle ise -p xc6slx9-tqg144-3 -w -logic_opt off -ol high -t 1 -xt 0 -register_duplication off -r 4 -global_opt off -mt off -ir off -pr off -lc off -power off -o vhdl_dev_map.ncd vhdl_dev.ngd vhdl_dev.pcf
Using target part "6slx9tqg144-3".
Mapping design into LUTs...
Running directed packing...
Running delay-based LUT packing...
Updating timing models...
INFO:Map:215 - The Interim Design Summary has been generated in the MAP Report
   (.mrp).
Running timing-driven placement...
Total REAL time at the beginning of Placer: 15 secs 
Total CPU  time at the beginning of Placer: 11 secs 
Phase 1.1  Initial Placement Analysis
Phase 1.1  Initial Placement Analysis (Checksum:f) REAL time: 16 secs 
Phase 2.7  Design Feasibility Check
Phase 2.7  Design Feasibility Check (Checksum:f) REAL time: 16 secs 
Phase 3.31  Local Placement Optimization
REAL time: 16 secs 
Phase 4.2  Initial Placement for Architecture Specific Features
.........
Phase 4.2  Initial Placement for Architecture Specific Features (Checksum:f) REAL time: 17 secs 
Phase 3.31  Local Placement Optimization (Checksum:f) Phase 5.36  Local Placement Optimization
Phase 5.36  Local Placement Optimization (Checksum:f) REAL time: 17 secs 
Phase 6.30  Global Clock Region Assignment
Phase 6.30  Global Clock Region Assignment (Checksum:f) REAL time: 17 secs 
Phase 7.3  Local Placement Optimization
.........
Phase 7.3  Local Placement Optimization (Checksum:92bc557) REAL time: 17 secs 
Phase 8.5  Local Placement Optimization
Phase 8.5  Local Placement Optimization (Checksum:92bc557) REAL time: 17 secs 
Phase 9.8  Global Placement
.....
Phase 9.8  Global Placement (Checksum:2158015b) REAL time: 18 secs 
Phase 10.5  Local Placement Optimization
Phase 10.5  Local Placement Optimization (Checksum:2158015b) REAL time: 18 secs 
Phase 11.18  Placement Optimization
Phase 11.18  Placement Optimization (Checksum:39096ff3) REAL time: 18 secs 
Phase 12.5  Local Placement Optimization
Phase 12.5  Local Placement Optimization (Checksum:39096ff3) REAL time: 18 secs 
Phase 13.34  Placement Validation
Phase 13.34  Placement Validation (Checksum:39096ff3) REAL time: 18 secs 
Total REAL time to Placer completion: 18 secs 
Total CPU  time to Placer completion: 12 secs 
Running post-placement packing...
Writing output files...
Design Summary:
Number of errors:      0
Number of warnings:    0
Slice Logic Utilization:
  Number of Slice Registers:                     0 out of  11,440    0%
  Number of Slice LUTs:                          1 out of   5,720    1%
    Number used as logic:                        1 out of   5,720    1%
      Number using O6 output only:               1
      Number using O5 output only:               0
      Number using O5 and O6:                    0
      Number used as ROM:                        0
    Number used as Memory:                       0 out of   1,440    0%
Slice Logic Distribution:
  Number of occupied Slices:                     1 out of   1,430    1%
  Number of MUXCYs used:                         0 out of   2,860    0%
  Number of LUT Flip Flop pairs used:            1
    Number with an unused Flip Flop:             1 out of       1  100%
    Number with an unused LUT:                   0 out of       1    0%
    Number of fully used LUT-FF pairs:           0 out of       1    0%
    Number of slice register sites lost
      to control set restrictions:               0 out of  11,440    0%
  A LUT Flip Flop pair for this architecture represents one LUT paired with
  one Flip Flop within a slice.  A control set is a unique combination of
  clock, reset, set, and enable signals for a registered element.
  The Slice Logic Distribution report is not meaningful if the design is
  over-mapped for a non-slice resource or if Placement fails.
IO Utilization:
  Number of bonded IOBs:                         3 out of     102    2%
Specific Feature Utilization:
  Number of RAMB16BWERs:                         0 out of      32    0%
  Number of RAMB8BWERs:                          0 out of      64    0%
  Number of BUFIO2/BUFIO2_2CLKs:                 0 out of      32    0%
  Number of BUFIO2FB/BUFIO2FB_2CLKs:             0 out of      32    0%
  Number of BUFG/BUFGMUXs:                       0 out of      16    0%
  Number of DCM/DCM_CLKGENs:                     0 out of       4    0%
  Number of ILOGIC2/ISERDES2s:                   0 out of     200    0%
  Number of IODELAY2/IODRP2/IODRP2_MCBs:         0 out of     200    0%
  Number of OLOGIC2/OSERDES2s:                   0 out of     200    0%
  Number of BSCANs:                              0 out of       4    0%
  Number of BUFHs:                               0 out of     128    0%
  Number of BUFPLLs:                             0 out of       8    0%
  Number of BUFPLL_MCBs:                         0 out of       4    0%
  Number of DSP48A1s:                            0 out of      16    0%
  Number of ICAPs:                               0 out of       1    0%
  Number of MCBs:                                0 out of       2    0%
  Number of PCILOGICSEs:                         0 out of       2    0%
  Number of PLL_ADVs:                            0 out of       2    0%
  Number of PMVs:                                0 out of       1    0%
  Number of STARTUPs:                            0 out of       1    0%
  Number of SUSPEND_SYNCs:                       0 out of       1    0%
Average Fanout of Non-Clock Nets:                1.00
Mapping completed.
See MAP report file "vhdl_dev_map.mrp" for details.
Process "Map" completed successfully

Place and Route (PAR) - Размещение и трассировка

Тут слайсы, сформированные на прошлом этапе, уже получают свои места в матрице логических блоков (Place). После этого выполняется трассировка связей между сигналами слайсов (Route). Вывод в консоле такой:

Started : "Place & Route".
Running par...
Command Line: par -w -intstyle ise -ol high -mt off vhdl_dev_map.ncd vhdl_dev.ncd vhdl_dev.pcf
Constraints file: vhdl_dev.pcf.
Loading device for application Rf_Device from file '6slx9.nph' in environment C:\Xilinx\14.4\ISE_DS\ISE\.
   "vhdl_dev" is an NCD, version 3.2, device xc6slx9, package tqg144, speed -3
Initializing temperature to 85.000 Celsius. (default - Range: 0.000 to 85.000 Celsius)
Initializing voltage to 1.140 Volts. (default - Range: 1.140 to 1.260 Volts)
INFO:Par:282 - No user timing constraints were detected or you have set the option to ignore timing constraints ("par
   -x"). Place and Route will run in "Performance Evaluation Mode" to automatically improve the performance of all
   internal clocks in this design. Because there are not defined timing requirements, a timing score will not be
   reported in the PAR report in this mode. The PAR timing summary will list the performance achieved for each clock.
   Note: For the fastest runtime, set the effort level to "std".  For best performance, set the effort level to "high".
Device speed data version:  "PRODUCTION 1.23 2012-12-04".
Device Utilization Summary:
Slice Logic Utilization:
  Number of Slice Registers:                     0 out of  11,440    0%
  Number of Slice LUTs:                          1 out of   5,720    1%
    Number used as logic:                        1 out of   5,720    1%
      Number using O6 output only:               1
      Number using O5 output only:               0
      Number using O5 and O6:                    0
      Number used as ROM:                        0
    Number used as Memory:                       0 out of   1,440    0%
Slice Logic Distribution:
  Number of occupied Slices:                     1 out of   1,430    1%
  Number of MUXCYs used:                         0 out of   2,860    0%
  Number of LUT Flip Flop pairs used:            1
    Number with an unused Flip Flop:             1 out of       1  100%
    Number with an unused LUT:                   0 out of       1    0%
    Number of fully used LUT-FF pairs:           0 out of       1    0%
    Number of slice register sites lost
      to control set restrictions:               0 out of  11,440    0%
  A LUT Flip Flop pair for this architecture represents one LUT paired with
  one Flip Flop within a slice.  A control set is a unique combination of
  clock, reset, set, and enable signals for a registered element.
  The Slice Logic Distribution report is not meaningful if the design is
  over-mapped for a non-slice resource or if Placement fails.
IO Utilization:
  Number of bonded IOBs:                         3 out of     102    2%
Specific Feature Utilization:
  Number of RAMB16BWERs:                         0 out of      32    0%
  Number of RAMB8BWERs:                          0 out of      64    0%
  Number of BUFIO2/BUFIO2_2CLKs:                 0 out of      32    0%
  Number of BUFIO2FB/BUFIO2FB_2CLKs:             0 out of      32    0%
  Number of BUFG/BUFGMUXs:                       0 out of      16    0%
  Number of DCM/DCM_CLKGENs:                     0 out of       4    0%
  Number of ILOGIC2/ISERDES2s:                   0 out of     200    0%
  Number of IODELAY2/IODRP2/IODRP2_MCBs:         0 out of     200    0%
  Number of OLOGIC2/OSERDES2s:                   0 out of     200    0%
  Number of BSCANs:                              0 out of       4    0%
  Number of BUFHs:                               0 out of     128    0%
  Number of BUFPLLs:                             0 out of       8    0%
  Number of BUFPLL_MCBs:                         0 out of       4    0%
  Number of DSP48A1s:                            0 out of      16    0%
  Number of ICAPs:                               0 out of       1    0%
  Number of MCBs:                                0 out of       2    0%
  Number of PCILOGICSEs:                         0 out of       2    0%
  Number of PLL_ADVs:                            0 out of       2    0%
  Number of PMVs:                                0 out of       1    0%
  Number of STARTUPs:                            0 out of       1    0%
  Number of SUSPEND_SYNCs:                       0 out of       1    0%
Overall effort level (-ol):   High 
Router effort level (-rl):    High 
Starting initial Timing Analysis.  REAL time: 10 secs 
REAL time: 10 secs 
Starting Router
Finished initial Timing Analysis.  
     REAL time: 10 secs 
Phase  1  : 3 unrouted; 
Phase  2  : 3 unrouted;      REAL time: 10 secs 
Phase  3  : 0 unrouted;      REAL time: 10 secs 
(Par is working to improve performance)     REAL time: 11 secs 
Phase  4  : 0 unrouted; 
Updating file: vhdl_dev.ncd with current fully routed design.
Phase  5  : 0 unrouted; (Par is working to improve performance)     REAL time: 11 secs 
Phase  6  : 0 unrouted; (Par is working to improve performance)     REAL time: 11 secs 
Phase  7  : 0 unrouted; (Par is working to improve performance)     REAL time: 11 secs 
Phase  8  : 0 unrouted; (Par is working to improve performance)     REAL time: 11 secs 
Phase  9  : 0 unrouted; (Par is working to improve performance)     REAL time: 11 secs 
Phase 10  : 0 unrouted; (Par is working to improve performance)     REAL time: 11 secs 
Total REAL time to Router completion: 11 secs 
Total CPU time to Router completion: 10 secs 
Partition Implementation Status
-------------------------------
  No Partitions were found in this design.
-------------------------------
Generating "PAR" statistics.
INFO:Par:459 - The Clock Report is not displayed in the non timing-driven mode.
Timing Score: 0 (Setup: 0, Hold: 0)
Generating Pad Report.
All signals are completely routed.
Total REAL time to PAR completion: 12 secs 
Total CPU time to PAR completion: 11 secs 
Peak Memory Usage:  406 MB
Placer: Placement generated during map.
Routing: Completed - No errors found.
Number of error messages: 0
Number of warning messages: 0
Number of info messages: 2
Writing design to file vhdl_dev.ncd
PAR done!
Process "Place & Route" completed successfully
Started : "Generate Post-Place & Route Static Timing".
Running trce...
Command Line: trce -intstyle ise -v 3 -s 3 -n 3 -fastpaths -xml vhdl_dev.twx vhdl_dev.ncd -o vhdl_dev.twr vhdl_dev.pcf
Loading device for application Rf_Device from file '6slx9.nph' in environment
C:\Xilinx\14.4\ISE_DS\ISE\.
   "vhdl_dev" is an NCD, version 3.2, device xc6slx9, package tqg144, speed -3
Analysis completed Sun May 11 05:58:28 2014
--------------------------------------------------------------------------------
Generating Report ...
Number of warnings: 0
Total time: 7 secs 
Process "Generate Post-Place & Route Static Timing" completed successfully

На выходе получается тот же NCD файл, но уже со всеми связями и адресами, и почти пригодный для прошивки (для этого его осталось преобразовать в .bit файл конфигурации). Стоит отметить что со временем развития инструментов сборки, обязанности Map и Place & Route немного поменялись и Map нынче делает также размещение слайсов (это и видно в его выводе), а PAR теперь делает только трассировку. Поэтому на самом деле логичнее было бы назвать процессы не Map и Place & Route а Map & Place и Route

В общем весь процесс имплементации можно представить в таком виде:

flowhilinx.jpg

Стоит заметить, что указанное выше описание является очень кратким: на самом деле каждая стадия имеется свои тонкости, разбираться с которыми имеет смысл только при необходимости, а для начала разработки этих общих сведений должно быть достаточно.