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

    

Вопрос по TimeQuest

Приветствую. Тестовый проект прикреплен ниже. Сам модуль:

module add_three_numbers
(
input clock,
input [7:0] A,
input [7:0] B,
input [7:0] C,
input [7:0] D,
output [7:0] sum
);

reg [7:0] reg_A, reg_B, reg_C, reg_D;
reg [7:0] reg_sum;

reg [7:0] sum1, sum2;
reg [7:0] sum3;


always@(posedge clock)begin	
	reg_A <= A;
	reg_B <= B;
	reg_C <= C;	
	reg_D <= D;		
end	

always@(posedge clock)begin
	sum1 <= reg_A + reg_B;
	sum2 <= reg_C + reg_D;
	sum3 <= sum1 + sum2;		
end


always@(posedge clock)begin	
	reg_sum <= sum3;
end

assign sum = reg_sum;

endmodule

 

SDC файл:

 

create_clock -name {clock} -period 400Mhz [get_ports {clock}]

 

Входные/выходные порты идут на ножки FPGA. Ругается на путь от reg_B[7] до sum1[7], смотрю как разбросал все в ChipPlanner-e. Если в Chip Planner-e подвинуть reg_B[7] максимально близко к sum1[7] и применить изменения в нетлисте, то все тайминги соблюдаются. Вопрос - почему автоматом не хочет поставить ячейки в нужные места (куча свободных ресурсов), чтоб все тайминги соблюдались.

test.rar

post-63539-1516098301_thumb.jpg

post-63539-1516098307_thumb.jpg

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


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

create_clock -name {clock} -period 400Mhz [get_ports {clock}]

Что-то, SDC файл через чур уж лаконичен.

 

Следует добавить:

set_input_delay -clock clock -min 0.8 [get_ports {A[*]}]
set_input_delay -clock clock -max 1.6 [get_ports {A[*]}]
...
set_output_delay -clock clock -min 0.0 [get_ports {sum[*]}]
set_output_delay -clock clock -max 0.2 [get_ports {sum[*]}]

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


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

Он-то локаничен, но почему есть возможность вручную подправить разводку, когда автоматом никак не хочет?

 

Что по умолчанию применяется для input_/output_delay?

Следует добавить:

set_input_delay -clock clock -min 0.8 [get_ports {A[*]}]
set_input_delay -clock clock -max 1.6 [get_ports {A[*]}]
...
set_output_delay -clock clock -min 0.0 [get_ports {sum[*]}]
set_output_delay -clock clock -max 0.2 [get_ports {sum[*]}]

Поясните - откуда значения задержек брать?

 

create_clock -name {clock} -period 400Mhz [get_ports {clock}]

set_input_delay -clock [get_clocks clock] -min 0.8 [get_ports A[*]]
set_input_delay -clock [get_clocks clock] -max 1.6 [get_ports A[*]] -add_delay

set_input_delay -clock [get_clocks clock] -min 0.8 [get_ports B[*]]
set_input_delay -clock [get_clocks clock] -max 1.6 [get_ports B[*]] -add_delay

set_input_delay -clock [get_clocks clock] -min 0.8 [get_ports C[*]]
set_input_delay -clock [get_clocks clock] -max 1.6 [get_ports C[*]] -add_delay

set_input_delay -clock [get_clocks clock] -min 0.8 [get_ports D[*]]
set_input_delay -clock [get_clocks clock] -max 1.6 [get_ports D[*]] -add_delay

set_output_delay -clock [get_clocks clock] -min 0.0 [get_ports sum[*]]
set_output_delay -clock [get_clocks clock] -max 0.2 [get_ports sum[*]] -add_delay

derive_clock_uncertainty

 

Стало только хуже.

post-63539-1516101839_thumb.jpg

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


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

Читайте handbook Quartus'а или хотя бы an433.

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


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

Вопрос остался. Если убрать один регистр с выхода, то разведет все правильно (автоматом!!!)

module add_three_numbers
(
input clock,
input [7:0] A,
input [7:0] B,
input [7:0] C,
input [7:0] D,
output [7:0] sum
);

reg [7:0] reg_A, reg_B, reg_C, reg_D;
reg [7:0] reg_sum;

reg [7:0] sum1, sum2;
reg [7:0] sum3;


always@(posedge clock)begin	
	reg_A <= A;
	reg_B <= B;
	reg_C <= C;	
	reg_D <= D;		
end	

always@(posedge clock)begin
	sum1 <= reg_A + reg_B;
	sum2 <= reg_C + reg_D;
	sum3 <= sum1 + sum2;		
end


//	always@(posedge clock)begin	
//		reg_sum <= sum3;
//	end

