Altifigence Academy

21 / 37 · Concept

function automatic et expressions réutilisables

Écrivez des fonctions sans temps simulé et vérifiez largeur, signe et indépendance de la référence.

Réutiliser le calcul sans cacher le contrat

Une fonction SystemVerilog retourne un résultat sans consommer de temps de simulation. Dans une RTL combinatoire synthétisable, utilisez des entrées explicites, affectez le retour sur tous les chemins et excluez retards et contrôles d'événements. automatic sépare arguments et variables locales de chaque appel, sans ajouter registre ou cycle. La boucle fixe calcule le XOR des huit bits comme parité combinatoire.

SystemVerilog
module parity_function (
  input  logic [7:0] data,
  output logic       parity,
  output logic [7:0] with_parity
);
  function automatic logic parity8(input logic [7:0] value);
    logic p;
    integer bit_index;
    begin
      p = 1'b0;
      for (bit_index = 0; bit_index < 8; bit_index = bit_index + 1)
        p = p ^ value[bit_index];
      parity8 = p;
    end
  endfunction
  assign parity = parity8(data);
  assign with_parity = {data[6:0], parity8(data)};
endmodule

with_parity supprime data[7] et ajoute la parité: il reste huit bits, ce n'est pas un codage de neuf bits préservant toute l'entrée. La fonction peut être correcte alors que l'appelant perd de l'information.

Largeur et signe du retour

Le retour est un logic d'un bit. Additionner deux entrées non signées de huit bits en conservant la retenue exige neuf bits de retour. L'appel n'élargit pas automatiquement la destination. Placez règles de largeur et constantes près de l'interface; évitez les dépendances cachées aux signaux globaux variables, qui compliquent réutilisation et test.

Un appel n'implique pas un partage séquentiel

Deux appels ne forcent pas un opérateur partagé dans le temps. La synthèse peut optimiser la logique combinatoire; un partage séquentiel exige protocole d'acceptation, état et instant du résultat. N'inférez ni surface ni débit du nombre d'appels. Les tasks de test peuvent attendre des événements: fonctions et tâches temporisées ont des rôles distincts. La prochaine leçon utilise une task pour piloter au front descendant et observer après le montant.

Exercice : une autre référence

data=0,1,3,8'h80,8'hFF doit donner parité 0,1,0,1,0. Pour 8'h80, with_parity=8'h01 puisque le bit haut disparaît et parity=1. Testez les 256 valeurs en comptant les bits actifs dans un entier puis le reste modulo 2, sans appeler parity8 du DUT. Réduisez la borne de boucle à 7:8'h80 doit échouer, bien que les petites valeurs masquent le défaut. Passez ensuite la sortie à neuf bits avec {data, parity8(data)} et adaptez le modèle: c'est une modification d'interface, pas de mise en forme.

Votre choix s’applique à ce navigateur. Modifiez-le à tout moment en bas de page.