Mots-clés : source d'horloge, décalage d'horloge, gigue d'horloge, temps de transition d'horloge, latence d'horloge, arbre d'horloge, horloge à double front

Presque toute conception numérique un tant soit peu complexe est indissociable des horloges. Les horloges constituent également le fondement de toute logique séquentielle. Lors de l'introduction précédente des temps d'établissement et de maintien, le concept de décalage d'horloge a également été abordé. Ci-dessous, nous allons résumer les connaissances sur les horloges afin de mieux réaliser la conception numérique.

Source d'horloge

Selon la position de la source d'horloge dans le module de conception numérique, les sources d'horloge peuvent être divisées en sources d'horloge externes et sources d'horloge internes.

Source d'horloge externe :

Circuit oscillateur RC/LC : Il utilise des circuits à rétroaction positive ou négative pour générer des signaux d'horloge variant périodiquement. Ce type de source d'horloge présente un circuit simple et une large plage de fréquences, mais la fréquence de fonctionnement est faible et la stabilité n'est pas élevée.

Oscillateur à quartz passif/actif : Il utilise l'effet piézoélectrique des cristaux de quartz (la pression et les signaux électriques peuvent être convertis l'un en l'autre) pour générer des signaux résonants. Ce type de source d'horloge présente une grande précision de fréquence, une bonne stabilité, un faible bruit et une faible dérive en température. Les oscillateurs actifs intègrent souvent aussi un contrôle de tension ou une compensation en température, ce qui donne à l'horloge de bonnes caractéristiques de phase et de fréquence. Cependant, la mise en œuvre du circuit est relativement complexe, la bande de fréquences est étroite et la fréquence est pratiquement non réglable.

Lors du débogage de circuits spécifiques, on utilise souvent des sources d'horloge générées par certains circuits spécialement conçus (tels que des déclencheurs de Schmitt) ou par des équipements générateurs de signaux.

Source d'horloge interne :

Boucle à verrouillage de phase (PLL) :

Elle utilise un signal de référence fourni en entrée externe pour contrôler la fréquence et la phase du signal d'oscillation à l'intérieur de la boucle, réalisant un suivi automatique de la fréquence du signal de sortie sur la fréquence du signal d'entrée, et multiplie le signal vers une fréquence fixe plus élevée par un chemin de rétroaction.

Les oscillateurs à quartz ordinaires, pour des raisons de procédé et de coût, ne peuvent pas atteindre des fréquences très élevées. L'utilisation d'un circuit PLL permet d'obtenir une horloge stable et à haute fréquence. Intégrer une PLL dans le module de conception peut garantir de bonnes performances en termes de délai et de stabilité pour les circuits numériques.

Division d'horloge :Certains modules fonctionnent à une fréquence inférieure à la fréquence d'horloge système. Dans ce cas, l'horloge système doit être divisée pour obtenir une horloge de fréquence plus basse.

Compter et générer des signaux d'horloge dans un bloc always est une méthode courante pour les diviseurs de fréquence. Pour la logique d'implémentation de rapports de division arbitraires, voir la section suivante, « 5.3 Horloge ».

Commutation d'horloge :La fréquence de fonctionnement du système ou de certains modules change parfois dans des conditions spécifiques, par exemple, une réduction de fréquence est nécessaire en mode faible consommation, et une augmentation de fréquence est nécessaire pour améliorer la capacité de calcul. Dans de tels cas, le système dispose souvent de plusieurs sources d'horloge pour la commutation d'horloge lorsque cela est nécessaire.

Si la logique de commutation d'horloge n'est pas optimisée, des interférences de type glitch/spike sont susceptibles de se produire pendant la période de transition de commutation, affectant négativement le circuit. Pour une logique de commutation sûre, voir le chapitre ultérieur : « 5.4 Commutation d'horloge ».

Les systèmes numériques adoptent souvent un schéma avec une entrée d'oscillateur à quartz externe et une multiplication de fréquence PLL interne. Ensuite, une division d'horloge ou une commutation d'horloge est effectuée selon les exigences de conception.

Caractéristiques d'horloge

