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

3 minutes ago, gosha-z said:

С написанием без квадратных скобок?

Да, без скобок. Вот как я выше написал, так Vivado и синтезирует.

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


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

4 minutes ago, blackfin said:

Вот как я выше написал, так Vivado и синтезирует.

Попробовал. 12-4739 присутствует.

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


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

Возможно, надо добавить пробел после group в

-group[get_clocks -include_generated_clocks clk_fpga_0]

 

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


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

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

4 hours ago, gosha-z said:

Попробовал. 12-4739 присутствует.

У вас это сообщения когда выдается?  При синтезе или при P&R?

 

Удачи! Rob.

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


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

Приветствую

12 minutes ago, gosha-z said:

При синтезе

При синтезе может быть так что этого клока еще нет.  Так как полный нетлист создается только перед P&R  или когда вы делаете Open synthesys desig (почти полный).   

Да и при синтезе  Vivado в большинстве своем кладет болт на эти констрейны.  Это  больше  нужно для P&R.  

 

Надо смотреть полный лог синтеза чтобы понять в какой последовательности и к чему применяются файлы констрейнов.  

 

Удачи! Rob.

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


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

Во-первых в синтезе констрейны должны быть видны. Это ненормально как-то. Хотя наличие неких настроек может убрать видимость во время синтеза.

Во-вторых, если констрейны видны в p&r, то можно подтянуть и пользовательские констрейны только на фазу p&r. Всё равно указанный констрейн нужен только для исключения анализа заведомо асинхронных цепей в timing analysis, который для FPGA делается после p&r.

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


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

До синтеза есть еще одна фаза работы тула - элаборация. Это, когда считывается RTL и преобразуется в нетлист на generic селлах. Т.е. тул с самого начала и до конца работает с нетлистом, другое дело что действительно - нетлисты до синтеза и после заметно отличаются, особенно в части комбинационной логики, где в ходе минимизации и мэппинга создаются и удаляются логические элементы и цепи. По этой причине констрейнты до синтеза и после выглядят немного разно, но только в части имен (пинов, портов, селлов и т.д.).

 

У топикстартера использован иерархический пин. В принципе, такой констрейнт будет валиден и до и после синтеза. Если только выше этого пина не намешано чего то нехорошого, вроде комбинационной логики, или если этот порт исчезает в процессе синтеза по какой либо причине.

 

Но вот что точно - судя по ворнингу тула, в констрейнтах пропущен пробел, а в слове asynchronous допущена грамматическая ошибка.

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


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

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

Делаем пару простеньких скрипта:

### test_clk_before.tcl

proc test_clocks {{msg "none"}} {
  puts ">> $msg"

  set clocks [get_clocks -include_generated_clocks]

  foreach clk $clocks {
    puts ">> Clock: $clk ..."
    report_property $clk
  }
}

test_clocks "Before ..."

...
  
### test_clk_after.tcl
test_clocks "After ..."

Добавляем эти файлы как constraint причем test_clk_before.tcl  ставим в списке в самом начале,  а  test_clk_after.tcl в конце  (ну или после любого вашего файла)   

Запускаем синтез и смотрим что выводится ... ,  удивляемся, возмущаемся, чешем голову :scratch_one-s_head:

Spoiler

Processing XDC Constraints
Initializing timing engine
...
Sourcing Tcl File [.../src/xdc/test_clk_before.tcl]
>> Before ...

>> Clock: i_zynq_sys/processing_system7_0/FCLK_CLK0 ...
Property           Type     Read-only  Value
CLASS              string   true       clock
FILE_NAME          string   true       ..../sys_processing_system7_0_0_in_context.xdc
INPUT_JITTER       double   true       0.000
IS_GENERATED       bool     true       0
IS_PROPAGATED      bool     true       1
IS_USER_GENERATED  bool     true       0
IS_VIRTUAL         bool     true       0
LINE_NUMBER        int      true       1
NAME               string   true       i_zynq_sys/processing_system7_0/FCLK_CLK0
PERIOD             double   true       10.000
SOURCE_PINS        string*  true       i_zynq_sys/processing_system7_0/FCLK_CLK0
SYSTEM_JITTER      double   true       needs timing update***
WAVEFORM           double*  true       0.000 5.000