//	assign sum = reg_sum;
       assign sum = sum3;

endmodule

 

Тут в SDC определено только значение clock.

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


Ссылка на сообщение
Поделиться на другие сайты
Тут в SDC определено только значение clock.

— Видишь суслика?

— Нет!

— И я не вижу. А он есть!

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


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

— Нет!

— И я не вижу. А он есть!

Нет...ну вот привязался...

Спасибо, гуглом я умею пользоваться. Вопрос в том, когда я не задаю вх/выходные задержки (только клок), QII применяет для них какие-то значения по умолчанию и разводит схему криво (!!!), но руками можно "довести её до ума" при тех же условиях, что мешает QII сделать это автоматом (если вручную можно - то должен быть способ сделать это автоматом!).

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


Ссылка на сообщение
Поделиться на другие сайты
Вопрос в том, когда я не задаю вх/выходные задержки (только клок), ...

А что пишут в add_three_numbers.sta.rpt?

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


Ссылка на сообщение
Поделиться на другие сайты
Спасибо, гуглом я умею пользоваться. Вопрос в том, когда я не задаю вх/выходные задержки (только клок), QII применяет для них какие-то значения по умолчанию и разводит схему криво (!!!), но руками можно "довести её до ума" при тех же условиях, что мешает QII сделать это автоматом (если вручную можно - то должен быть способ сделать это автоматом!).

1. Вы не привели настройки для квартуса(синтез/фиттер).Может автофит стоит.

2. Распиновка жесткая?

3. Если входы и выход на разных концах плисины стоят, то может и не вытянуть при заданной частоте.

4. У Вас есть уверенность, что клок пошел по клоковой дорожке, а не обычной линии? Ощущение возникло, что после добавления ограничений на входы/выходы клок пошел обычным путем, отсюда ухудшение разводки, но их в любом случае требуется задать и, возможно, изменить немного архитектуру - входы на fast input/output register по обычному клоку, а логику по частоте с выхода pll, но это уже по документации и примерам.

ЗЫ. У меня, к сожалению, нет возможности скачать Ваш проект.

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


Ссылка на сообщение
Поделиться на другие сайты
1. Вы не привели настройки для квартуса(синтез/фиттер).Может автофит стоит.

2. Распиновка жесткая?

 

QSF-file:

# -------------------------------------------------------------------------- #
#
# Copyright © 2016  Intel Corporation. All rights reserved.
# Your use of Intel Corporation's design tools, logic functions 
# and other software and tools, and its AMPP partner logic 
# functions, and any output files from any of the foregoing 
# (including device programming or simulation files), and any 
# associated documentation or information are expressly subject 
# to the terms and conditions of the Intel Program License 
# Subscription Agreement, the Intel Quartus Prime License Agreement,
# the Intel MegaCore Function License Agreement, or other 
# applicable license agreement, including, without limitation, 
# that your use is for the sole purpose of programming logic 
# devices manufactured by Intel and sold by Intel or its 
# authorized distributors.  Please refer to the applicable 
# agreement for further details.
#
# -------------------------------------------------------------------------- #
#
# Quartus Prime
# Version 16.1.0 Build 196 10/24/2016 SJ Standard Edition
# Date created = 11:20:56  January 12, 2018
#
# -------------------------------------------------------------------------- #
#
# Notes:
#
# 1) The default values for assignments are stored in the file:
#		test_00_assignment_defaults.qdf
#    If this file doesn't exist, see file:
#		assignment_defaults.qdf
#
# 2) Altera recommends that you do not modify this file. This
#    file is updated automatically by the Quartus Prime software
#    and any changes you make may be lost or overwritten.
#
# -------------------------------------------------------------------------- #