Pendant la simulation, toutes les horloges synchrones sont idéales : les transitions d'horloge sont instantanées, les fronts d'horloge entre les modules sont alignés, avec délai et sans gigue. Dans les circuits réels, les horloges présentent un délai lors de la transmission et de la commutation. Une conception numérique parfaite devrait également prendre en compte ces caractéristiques d'horloge imparfaites, sinon elle peut provoquer des violations de timing dans la conception.

Voici une brève description de quelques caractéristiques d'horloge.

Décalage d'horloge

En raison du délai de réseau, lorsque le signal d'horloge atteint les ports des bascules, il ne peut être garanti que les fronts d'horloge aux ports des bascules soient alignés, c'est-à-dire que les phases d'horloge aux différents ports de bascules diffèrent. Cette différence est appelée décalage d'horloge. Le schéma est le suivant :

En général, le décalage d'horloge n'a pas de relation directe avec la fréquence d'horloge ; il est lié à des facteurs tels que la longueur de routage, la capacité de charge et le nombre de charges.

Gigue d'horloge

Par rapport au front d'horloge idéal, le décalage dans une horloge réelle qui ne s'accumule pas au fil du temps et qui est tantôt en avance, tantôt en retard est appelé gigue d'horloge. La gigue d'horloge peut être décrite quantitativement par la fréquence de gigue et l'amplitude de gigue. En conception numérique, la gigue d'horloge est toujours décrite en termes de temps. Le schéma est le suivant.

La gigue d'horloge peut être divisée en gigue aléatoire et gigue déterministe.

La gigue aléatoire provient du bruit thermique, du procédé des semi-conducteurs, etc.

La gigue déterministe provient des alimentations à découpage, des interférences électromagnétiques ou d'autres placements et routages non raisonnables, etc.

Dans l'outil de synthèse Design Compiler, le décalage d'horloge et la gigue sont uniformément représentés par la valeur d'incertitude.

Temps de transition

Lorsque l'horloge passe d'un front montant à un front descendant, ou d'un front descendant à un front montant, la transition de niveau n'est pas une « montée et descente verticales » instantanée sans nécessiter de temps ; au contraire, elle est « en rampe » et nécessite un temps de transition pour achever le changement de niveau. Ce temps de transition est appelé temps de transition d'horloge. Le schéma est le suivant.

L'ampleur du temps de transition est liée au procédé de la bibliothèque de cellules, à la charge capacitive, etc.

Latence d'horloge

