Spécification d'écriture de code RTL

(1) Utiliser une affectation non bloquante pour écrire un code logique séquentiel

  • Toutes les variables doivent attendre l'arrivée du front de déclenchement avant d'affecter
  • Lors du calcul du signal à droite du numéro d'affectation, toutes les variables sont les valeurs avant le front de déclenchement.
  • Les instructions du bloc procédure sont exécutées en parallèle

(2) Écrire un code de bloc logique combinatoire avec toujours bloquer pour utiliser l'affectation de blocage

  • La liste sensible dans le bloc Always doit être déclenchée par niveau

(3) Vous ne pouvez pas utiliser à la fois l'affectation bloquante et l'affectation non bloquante dans le même bloc toujours

(4) Une seule variable peut être affectée dans un bloc toujours

  • les blocs sont toujours exécutés en parallèle
  • L'affectation à la même variable dans plusieurs blocs toujours est strictement interdite
  • L'affectation à plusieurs variables dans un bloc toujours n'est pas recommandée

(5) Dans le programme de réinitialisation asynchrone, si l'instruction if apparaît dans l'instruction always, le signal de contrôle sensible autre que le signal d'horloge (généralement le signal de réinitialisation) doit être jugé dans la première instruction if, et s'il est placé dans la suite à l'erreur de compilation de l'instruction if

  • Erreur courante : impossible de faire correspondre les opérandes dans la condition aux arêtes correspondantes dans le contrôle d'événement englobant de la construction toujours. Le bloc de code correspondant est :
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (count == COUNT_MAX)            // 
        led_out <= ~led_out;         // 时序逻辑块中用非阻塞赋值
    else if(sys_rst_n == 1'b0)
        led_out <= 1'b0;
    else 
        led_out <= led_out;
end

De toute évidence, le signal de réinitialisation n'est pas jugé dans la première instruction if, il y a donc une erreur !

  • Méthode de modification : mettre des signaux de contrôle sensibles autres que le signal d'horloge dans la première instruction if
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (sys_rst_n == 1'b0)            // 
        led_out <= 1'b0;
    else if(count == COUNT_MAX)
        led_out <= ~led_out;         // 时序逻辑块中用非阻塞赋值
    else 
        led_out <= led_out;
end

(6) Le nom du paramètre paramètre est en majuscule pour distinguer les autres variables

parameter COUNT_MAX = 25'd24_999_999

(7) Lorsque vous écrivez des nombres plus longs, séparez-les par _ (trait de soulignement) pour améliorer la lisibilité

parameter MIN = 25'd10_999_999,
parameter MAX = 25'd24_999_999

Je suppose que tu aimes

Origine blog.csdn.net/jac_chao/article/details/124158253
conseillé
Classement