set_global_assignment -name FAMILY "Cyclone V"
set_global_assignment -name DEVICE 5CEBA4F17I7
set_global_assignment -name TOP_LEVEL_ENTITY add_three_numbers
set_global_assignment -name ORIGINAL_QUARTUS_VERSION 16.1.0
set_global_assignment -name PROJECT_CREATION_TIME_DATE "11:20:56  JANUARY 12, 2018"
set_global_assignment -name LAST_QUARTUS_VERSION "16.1.0 Standard Edition"
set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
set_global_assignment -name MIN_CORE_JUNCTION_TEMP "-40"
set_global_assignment -name MAX_CORE_JUNCTION_TEMP 100
set_global_assignment -name DEVICE_FILTER_PIN_COUNT 256
set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 256
set_global_assignment -name VERILOG_FILE top.v
set_global_assignment -name SDC_FILE top.sdc
set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW"
set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)"
set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top
set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
set_location_assignment PIN_A3 -to A[0]
set_location_assignment PIN_A4 -to A[1]
set_location_assignment PIN_A5 -to A[2]
set_location_assignment PIN_A7 -to A[3]
set_location_assignment PIN_A8 -to A[4]
set_location_assignment PIN_A9 -to A[5]
set_location_assignment PIN_B6 -to A[6]
set_location_assignment PIN_B7 -to A[7]
set_location_assignment PIN_B10 -to B[0]
set_location_assignment PIN_C9 -to B[1]
set_location_assignment PIN_C10 -to B[2]
set_location_assignment PIN_B11 -to B[3]
set_location_assignment PIN_C11 -to B[4]
set_location_assignment PIN_D11 -to B[5]
set_location_assignment PIN_A12 -to B[6]
set_location_assignment PIN_A13 -to B[7]
set_location_assignment PIN_B16 -to C[0]
set_location_assignment PIN_C16 -to C[1]
set_location_assignment PIN_D16 -to C[2]
set_location_assignment PIN_E16 -to C[3]
set_location_assignment PIN_C15 -to C[4]
set_location_assignment PIN_D14 -to C[5]
set_location_assignment PIN_D13 -to C[6]
set_location_assignment PIN_F15 -to C[7]
set_location_assignment PIN_G16 -to sum[0]
set_location_assignment PIN_H16 -to sum[1]
set_location_assignment PIN_J16 -to sum[2]
set_location_assignment PIN_G15 -to sum[3]
set_location_assignment PIN_K16 -to sum[4]
set_location_assignment PIN_K15 -to sum[5]
set_location_assignment PIN_L15 -to sum[6]
set_location_assignment PIN_L14 -to sum[7]
set_location_assignment PIN_J14 -to sum[8]
set_location_assignment PIN_J12 -to sum[9]
set_location_assignment PIN_F12 -to clock
set_location_assignment PIN_T15 -to D[0]
set_location_assignment PIN_T14 -to D[1]
set_location_assignment PIN_R16 -to D[2]
set_location_assignment PIN_R14 -to D[3]
set_location_assignment PIN_P16 -to D[4]
set_location_assignment PIN_P14 -to D[5]
set_location_assignment PIN_P13 -to D[6]
set_location_assignment PIN_M13 -to D[7]
set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS ON
set_global_assignment -name SMART_RECOMPILE ON
set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top

 

 

3. Если входы и выход на разных концах плисины стоят, то может и не вытянуть при заданной частоте.

А почему же тогда ручками можно подправить один путь, чтоб вытянуло? Это больше всего смущает. Почему QII (такой умный) не смог заметить очевидное решение! Я понимаю, что не всё ему описал, но он уже тут накосячил, зачем ещё что-то "ограничивать".

 

4. У Вас есть уверенность, что клок пошел по клоковой дорожке, а не обычной линии? Ощущение возникло, что после добавления ограничений на входы/выходы клок пошел обычным путем, отсюда ухудшение разводки, но их в любом случае требуется задать и, возможно, изменить немного архитектуру - входы на fast input/output register по обычному клоку, а логику по частоте с выхода pll, но это уже по документации и примерам.

На глобальной линии сидит (см. рис.).

 

 

А что пишут в add_three_numbers.sta.rpt?

Добавил файлик.

post-63539-1516109516_thumb.jpg

test_00.sta.rpt.txt

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


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

Не увидел настроек Fitter_effort и optimization_technique. Не знаю, каким образом может повлиять настройка smart_recompile, если менять только ограничения, по идее - никак.

На глобальной линии сидит (см. рис.).

Значит с этим все в порядке.

А почему же тогда ручками можно подправить один путь, чтоб вытянуло? Это больше всего смущает. Почему QII (такой умный) не смог заметить очевидное решение! Я понимаю, что не всё ему описал, но он уже тут накосячил, зачем ещё что-то "ограничивать".

Если речь идет о пути сигнала reg_B->sum1, то есть еще путь от B до reg_B - о нем мне ничего не известно - укорачивая путь описанным образом от reg_B до sum1 Вы удлиняете путь от B до reg_B.

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


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

Из которого следует, что на 400 МГц этот проект работать не будет. :biggrin:

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


Ссылка на сообщение
Поделиться на другие сайты
Из которого следует, что на 400 МГц этот проект работать не будет. :biggrin:

Да не будет, но после правки руками говорит, что будет работать!? Врёт?

И даже говорит что будет на 446 МГц работать (после замены местоположения одного регистра)!

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


Ссылка на сообщение
Поделиться на другие сайты
Из которого следует, что на 400 МГц этот проект работать не будет. :biggrin:

А что Вы хотели увидеть, это отчет из поста 3 с Вашими ограничениями.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация