PLL input clock switch, timing violation

OP #4529682
Lesenswert?

Hallo zusammen

Ich möchte auf einem Max10 Device eine PLL mit zwei Input-Clocks 
(IFI_CLK, IFBOSC) mit Switchover-Möglichkeit betreiben. Die Clocks haben 
nominal dieselbe Frequenz (80 MHz).
Die Clock-Selektion ist quasi statisch (via Config-Register).

Eine Clock-Übersich findet sich in ClockSummary.png, die Timing-Fehler 
in TimingReport.png

Da die Clocks ja nicht dynamisch gewechselt werden sind meiner Meinung 
nach dieses Fehler zwischen den Domains irrelevant und ich versuche sie 
mit einem False-Path zu vermeiden (*.sdc):
1
create_clock -name {IFI_CLK} -period 12.500 -waveform { 0.000  6.250 } [get_ports {IFI_CLK}]
2
create_clock -name {IFBOSC}  -period 12.500 -waveform { 0.000  6.250 } [get_ports {IFBOSC}]
3
set_false_path  -from  [get_clocks {IFI_CLK}]  -to  [get_clocks {IFBOSC}]

Wie werde ich die Violations los?
Angehängte Dateien:
#4531983
Lesenswert?

Die Timing-Violations sind ja anscheinend bei den Clocks der 
PLL-Outputs?
Die Du per derive_pll_clocks "automatisch" bekannt machst?

Ich würde die PLL-clocks mit

create_clock_groups -exclusive ...

im SDC File voneinander unabhängig machen. Das ist eigentlich genau 
dafür vorgesehen.
OP #4533574
Lesenswert?

Markus W. schrieb:
> Worin besteht eigentlich der Unterschied zwischen den Takten, wenn sie
> beide dieselbe Frequenz besitzen? Phase?

Die Clocks haben unterschiedliche Quellen, haben also nur nominell 
dieselbe Frequenz, und die Phase ist beliebig.
Einer (IFBOSC) ist immer präsent, der andere (IFI_CLK) nur wenn das 
System nicht in Powerdown ist. Im Betriebsfall soll IFI_CLK benutzt 
werden um Source-Synchron arbeiten zu können.

Markus F. schrieb:
> Die Timing-Violations sind ja anscheinend bei den Clocks der
> PLL-Outputs?
> Die Du per derive_pll_clocks "automatisch" bekannt machst?

Genau. Das "derive_pll_clocks" folgt im .sdc, hab es nur nicht 
angehängt.

Was ich nicht verstehe: Ich habe die PLL wahlweise entweder an IFBOSC 
oder IFI_CLK (siehe "MASTER" im neuen Anhang, im ersten wars nicht 
ersichtlich).
Laut Report wird daraus jeweils clk[n] vom einen und clk[n]~1 vom 
anderen generiert. Da die zwei Input-Clocks die PLL ja nie gleichzeitig 
speisen, kann ja nicht Launch vom einen und Latch vom anderen kommen.

Markus F. schrieb:
> create_clock_groups -exclusive

Funktioniert auch nicht. Offensichtlich propagiert er dieses "exclusive" 
nicht durch die PLL (habe den Command vor und nach dem derive_pll_clocks 
platziert, tu so oder so nicht).
Angehängte Dateien:
OP #4534045
Lesenswert?

Leider nein. oder ist da was faul?
1
create_clock -period 12.500 -waveform { 0.000  6.250 } -name IFI_CLK [get_ports {IFI_CLK}]
2
create_clock -period 12.500 -waveform { 0.000  6.250 } -name IFBOSC  [get_ports {IFBOSC}]
3
derive_pll_clocks
4
derive_clock_uncertainty
5
set_clock_groups -exclusive -group {IFI_CLK} -group {IFBOSC}
OP #4534753
Lesenswert?

Markus F. schrieb:
> Denk' ich mir. Ich hatte befürchtet, das TimeQuest nicht so schlau ist.

Eigentlich bedenklich, weil ja das Manual genau diese Vorgehen vorsieht.

Immerhin, folgender Ansatz hat für den Augenblick "works-for-me"-Status:
1
set_false_path -from [get_clocks {PLS|altpll_component|auto_generated|pll1|clk[*]}]   -to [get_clocks {PLS|altpll_component|auto_generated|pll1|clk[*]~1}]
2
set_false_path -from [get_clocks {PLS|altpll_component|auto_generated|pll1|clk[*]~1}] -to [get_clocks {PLS|altpll_component|auto_generated|pll1|clk[*]}]

Zu hoffen ist, dass Quartus konsequent clk[*] als IFBOSC-Abkömmling, 
clk[*]~1 als IFI_CLK-Abkömmling behandelt, sonst ist das Durcheinander 
perfekt...
...so gesehen wäre es mir bedeutend wohler, wenn das set_clock_groups 
schon auf den Original-Clocks funktioniert hätte.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren