VHDL: textbasierte Test: Aufbau File

File-Variablen definieren
Sie werden in dem Process definiert.

use std.textio.all;
use work.std_logic_textio.all;  // Kompilieren mit 2002

// other code bevor....

--------------------------------------------------------------------
-- testbased test 
--------------------------------------------------------------------
execute_file: process

    -------------------------------------
    -- File handling
    -------------------------------------
    file input_file: TEXT;       
    file output_file: TEXT;    
    
    variable line_in,line_out: Line; 
    variable good: boolean;   
    
    -- token structure: 
    -- type | note_1 | velc_1 | note_2 | velc_2 | numb_note | other
    VARIABLE token_type_n: string(1 to 5);    
    VARIABLE token_note_1: std_logic_vector(7 downto 0) :=(OTHERS => '0');
    VARIABLE token_velocity_1: std_logic_vector(7 downto 0) :=(OTHERS => '0');
    VARIABLE token_note_2: std_logic_vector(7 downto 0) :=(OTHERS => '0');
    VARIABLE token_nmbr_note_out: std_logic_vector(3 downto 0) :=(OTHERS=> '0');
    VARIABLE token_others: std_logic_vector(3 downto 0) :=(OTHERS=> '0');
    

Wie ein Inputfile aufgebaut werden soll, steht im Beitrag zum Inputfile.

 

File öffnen und Ende erkennen
– In VHDL werden Files zeilenweise eingelesen (siehe std_logic_textio)
– Eingelesen wird in einem Process

execute_file: process

-- zuerst File variablen (siehe oben)

BEGIN
    FILE_OPEN(input_file,"../simulation/script/input_midi.txt", READ_MODE);
    FILE_OPEN(output_file,"../simulation/script/result_midi.txt", WRITE_MODE);

 loop    
        ---------------------------------
        -- Check end of file
        --------------------------------
        if endfile(input_file) then  
                
                -- output console read line numbers      
                write(line_out, string'("Number of read lines from file:"));
                writeline(OUTPUT,line_out);                                  
                write(line_out, line_cnt);            
                writeline(OUTPUT,line_out);      
                assert false
                report "End of test"
                severity FAILURE;
            exit;
        end if;

Unmittelbar danach folgt (ebenfalls im loop)

Tokens einlesen

        -----------------------------------
        -- Read 10 token in (and check for error)
        ------------------------------------
        readline(input_file, line_in);     
        line_cnt <= line_cnt + 1;
        
        -- Skip empty lines
        next when line_in'length = 0;

        read(line_in, token_type_n, good);    
            assert good
            report "Error command (type) failed."
            severity ERROR;   
         
        hread(line_in, token_note_1, good);  
            assert good
            report "Error token (note_1) failed."
            severity ERROR;

Zuerst wird zeilenweise eingelsen (und die Zeilen gezählt.)
Dann teilt man die Wörter in Tokens ein. Je nach Tokentyp wird eine andere read-Funktion genommen.

Test durchführen
– Das Vergleichen der Werte einen getakteten Process
– Signale werden ausgelesen und mit Variablenwerten verglichen

test: process(all)
begin

 loop
    if rising_edge(clk) then
        -- Abarbeiten 1. Test ----------------------------------
        if (testtyp_n = 1) then

          -- Signale einlesen
          sig_wert1   <= puls_1;
          sig_wert2   <= data_slc;
          sig_result1 <= adder_out;

          wait for 2 * period;

          -- Test Wert
          if ( sig_wert1 /= wert_n) then

             -- Falls Fehler: Ausgabe in Zeile
             hwrite(line_out, wert_n); 
             write(line_out, string'(" nicht korrekt") ); 

          -- Test Ergebnis     
          elsif ( sig_result1 /= ergebnis_n) then

             -- Falls Fehler: Ausgabe in Zeile
             hwrite(line_out, ergebnis_n);
             write(line_out, string'("Ergebnis falsch"));

          -- Test fehlerfrei
          else
             zeilen_nr <= zeilen_nr + 1;
             hwrite(line_out, testtyp_n)
             write(line_out, string'(" fehlerfrei")); 
          end if;

       -- Abarbeiten 2. Test -----------------------------------
       elsif (testtyp_n = 2) then

            -- Signalwerte auslesen 
            
            -- Vergleich mit Variablen

            -- Ergebnis in Zeile schreiben

      -- Ende Abarbeiten Tests
      else
            assert false
            report "Unbekannter Testtyp"
            severity FAILURE;

     end if;    

     -- Zeile in File schreiben
     writeline(out_file, line_out);

 end loop; 

wait; 
end process;

Good Practice
Arbeitet man mit textbasiertem Debugging, so lässt man das Konsolendebugging (mit ASSERTS) weitmöglichst weg.