Vincoli di temporizzazione ASIC tramite SDC: come specificare correttamente un clock multiplexato?


10

introduzione

Avendo trovato informazioni multiple, a volte contrastanti o incomplete su Internet e in alcuni corsi di formazione su come creare correttamente i vincoli di temporizzazione nel formato SDC , vorrei chiedere aiuto alla comunità EE con alcune strutture generatrici di clock generali che ho incontrato.

So che ci sono differenze su come implementare una certa funzionalità su un ASIC o FPGA (ho lavorato con entrambi), ma penso che ci dovrebbe essere un modo generale e corretto per limitare i tempi di una determinata struttura , indipendentemente dal tecnologia di base - per favore fatemi sapere se mi sbaglio su questo.

Ci sono anche alcune differenze tra i diversi strumenti per l'implementazione e l'analisi dei tempi di diversi fornitori (nonostante Synopsys offra un codice sorgente parser SDC), ma spero che siano principalmente un problema di sintassi che può essere cercato nella documentazione.

Domanda

Si tratta della seguente struttura multiplexer di clock, che fa parte del modulo clkgen che fa di nuovo parte di un progetto più ampio: Schema del multiplexer di clock

Mentre ext_clksi presume che l' input sia generato esternamente al progetto (entrando attraverso un pin di input), i segnali clk0e clk4sono anche generati e utilizzati dal modulo clkgen (vedere la mia domanda relativa all'orologio a catena per dettagli) e hanno vincoli di clock associati denominati baseclke div4clk, rispettivamente.

La domanda è come specificare i vincoli in modo tale che l'analizzatore di temporizzazione

  1. Tratta cpu_clkcome un orologio multiplexato che può essere uno dei clock sorgente ( fast_clko slow_clkoppure ext_clk), tenendo conto dei ritardi attraverso le diverse porte AND e OR
  2. Allo stesso tempo, non tagliare i percorsi tra gli orologi di origine che vengono utilizzati altrove nel design.

Mentre il caso più semplice di un multiplexer di clock su chip sembra richiedere solo l' set_clock_groupsistruzione SDC :

set_clock_groups -logically_exclusive -group {baseclk} -group {div4clk} -group {ext_clk}

... nella struttura data, ciò è complicato dal fatto che clk0(tramite l' fast_clkoutput) e clk4(via slow_clk) sono ancora utilizzati nella progettazione, anche se cpu_clkè configurato per essere ext_clkquando use_extviene affermato solo .

Come descritto qui , il set_clock_groupscomando come sopra causerebbe quanto segue:

Questo comando equivale a chiamare set_false_path da ciascun orologio di ogni gruppo a ciascun orologio di ogni altro gruppo e viceversa

... che sarebbe errato, poiché gli altri orologi sono ancora usati altrove.

Informazioni aggiuntive

I use_clk0, use_clk4e use_extingressi sono generati in modo tale che solo uno di loro è elevata in un dato momento. Mentre questo potrebbe essere usato per fermare tutti gli orologi se tutti gli use_*input sono bassi, il focus di questa domanda è sulla proprietà multiplexing dell'orologio di questa struttura.

L' istanza X2 (un semplice buffer) nello schema è solo un segnaposto per evidenziare il problema degli strumenti automatici di posizionamento e instradamento che sono generalmente liberi di posizionare i buffer ovunque (come tra i pin and_cpu_1/ze or_cpu1/in2). Idealmente, i vincoli di temporizzazione dovrebbero essere inalterati da ciò.


Potresti provare a rendere questo più succinto restringendolo a una domanda molto specifica, molto stretta? È difficile per me capire quali sono le informazioni importanti e cosa stai veramente cercando qui.
Travisbartley,

@ trav1s: ho ristrutturato la domanda. Per favore fatemi sapere se avete bisogno di chiarimenti.
FriendFX,

Risposte:


3

Definisci la divisione per 1 clock sulle reti and_ * e dichiarale fisicamente esclusive. Il compilatore Cadence RTL gestisce correttamente la situazione generando 3 percorsi di temporizzazione per i registri con clock da cpu_clk (un percorso ciascuno per un clock). I registri gestiti direttamente da clk0, clk4 e clk_ext hanno i propri archi di temporizzazione.

create_generated_clock -source [get_ports clk0] \
-divide_by 1 -name and_clk0    [get_pins and_cpu_1/Y]

create_generated_clock -source [get_ports clk4] \
-divide_by 1 -name and_clk4    [get_pins and_cpu_2/Y]

create_generated_clock -source [get_ports clk_ext] \
-divide_by 1 -name and_clk_ext [get_pins and_cpu_ext1/Y]

set_clock_groups \
-physically_exclusive \
-group [get_clocks and_clk0] \
-group [get_clocks and_clk4] \
-group [get_clocks and_clk_ext]

Grazie per il tuo suggerimento Purtroppo al momento non posso verificarlo, ma il tuo concetto mi sembra abbastanza promettente. Potrebbe verificare se i percorsi tra cast_clk, cpu_clke slow_clksta ancora controllato (cioè non un'eccezione a causa dei gruppi di clock esclusivi), mentre allo stesso tempo essere vincolato dai rispettivi orologi d'ingresso? Alla fine, sto cercando una risposta autorevole a questa domanda.
FriendFX

@FriendFX Ho testato il codice nel compilatore RTL e i percorsi sono stati inferiti correttamente.
Revanth Kamaraj,

Solo per farvi sapere, ho aggiunto alcune informazioni sui multiplexer di clock a cella singola e una soluzione (almeno per alcuni strumenti).
FriendFX

1

Anche se questo è un vecchio thread senza risposta ... copre alcune nozioni di base sugli orologi sync vs asincroni

  • Fondamentalmente, gli orologi sincroni devono rimanere sincronizzati in fase con ritardi minimi aggiunti in modo che il Mux'ing non crei problemi.
    • Ciò si ottiene spesso ricampionando tutte le sorgenti di clock con gate a piena velocità.
  • Gli orologi asincroni non sono fondamentali per il cronometraggio, quindi sono consentiti ritardi. come Contatori di ondulazioni.

inserisci qui la descrizione dell'immagine


Grazie per aver esaminato questa vecchia domanda. Nel mio caso, non (voglio) risincronizzare gli orologi con l'orologio a piena velocità, come mostrato nel circuito. Manca ancora la parte principale della mia domanda, vale a dire le istruzioni SDC corrette per limitare questo circuito tenendo conto della sincronicità degli orologi sorgente e di quelli utilizzati nello stesso design sincrono, poiché il set_clock_groupscollegamento di esempio menzionato afferma di tagliare in modo errato i percorsi tra questi orologi.
FriendFX,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.