Moderne digitale logische apparaten zijn meestal (*) ontworpen met 'synchrone ontwerppraktijk': een wereldwijd synchrone edge-triggered register-transfer design style (RTL): alle sequentiële circuits worden opgesplitst in edge-triggered registers die zijn verbonden met de globale kloksignaal CLK en pure combinationele logica.
Die ontwerpstijl stelt mensen in staat om snel digitale logische systemen te ontwerpen zonder rekening te houden met timing. Hun systeem zal "gewoon werken" zolang er genoeg tijd is van de ene klokflank naar de volgende om de interne toestand tot rust te laten komen.
Met deze ontwerpstijl, klokafwijking en andere timinggerelateerde problemen zijn niet relevant, behalve voor het uitzoeken "Wat is de maximale kloksnelheid voor dit systeem?".
Wat is kloksnelheid precies?
Bijvoorbeeld:
... R1 - register 1 R3 + - + -> | | ------ > (combinatief) + - + ...- > | | ------ > (logica) -> | | --... -> | ^ | ------ > () -> | ^ | + - + () + - + | + --- > () | CLK | + -> () CLK | | R2: | | + - + | | ... - > | | -> + | -> | ^ | -> - + + - + | CLK
In echte hardware schakelt het "CLK" -signaal nooit echt exact tegelijk bij elk register. De klokafwijking Tskew is de vertraging van de stroomafwaartse klok ten opzichte van de stroomopwaartse klok ( a):
Tskew (bron, bestemming) = bestemming_tijd - bron_tijd
waarbij source_time de tijd is van een actieve klokflank bij het stroomopwaartse bronregister (in dit geval R1 of R2), en bestemmingstijd de tijd is van 'dezelfde' actieve klokflank op een stroomafwaarts bestemmingsregister (in dit geval, R3).
- negatieve kloksnelheid: de CLK op R3 schakelt voor de klok op R1.
- positieve kloksnelheid: de CLK op R3 schakelt na de klok op R1.
Wat is het effect van klokafwijking?
(misschien zou een timingdiagram hier dit duidelijker maken)
Om dingen goed te laten werken, zelfs in het ergste geval, mogen de invoer van R3 niet veranderen tijdens de insteltijd of de vasthoudtijd van R3. Aan de andere kant, erger nog, om dingen goed te laten werken, moeten we dingen zo ontwerpen dat:
Tskew (R1, R3) < Tco - Th.
Tclk_min = Tco + Tcalc + Tsu - Tskew (R1, R3).
waar:
- Tcalc is de maximale worst-case afwikkelingstijd van een blok combinatorische logica waar dan ook in het systeem. (Soms kunnen we het blok combinatielogica dat zich op het kritieke pad bevindt opnieuw ontwerpen, onderdelen stroomopwaarts of stroomafwaarts duwen, of een andere fase van pijplijnleiding invoegen, zodat het nieuwe ontwerp een kleinere Tcalc heeft, waardoor we de kloksnelheid kunnen verhogen) .
- Tclk_min is de minimale tijdsperiode van de ene actieve klokflank tot de volgende actieve klokflank. We berekenen het op basis van de bovenstaande vergelijking.
- Tsu is de insteltijd van het register. De registerfabrikant verwacht van ons dat we een klok gebruiken die traag genoeg is om altijd aan deze eis te voldoen.
- Dit is de houdtijd van het register. De registerfabrikant verwacht van ons dat we de kloksnelheid voldoende beheersen om altijd aan deze eis te voldoen.
- Tco is de klok-naar-uitgangsvertraging (propagatietijd). Na elke actieve klokflank gaan R1 en R2 door met het aansturen van de oude waarden naar de combinatielogica gedurende een korte tijd Tco alvorens over te schakelen naar de nieuwe waarden. Dit wordt bepaald door de hardware en gegarandeerd door de fabrikant, maar alleen zolang we voldoen aan de Tsu en Th en andere eisen die de fabrikant stelt voor normaal gebruik.
Te veel positieve scheefheid is een regelrechte ramp. Te veel positieve scheeftrekking kan (met sommige gegevenscombinaties) 'sneakpath' veroorzaken, zodat in plaats van R3 de 'juiste gegevens' vergrendeld worden op klok N + 1 (een deterministische functie van de gegevens die eerder zijn vergrendeld in R1 en R2 op klok N) kunnen de nieuwe gegevens die zijn vergrendeld in R1 en R2 op klok N + 1 erdoorheen lekken, de combinatielogica verstoren en ervoor zorgen dat verkeerde gegevens worden vergrendeld in R3 op "dezelfde" klokflank N + 1.
Elke hoeveelheid negatieve scheeftrekking kan worden 'gefixeerd' door de kloksnelheid te vertragen. Het is alleen 'slecht' in de zin dat het ons dwingt om het systeem met een lagere kloksnelheid te laten werken, om de invoer van R3 tijd te geven aan settelen nadat R1 en R2 nieuwe gegevens vergrendelen op klokflank N, en later vergrendelt R3 het resultaat op "de volgende" klokflank N + 1.
Veel systemen gebruiken een klokdistributienetwerk die de skew tot nul probeert te verminderen. contra-intuïtief, door voorzichtig vertragingen toe te voegen langs het klokpad - het pad van de klokgenerator naar de CLK-ingang van elk register - is het mogelijk om de ap bovenliggende snelheid waarmee het klokflank golffront fysiek reist van de CLK-invoer van het ene register naar de CLK-invoer van het volgende register, sneller dan de lichtsnelheid.
De Altera-documentatie vermeldt
"Vermijd het gebruik van combinatielogica in klokpaden, omdat dit bijdraagt aan klokafwijking."
Dit verwijst naar het feit dat veel mensen HDL schrijven dat wordt gecompileerd op een FPGA op een manier die er op de een of andere manier voor zorgt dat iets anders dan het globale CLK-signaal de lokale CLK-invoer van sommige registers aanstuurt (dit kan "klokpoort" -logica zijn, zodat nieuwe waarden alleen in een register worden geladen als aan bepaalde voorwaarden is voldaan; of "klokverdeler" -logica die slechts 1 van de N-klokken doorlaat, of enz.).
Die lokale CLK is meestal op de een of andere manier afgeleid van de globale CLK - de globale CLK tikt, en dan verandert ofwel de lokale CLK niet, of (een korte vertraging na de globale CLK om het signaal door dat "iets anders" te verspreiden) de lokale CLK verandert één keer.
Wanneer dat "iets anders" de CLK van het stroomafwaartse register (R3) aanstuurt, wordt de scheeftrekking positiever. Wanneer dat "iets anders" de CLK van het stroomopwaartse register aanstuurt (R1 of R2), het maakt de scheefheid negatiever. Af en toe hebben wat de CLK van het stroomopwaartse register en wat de CLK van het stroomafwaartse register ook aandrijft, praktisch dezelfde vertraging, waardoor de scheefheid tussen hen praktisch nul is.
Het klokdistributienetwerk binnen sommige ASIC's is opzettelijk ontworpen met kleine hoeveelheden positieve klokafwijking op sommige registers, waardoor de combinatielogica stroomopwaarts iets meer tijd heeft om tot rust te komen en dus het hele systeem kan worden gebruikt met een hogere kloksnelheid. Dit wordt "clock skew optimiza" genoemd tion "of" clock skew scheduling ", en is gerelateerd aan" retiming ".
Ik ben nog steeds verbijsterd door het set_clock_uncertainty
-commando - waarom zou ik de skew ooit "handmatig" willen specificeren?
(*) Een uitzondering: asynchrone systemen.