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.