>> Clock: i_zynq_sys/processing_system7_0/FCLK_CLK1 ...
Property           Type     Read-only  Value
CLASS              string   true       clock
FILE_NAME          string   true       ..../sys_processing_system7_0_0_in_context.xdc
INPUT_JITTER       double   true       0.000
IS_GENERATED       bool     true       0
IS_PROPAGATED      bool     true       1
IS_USER_GENERATED  bool     true       0
IS_VIRTUAL         bool     true       0
LINE_NUMBER        int      true       2
NAME               string   true       i_zynq_sys/processing_system7_0/FCLK_CLK1
PERIOD             double   true       5.000
SOURCE_PINS        string*  true       i_zynq_sys/processing_system7_0/FCLK_CLK1
SYSTEM_JITTER      double   true       needs timing update***
WAVEFORM           double*  true       0.000 2.500

Finished Sourcing Tcl File [..../src/xdc/test_clk_before.tcl]

...
>> After ...
>> Clock: i_zynq_sys/processing_system7_0/FCLK_CLK0 ...
Property           Type     Read-only  Value
CLASS              string   true       clock
FILE_NAME          string   true       ..../sys_processing_system7_0_0_in_context.xdc
INPUT_JITTER       double   true       0.000
IS_GENERATED       bool     true       0
IS_PROPAGATED      bool     true       1
IS_USER_GENERATED  bool     true       0
IS_VIRTUAL         bool     true       0
LINE_NUMBER        int      true       1
NAME               string   true       i_zynq_sys/processing_system7_0/FCLK_CLK0
PERIOD             double   true       10.000
SOURCE_PINS        string*  true       i_zynq_sys/processing_system7_0/FCLK_CLK0
SYSTEM_JITTER      double   true       needs timing update***
WAVEFORM           double*  true       0.000 5.000

>> Clock: i_zynq_sys/processing_system7_0/FCLK_CLK1 ...
Property           Type     Read-only  Value
CLASS              string   true       clock
FILE_NAME          string   true       ..../sys_processing_system7_0_0_in_context.xdc
INPUT_JITTER       double   true       0.000
IS_GENERATED       bool     true       0
IS_PROPAGATED      bool     true       1
IS_USER_GENERATED  bool     true       0
IS_VIRTUAL         bool     true       0
LINE_NUMBER        int      true       2
NAME               string   true       i_zynq_sys/processing_system7_0/FCLK_CLK1
PERIOD             double   true       5.000
SOURCE_PINS        string*  true       i_zynq_sys/processing_system7_0/FCLK_CLK1
SYSTEM_JITTER      double   true       needs timing update***
WAVEFORM           double*  true       0.000 2.500
...

Finished Sourcing Tcl File [..../src/xdc/test_clk_after.tcl]

 

После открываем  Open synthesys  и смотрим вывод в консоле (или запускаем там же test_clocks "Open ...")   если не поверим своим глазам с первого раза: :wacko2:

Spoiler

test_clock "Open synthesys ..."
>> Open synthesys ...
>> Clock: clk_fpga_0 ...
Property           Type     Read-only  Value
CLASS              string   true       clock
FILE_NAME          string   true       .../zynq7_sys_processing_system7_0_0.xdc
INPUT_JITTER       double   true       0.300
IS_GENERATED       bool     true       0
IS_PROPAGATED      bool     true       1
IS_USER_GENERATED  bool     true       0
IS_VIRTUAL         bool     true       0
LINE_NUMBER        int      true       23
NAME               string   true       clk_fpga_0
PERIOD             double   true       10.000
SOURCE_PINS        string*  true       i_zynq_sys/processing_system7_0/inst/PS7_i/FCLKCLK[0]
SYSTEM_JITTER      double   true       0.050
WAVEFORM           double*  true       0.000 5.

>> Clock: clk_fpga_1 ...
Property           Type     Read-only  Value
CLASS              string   true       clock
FILE_NAME          string   true       .../zynq7_sys_processing_system7_0_0.xdc
INPUT_JITTER       double   true       0.150
IS_GENERATED       bool     true       0
IS_PROPAGATED      bool     true       1
IS_USER_GENERATED  bool     true       0
IS_VIRTUAL         bool     true       0
LINE_NUMBER        int      true       20
NAME               string   true       clk_fpga_1
PERIOD             double   true       5.000
SOURCE_PINS        string*  true       i_zynq_sys/processing_system7_0/inst/PS7_i/FCLKCLK[1]
SYSTEM_JITTER      double   true       0.050
WAVEFORM           double*  true       0.000 2.500

 

