Forum: FPGA, VHDL & Co. PLL input clock switch, timing violation


von P. K. (pek)


Angehängte Dateien:

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?

von Michael W. (Gast)


Lesenswert?

Ein Timing Ignore setzen?

Worin besteht eigentlich der Unterschied zwischen den Takten, wenn sie 
beide dieselbe Frequenz besitzen? Phase?

von Markus F. (mfro)


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.

von P. K. (pek)


Angehängte Dateien:

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).

von Stefan Weide (Gast)


Lesenswert?

Laut 
https://www.altera.com/en_US/pdfs/literature/manual/mnl_timequest_cookbook.pdf 
sollte folgendes Costraint dein Problem lösen:
1
set_clock_groups -exclusive -group {IFI_CLK} -group {IFBOSC}

von P. K. (pek)


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}

von Markus F. (mfro)


Lesenswert?

P. K. schrieb:
> Markus F. schrieb:
>> create_clock_groups -exclusive
>
> Funktioniert auch nicht.

Denk' ich mir. Ich hatte befürchtet, das TimeQuest nicht so schlau ist.

Ich habe die clock groups bei mir auf die erzeugten PLL-clocks 
definiert.

Dann tut's.

von P. K. (pek)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.