Aller au contenu

Bancs de test pilotés par fichiers

Les fichiers séparent les données de test du VHDL. Ils sont utiles lorsque les vecteurs proviennent de Python, MATLAB, d'un tableur, d'une trace de protocole ou d'un modèle de référence.

Fichier de vecteurs

# a b cin expected
0  0  0  0
3  4  1  8
7  8  1  16
15 15 1  31

Commencez par un format simple : entiers décimaux séparés par des espaces et lignes de commentaires.

Lecture avec TextIO

library std;
use std.textio.all;

stimulus : process
  file vectors       : text open read_mode is VECTOR_FILE;
  variable row       : line;
  variable a_value   : natural;
  variable b_value   : natural;
  variable cin_value : natural;
  variable expected  : natural;
begin
  while not endfile(vectors) loop
    readline(vectors, row);
    if row.all'length > 0 and row.all(row.all'left) /= '#' then
      read(row, a_value);
      read(row, b_value);
      read(row, cin_value);
      read(row, expected);
      -- Piloter, attendre, mesurer et vérifier.
    end if;
  end loop;
  finish;
end process;

Rendez le chemin configurable :

entity tb_file is
  generic (
    VECTOR_FILE : string := "vectors.txt"
  );
end entity;

Le script peut fournir un chemin absolu, ce qui évite de dépendre du répertoire de travail du simulateur.

Règles de format

Documentez :

  • base numérique ;
  • valeurs signées ou non ;
  • ordre des champs ;
  • unités ;
  • champs d'entrée et résultats attendus ;
  • commentaires et lignes vides ;
  • version du schéma ;
  • nombre de lignes prévu.

Un vecteur obligatoire mal formé doit faire échouer le test. Le sauter silencieusement peut produire un faux succès.

Génération par Python

from pathlib import Path

output = Path("tb/vectors-generated.txt")

with output.open("w", encoding="utf-8") as stream:
    stream.write("# a b cin expected\n")
    for a in range(16):
        for b in range(16):
            for cin in (0, 1):
                stream.write(f"{a} {b} {cin} {a + b + cin}\n")

Le résultat vient ici de l'arithmétique entière Python, indépendante du VHDL.

Modèles scientifiques en virgule flottante

Si le FPGA utilise la virgule fixe et Python la virgule flottante, définissez exactement :

  1. Mise à l'échelle : entier = round(réel × 2^bits_fractionnaires).
  2. Mode d'arrondi.
  3. Comportement au dépassement : modulo ou saturation.
  4. Représentation signée : complément à deux.
  5. Tolérance en bits de poids faible.
error_value := abs(actual_integer - expected_integer);
assert error_value <= MAX_ERROR_LSB
  report "Result exceeds allowed error"
  severity failure;

Texte ou binaire

Le texte est simple à inspecter et versionner. Le binaire convient à de très grands jeux mais exige des règles d'endianness, d'empaquetage et de portabilité. Commencez en texte jusqu'à mesurer un vrai problème de performance.

Versionnement

Stockez les petits ensembles significatifs dans Git. Pour de gros jeux générés, conservez :

  • le script générateur ;
  • la graine ;
  • la version du modèle ;
  • la configuration ;
  • une somme de contrôle si nécessaire.

Pièges fréquents

  • Chemin relatif évalué depuis le dossier de compilation.
  • Antislash Windows mal compris par un autre outil.
  • Valeur signée lue dans un natural.
  • Comparaison avant stabilisation des signaux.
  • Nombre de vecteurs non compté.
  • Test réussi alors que le fichier est vide.
assert tests > 0
  report "No vectors were executed"
  severity failure;