{"id":604,"date":"2015-10-17T10:03:02","date_gmt":"2015-10-17T10:03:02","guid":{"rendered":"http:\/\/coolt.ch\/notizen\/?p=604"},"modified":"2015-11-12T16:37:00","modified_gmt":"2015-11-12T16:37:00","slug":"vhdl-textbasierte-test","status":"publish","type":"post","link":"https:\/\/coolt.ch\/notizen\/vhdl-textbasierte-test\/","title":{"rendered":"VHDL: textbasierte Test: Aufbau File"},"content":{"rendered":"<p><strong>File-Variablen definieren<br \/>\n<\/strong>Sie werden in dem Process definiert.<strong><br \/>\n<\/strong><\/p>\n<pre class=\"lang:sh decode:true\">use std.textio.all;\r\nuse work.std_logic_textio.all;  \/\/ Kompilieren mit 2002\r\n\r\n\/\/ other code bevor....\r\n\r\n--------------------------------------------------------------------\r\n-- testbased test \r\n--------------------------------------------------------------------\r\nexecute_file: process\r\n\r\n\u00a0\u00a0\u00a0 -------------------------------------\r\n\u00a0\u00a0 \u00a0-- File handling\r\n\u00a0\u00a0 \u00a0-------------------------------------\r\n\u00a0\u00a0 \u00a0<strong>file<\/strong> input_file: TEXT;\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0<strong>file<\/strong> output_file: TEXT;\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0<strong>variable<\/strong> line_in,line_out: Line; \r\n\u00a0\u00a0 \u00a0variable good: boolean;\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0-- <strong>token structure<\/strong>: \r\n    -- type | note_1 | velc_1 | note_2 | velc_2 | numb_note | other\r\n\u00a0\u00a0 \u00a0VARIABLE <strong>token_type_n<\/strong>: string(1 to 5);\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0VARIABLE <strong>token_note_1<\/strong>: std_logic_vector(7 downto 0) :=(OTHERS =&gt; '0');\r\n\u00a0\u00a0 \u00a0VARIABLE token_velocity_1: std_logic_vector(7 downto 0) :=(OTHERS =&gt; '0');\r\n\u00a0\u00a0 \u00a0VARIABLE token_note_2: std_logic_vector(7 downto 0) :=(OTHERS =&gt; '0');\r\n\u00a0\u00a0 \u00a0VARIABLE <strong>token_nmbr_note_out<\/strong>: std_logic_vector(3 downto 0) :=(OTHERS=&gt; '0');\r\n    VARIABLE <strong>token_others<\/strong>: std_logic_vector(3 downto 0) :=(OTHERS=&gt; '0');\r\n\u00a0\u00a0 \u00a0\r\n<\/pre>\n<p>Wie ein Inputfile aufgebaut werden soll, steht im Beitrag zum <a href=\"http:\/\/coolt.ch\/notizen\/vhdl-textbasierte-test\/\">Inputfile<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>File \u00f6ffnen und Ende erkennen <\/strong><br \/>\n&#8211; In VHDL werden Files <em>zeilenweise<\/em> eingelesen (siehe <a href=\"http:\/\/coolt.ch\/notizen\/std_logic_textio-vhd\/\">std_logic_textio<\/a>)<br \/>\n&#8211; Eingelesen wird in einem Process<\/p>\n<pre class=\"lang:sh decode:true\">\r\nexecute_file: process\r\n\r\n-- zuerst File variablen (siehe oben)\r\n\r\nBEGIN\r\n\u00a0\u00a0 \u00a0<strong>FILE_OPEN<\/strong>(input_file,\"..\/simulation\/script\/input_midi.txt\", READ_MODE);\r\n\u00a0\u00a0 \u00a0<strong>FILE_OPEN<\/strong>(output_file,\"..\/simulation\/script\/result_midi.txt\", WRITE_MODE);\r\n\r\n <strong>loop\u00a0<\/strong>\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ---------------------------------\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0-- Check end of file\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0--------------------------------\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if endfile(input_file) then \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 -- output console read line numbers\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 write(line_out, string'(\"Number of read lines from file:\"));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 writeline(OUTPUT,line_out);\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 write(line_out, line_cnt);\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0writeline(OUTPUT,line_out);\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0assert false\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0report \"End of test\"\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0severity FAILURE;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0exit;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0end if;\r\n<\/pre>\n<p>Unmittelbar danach folgt (ebenfalls im loop)<\/p>\n<p><strong>Tokens einlesen<br \/>\n<\/strong><\/p>\n<pre class=\"lang:sh decode:true\">        -----------------------------------\r\n        -- Read 10 token in (and check for error)\r\n        ------------------------------------\r\n        <strong>readline<\/strong>(input_file, line_in);     \r\n        line_cnt &lt;= line_cnt + 1;\r\n        \r\n        -- Skip empty lines\r\n        next when line_in'length = 0;\r\n\r\n        <strong>read(<\/strong>line_in, <strong>token_type_n<\/strong>, good);    \r\n            assert good\r\n            report \"Error command (type) failed.\"\r\n            severity ERROR;   \r\n         \r\n        <strong>hread<\/strong>(line_in, <strong>token_note_1<\/strong>, good);  \r\n            assert good\r\n            report \"Error token (note_1) failed.\"\r\n            severity ERROR;\r\n<\/pre>\n<p><strong>Zuerst wird zeilenweise eingelsen (und die Zeilen gez\u00e4hlt.)<\/strong><br \/>\n<strong>Dann teilt man die W\u00f6rter in Tokens ein.<\/strong> Je nach Tokentyp wird eine andere read<strong>-Funktion genommen.<\/strong><strong><\/p>\n<p>Test durchf\u00fchren<\/strong><br \/>\n&#8211; Das Vergleichen der Werte einen <em>getakteten<\/em> Process<br \/>\n&#8211; Signale werden ausgelesen und mit Variablenwerten verglichen<\/p>\n<pre class=\"lang:sh decode:true \">test: process(all)\r\nbegin\r\n\r\n loop\r\n    if rising_edge(clk) then\r\n        -- Abarbeiten 1. Test ----------------------------------\r\n        if (testtyp_n = 1) then\r\n\r\n          -- Signale einlesen\r\n          sig_wert1   &lt;= puls_1;\r\n          sig_wert2   &lt;= data_slc;\r\n          sig_result1 &lt;= adder_out;\r\n\r\n          wait for 2 * period;\r\n\r\n          -- Test Wert\r\n          if ( sig_wert1 \/= wert_n) then\r\n\r\n             -- Falls Fehler: Ausgabe in Zeile\r\n             hwrite(line_out, wert_n); \r\n             write(line_out, string'(\" nicht korrekt\") ); \r\n\r\n          -- Test Ergebnis     \r\n          elsif ( sig_result1 \/= ergebnis_n) then\r\n\r\n             -- Falls Fehler: Ausgabe in Zeile\r\n             hwrite(line_out, ergebnis_n);\r\n             write(line_out, string'(\"Ergebnis falsch\"));\r\n\r\n          -- Test fehlerfrei\r\n          else\r\n             zeilen_nr &lt;= zeilen_nr + 1;\r\n             hwrite(line_out, testtyp_n)\r\n             write(line_out, string'(\" fehlerfrei\")); \r\n          end if;\r\n\r\n       -- Abarbeiten 2. Test -----------------------------------\r\n       elsif (testtyp_n = 2) then\r\n\r\n            -- Signalwerte auslesen \r\n            \r\n            -- Vergleich mit Variablen\r\n\r\n            -- Ergebnis in Zeile schreiben\r\n\r\n      -- Ende Abarbeiten Tests\r\n      else\r\n            assert false\r\n            report \"Unbekannter Testtyp\"\r\n            severity FAILURE;\r\n\r\n     end if;\u00a0 \u00a0 \r\n\r\n     -- Zeile in File schreiben\r\n     writeline(out_file, line_out);\r\n\r\n end loop; \r\n\r\nwait; \r\nend process;<\/pre>\n<p><strong>Good Practice<\/strong><br \/>\nArbeitet man mit textbasiertem Debugging, so l\u00e4sst man das<a href=\"http:\/\/coolt.ch\/notizen\/vhdl-simulation-debuggen-per-konsole\/\"> Konsolendebugging <\/a>(mit ASSERTS) weitm\u00f6glichst weg.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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&#8230;. &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212; testbased test &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; execute_file: process \u00a0\u00a0\u00a0 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- \u00a0\u00a0 \u00a0&#8212; File handling \u00a0\u00a0 \u00a0&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- \u00a0\u00a0 \u00a0file input_file: TEXT;\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 \u00a0\u00a0 \u00a0file output_file: TEXT;\u00a0\u00a0 \u00a0 \u00a0\u00a0 \u00a0 \u00a0\u00a0 \u00a0variable line_in,line_out: Line; \u00a0\u00a0 \u00a0variable good: boolean;\u00a0 &hellip; <a href=\"https:\/\/coolt.ch\/notizen\/vhdl-textbasierte-test\/\" class=\"more-link\"><span class=\"screen-reader-text\">VHDL: textbasierte Test: Aufbau File<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[60,59],"tags":[],"_links":{"self":[{"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/posts\/604"}],"collection":[{"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/comments?post=604"}],"version-history":[{"count":16,"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/posts\/604\/revisions"}],"predecessor-version":[{"id":943,"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/posts\/604\/revisions\/943"}],"wp:attachment":[{"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/media?parent=604"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/categories?post=604"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/tags?post=604"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}