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.