Le temps de retard de l'horloge depuis la source d'horloge (par exemple, un oscillateur à quartz, une PLL ou la sortie d'un diviseur de fréquence) jusqu'au port de la bascule est appelé latence d'horloge. La latence d'horloge comprend la latence de source et la latence de réseau, comme le montre la figure ci-dessous.

La latence de source est le temps de propagation du signal d'horloge depuis l'origine réelle de l'horloge jusqu'au point de définition de l'horloge du module de conception. Dans la figure ci-dessus, elle est indiquée comme 3ns.

La latence réseau est le temps de propagation depuis le point de définition de l'horloge du module de conception jusqu'à la borne d'horloge de la bascule à l'intérieur du module. Le chemin de propagation peut traverser un tampon. Dans la figure ci-dessus, elle est indiquée comme 1ns.

La latence de source est le retard commun à toutes les bascules du module de conception, elle n'affecte donc pas le décalage d'horloge.

Arbre d'horloge

En conception numérique, chaque module doit utiliser des circuits d'horloge synchrones. Dans un circuit synchrone, les bascules pilotées par le même signal d'horloge forment ensemble un domaine d'horloge. Dans un circuit idéal, le signal d'horloge arriverait simultanément aux bornes d'horloge de toutes les bascules du même domaine d'horloge. Cependant, en pratique, en raison de divers retards, cette caractéristique d'horloge sans retard est difficile à obtenir. De plus, la capacité de pilotage d'un signal d'horloge est limitée, ce qui rend difficile de fournir indépendamment un fan-out efficace pour un domaine d'horloge contenant de nombreuses bascules. Pour résoudre les problèmes de retard d'horloge et de pilotage, un système d'arbre d'horloge est nécessaire pour gérer le signal d'horloge, garantissant un bon timing et une bonne capacité de pilotage.

Un arbre d'horloge est une structure de réseau construite en équilibrant de nombreuses cellules tampons. Il est généralement construit à partir d'un unique point source d'horloge à travers des étages de cellules tampons. La structure réelle de l'arbre d'horloge avec des tampons d'horloge ajoutés (les modules triangulaires orange dans la figure) est présentée ci-dessous.

Le symbole de front montant bleu représente le temps de transition d'horloge. La ligne pleine rouge représente la latence d'horloge, y compris le délai réseau et la latence de source. La ligne en pointillé verte représente l'incertitude d'horloge, y compris le décalage d'horloge et la gigue d'horloge.

L'arbre d'horloge n'est pas utilisé pour réduire le temps que met le signal d'horloge à atteindre chaque bascule, mais pour réduire l'écart de temps entre les arrivées aux bascules. Généralement, les concepteurs backend réalisent la conception de l'arbre d'horloge en insérant des tampons d'horloge. Les concepteurs frontend doivent généralement s'assurer de la justesse du schéma d'horloge et de la fonctionnalité logique numérique.

Autres classifications d'horloge :

Horloges synchrones et asynchrones

"4.1 Synchrone et asynchrone"contient une explication détaillée. Lorsque des horloges partagent la même source et satisfont une relation de multiple entier, elles peuvent généralement être considérées comme synchrones. La définition des horloges synchrones en conception numérique est relativement large. La logique au sein d'un même domaine d'horloge ne nécessite pas de traitement de synchronisation.

Ensuite, nous comprenons le concept d'horloge synchrone du point de vue des circuits synchrones.

Un circuit synchrone est un circuit composé de circuits logiques séquentiels et combinatoires. Sa caractéristique est que les bornes d'horloge de toutes les bascules sont reliées ensemble et connectées à la borne d'horloge système. L'état du circuit ne peut changer que lorsqu'une impulsion d'horloge arrive. L'état modifié est maintenu jusqu'à l'arrivée de l'impulsion d'horloge suivante. Pendant cette période, que l'entrée externe x change ou non, chaque état de la table d'états est stable.

Horloge à porte

Le principe de base d'une horloge à porte : lorsque le signal de validation est actif, l'horloge est activée. Lorsque le signal de validation est inactif, l'horloge est désactivée.

Comme l'horloge à porte peut désactiver l'horloge de travail aux moments appropriés, les horloges à porte sont largement utilisées dans la conception à faible consommation. La logique d'implémentation la plus simple d'une horloge à porte consiste à effectuer directement un ET logique entre le signal de validation et le signal d'horloge, mais cela n'est pas sûr et sujet aux parasites. Pour une introduction détaillée aux horloges à porte, veuillez vous référer à "6.4 Conception à faible consommation au niveau RTL (Partie 2)".

Horloge à double front

Certains modules peuvent effectuer une transmission de données sur les fronts montant et descendant de l'horloge, ce qui permet d'obtenir un débit de données doublé.

La SDRAM DDR (Double Data Rate) est un exemple typique d'utilisation de la transmission de données à double front.

Un schéma typique de transmission de données DDR est présenté ci-dessous.

Ensuite, une simulation simple est effectuée sur le comportement de la transmission de données à double front.

L'idée de conception de base est d'utiliser les deux fronts de l'horloge pour lire les données, puis d'utiliser un signal de sélection de puce opposé à l'horloge pour sélectionner et sortir les données, complétant ainsi la transmission de données sur les deux fronts de l'horloge.

La description du code Verilog est la suivante.

Exemple

module double_rate(
    input               rstn ,
    input               clk,
    input               csn,

    input [7:0]         din,
    input               din_en,
    output [7:0]        dout,
    output              dout_en);

   //capture sur posedge
   reg [7:0]            datap_r ;
   reg                  datap_en_r ;
   always @(posedge clk or negedge rstn) begin
      if (!rstn) begin
         datap_r        <= 'b0 ;
         datap_en_r     <= 1'b0 ;
      end
      else if (din_en) begin
         datap_r        <= din ;
         datap_en_r     <= 1'b1 ;
      end
      else begin
         datap_en_r     <= 1'b0 ;
      end
   end

   //capture sur negedge
   reg [7:0]            datan_r ;
   reg                  datan_en_r ;
   always @(negedge clk or negedge rstn) begin
      if (!rstn) begin
         datan_r        <= 'b0 ;
         datan_en_r     <= 1'b0 ;
      end
      else if (din_en) begin
         datan_r        <= din ;
         datan_en_r     <= 1'b1 ;
      end
      else begin
         datan_en_r     <= 1'b0 ;
      end
   end

   assign dout = !csn ? datap_r : datan_r ;
   assign dout_en = datan_en_r | datap_en_r ;
endmodule

La description du testbench est la suivante, où la fréquence d'horloge du module de transmission de données à double front est de 100MHz, mais le débit de données d'entrée est de 200MHz.

Exemple

`timescale 1ns/1ps

module test ;
   reg          clk_100mhz, clk_200mhz ;
   reg          rstn ;
   reg          csn ;
   reg [7:0]    din ;
   reg          din_en ;
   wire [7:0]   dout ;
   wire         dout_en ;

   always #(2.5)    clk_200mhz  = ~clk_200mhz ;
   always @(posedge clk_200mhz)
                    clk_100mhz  = ~clk_100mhz ;

   initial begin
      clk_100mhz  = 0 ;
      clk_200mhz  = 0 ;
      rstn        = 0 ;
      din         = 0 ;
      din_en      = 0 ;
      csn         = 0 ;
      //commencer le travail
      #11 rstn    = 1 ;
      @(negedge clk_100mhz) ;
      din_en      = 1 ;
      #0.2 ;
      csn         = 1 ; // Lorsque csn=1, sortir les données échantillonnées sur le front descendant.
      //générer csn
      forever begin
         @(posedge clk_100mhz) ;
         #0.2 ;         //Ajouter un léger délai pour garantir une acquisition correcte des données
         csn = 0 ;      //Lorsque csn=0, sortir les données échantillonnées sur le front montant
         @(negedge clk_100mhz) ;
         #0.2 ;
         csn = 1 ;      //Lorsque csn=1, sortir les données échantillonnées sur le front descendant
      end
   end

   always @(negedge clk_200mhz) begin
      din <= {$random()} % 8'hFF ;  //Générer des données aléatoires pour la transmission
   end

   double_rate u_double_rate(
     .rstn      (rstn),
     .clk       (clk_100mhz),
     .csn       (csn),
     .din       (din),
     .din_en    (din_en),
     .dout      (dout),
     .dout_en   (dout_en));

   initial begin
      forever begin
         #100;
         if ($time >= 10000)  $finish ;
      end
   end

endmodule // test

Les résultats de simulation pour les premières données sont les suivants.

Comme on peut le voir sur la figure, la transmission des données est normale, et le débit est le double de la fréquence d'horloge.

Ce n'est qu'une simple simulation de transmission de données sur les deux fronts d'horloge, et non une simulation du principe de fonctionnement de la DDR. Le principe de fonctionnement de la transmission DDR à double débit de données est bien plus complexe que cette simulation.

Cependant, en général, il n'est pas recommandé d'utiliser une logique d'horloge à double front, principalement pour les raisons suivantes.

Dans un bloc always, les fronts montants et descendants ne peuvent pas tous deux être utilisés comme liste de sensibilité, et une même variable ne peut pas être affectée dans deux blocs always. Par exemple, la description suivante est incorrecte. Bien que la compilation RTL puisse ne pas signaler d'erreur, elle ne peut pas être synthétisée en un circuit réel. Cela rend difficile la communication entre les signaux.

   always @(posedge clk or negedge clk) begin

Le débit de transmission des données est le double de la fréquence d'horloge des données. Si une logique sur front montant et descendant est utilisée pour la modélisation RTL, un signal de sélection de puce qui bascule à la même fréquence que l'horloge est également nécessaire ; si aucun signal de sélection de puce n'est utilisé, un signal d'horloge de même source à deux fois la fréquence d'horloge des données doit être introduit à l'intérieur du module pour sélectionner normalement les données.

Lorsque la logique d'horloge à double front est utilisée, des contraintes appropriées doivent être appliquées aux fronts montants et descendants. Les contraintes d'horloge deviennent complexes, les exigences de placement et routage deviennent plus strictes, et la difficulté de débogage augmente.

La conception avec des fronts d'horloge doubles nécessite une horloge de haute qualité, et de nombreux facteurs doivent être pris en compte lors de la conception de l'arbre d'horloge.

Téléchargement du code source de ce chapitre

Téléchargement