Обратите внимание на то что при синтезе и при Open synthesys   разные исходные файлы  констрейнов для задания клоков - и соответственно имена тоже. 

 

Оба фала  присутствуют в списке фалов для синтеза но парсится при синтезе только system7_0_0_in_context.xdc.   Могу предположить что так как IP ядро синтезируется отдельно (в режиме out of context) то при последующем синтезе всего проекта используется только .xdc который при этом использовался и сохранен в .dcp корки. 
А вот при создании полного нетлиста уже используется нормальный zynq7_sys_processing_system7_0_0.xdc

 

Удачи! Rob.

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


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

Любопытно. С точки зрения построения клокового дерева, его вершина не может висеть в воздухе. Поэтому если смотреть хелп на sdc команду create_clock , то надо указывать реальный пин селла (к примеру, выход флопа) или макроблока (к примеру, выход pll), или же реальный входной пад. Но поскольку тулы часто делают поблажки разработчикам, то во многих тулах можно указать в качестве источника клока и просто иерархический пин в RTL, а тул уже сам пропагирует цепь вверх и найдет реальную вершину дерева.

Но в данном случае имеем, что тул не просто пропагирует цепь в поисках рут-пина, но еще и переименовывает название клока. Выглядит дико, но похоже это корень проблемы у топикстартера. И как по мне, это баг тула. Не должен клок переименовываться.

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


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

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

19 minutes ago, Aleх said:

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

В полном нетлисте конечно - но для синтеза отдельных  модулей достаточно считать какую-то точку (даже виртеальную) как референс  

19 minutes ago, Aleх said:

Но в данном случае имеем, что тул не просто пропагирует цепь в поисках рут-пина, но еще и переименовывает название клока.

Нет  -  переименовывает не Vivado,  а разработчик IP Zynq который в двух файлах констрейнов - для OOC синтеза  и для P&R  задавал разные имена клоков. 

### .dcp - zynq_sys_processing_system7_0_0_in_context.xdc
create_clock -period 10.000 [get_ports -no_traverse FCLK_CLK0]
create_clock -period 5.000 [get_ports -no_traverse FCLK_CLK1]
  
###  zynq_sys_processing_system7_0_0.xdc
create_clock -name clk_fpga_1 -period "5" [get_pins "PS7_i/FCLKCLK[1]"]
set_input_jitter clk_fpga_1 0.15
#The clocks are asynchronous, user should constrain them appropriately.#
create_clock -name clk_fpga_0 -period "10" [get_pins "PS7_i/FCLKCLK[0]"]
set_input_jitter clk_fpga_0 0.3

 

19 minutes ago, Aleх said:

И как по мне, это баг тула. Не должен клок переименовываться.

Как мне кажется в самом переименование  ничего плохого нет - даже наоборот  иногда достает  использовать каждый раз десятиэтажный мат   имя клока который tool автоматом сгенерировал. 

 

Удачи! Rob

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


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

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

45 minutes ago, RobFPGA said:

Нет  -  переименовывает не Vivado,  а разработчик IP Zynq который в двух файлах констрейнов - для OOC синтеза  и для P&R  задавал разные имена клоков. 

Даже не так - тут дело в идеологии при синтезе c модулями OOC, при этом нет полной иерархии проекта  - то есть  например  i_zynq_sys/processing_system7_0/inst/PS7_i/FCLKCLK[0]  при синтезе еще не виден так как часть .../inst/PS7_i/FCLKCLK[0] лежит внутри .dcp и будет доступна только в полном нетлисте.

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

set_clock_groups -name all_async -asynchromous \
  -group [get_clocks -include_generated_clocks  -of [get_pins {i_zynq_sys/processing_system7_0/FCLKCLK0}] \
  -group [get_clocks -include_generated_clocks clk51_25_in]

Удачи! Rob.

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


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

Если клок формируетя внутри корки, это объясняет его кривое название: авторам требовалось придумать 100% уникальное имя, вот они и привязались к иерархическому пути. Вполне себе вариант, разве только еще слэши и скобки заменить на подчеркивания, но это дело вкуса.

 

Как с этим поступать - опять же, дело вкуса. Я бы на месте ТС использовал названия клоков из корки (если это действительно тот самый кейс с коркой) один в один, чтобы не  было двух, настолько разных, наборов констрейнтов, и как напоминание, откуда они выходят.

Изменено пользователем Aleх

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


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

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

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

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

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

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

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

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

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

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