{"id":619,"date":"2015-10-17T14:46:22","date_gmt":"2015-10-17T14:46:22","guid":{"rendered":"http:\/\/coolt.ch\/notizen\/?p=619"},"modified":"2015-11-12T16:38:22","modified_gmt":"2015-11-12T16:38:22","slug":"testbench","status":"publish","type":"post","link":"https:\/\/coolt.ch\/notizen\/testbench\/","title":{"rendered":"Testbench Aufbau"},"content":{"rendered":"<p>In VHDL geh\u00f6rt die Simulation (schreiben einer Testbench) fix zur Entwicklung dazu. Die <strong>Testbench ist in VHDL geschrieben<\/strong> und liegt im <a href=\"http:\/\/coolt.ch\/notizen\/testbench\/\">Ordner vhdl<\/a>.<br \/>\n<em>Achtung: Nie in Quartus-Projekt einbinden.\u00a0 Quartus kann waits und asserts nicht kompilieren<\/em>.<br \/>\nAusgef\u00fchrt (kompiliert) wird die Testbench \u00fcber die Konsole vom Simlationsprogramm (per Script):<\/p>\n<p><strong>Simulationsprogramm<\/strong><br \/>\nBei altera ist <em>questasim<\/em> die Vollversion des Simulationsprogramms.<\/p>\n<figure id=\"attachment_624\" aria-describedby=\"caption-attachment-624\" style=\"width: 180px\" class=\"wp-caption alignright\"><a href=\"http:\/\/coolt.ch\/notizen\/wp-content\/uploads\/2015\/10\/work-e1445093885810.png\"><img loading=\"lazy\" class=\"wp-image-624 size-full\" src=\"http:\/\/coolt.ch\/notizen\/wp-content\/uploads\/2015\/10\/work-e1445093885810.png\" alt=\"work\" width=\"180\" height=\"158\" \/><\/a><figcaption id=\"caption-attachment-624\" class=\"wp-caption-text\">Einbinden der Bibliothek<\/figcaption><\/figure>\n<p><strong>Ablage<\/strong><br \/>\nIm <a href=\"http:\/\/coolt.ch\/notizen\/fpga-projekt-einrichten\/\">Projektordner<\/a> wird ein Ordner<em> simulation <\/em>angelegt. In diesen Ordner kommt &#8211; \u00fcber das Einbinden der Bibliothek\u00a0 work &#8211; der Unterordner <em>Work<\/em>.<br \/>\nIn diesen legt man das Script zum Starten der Simulation <a href=\"http:\/\/coolt.ch\/notizen\/testbench-ausfuehren\/\">compile.do<\/a> .<\/p>\n<p><strong><br \/>\nTestbench Datei<\/strong><br \/>\n&#8211; die entity hat <em>keine Ports<\/em>. Sie besteht nur aus Signalen<br \/>\n&#8211; die IOs jeder Componente werden an Signale geh\u00e4ngt<br \/>\n&#8211; die Testsignale (stimuli) werden in processen gesetzt<br \/>\n&#8211; Signale d\u00fcrfen nur Signalen zugewiesen werden<br \/>\n&#8211; die Tests (Vergleichsergebnis von Signalen)<br \/>\n.\u00a0 finden in den Prozessen statt. Die<strong> Processe haben keine Klammern<\/strong><\/p>\n<p>&#8211; <em>stimuli<\/em>:\u00a0\u00a0 sind selbst entworfene Signalverl\u00e4ufe<br \/>\n&#8211; <em>waits<\/em>:\u00a0\u00a0\u00a0\u00a0 bestimmen die zeitliche Abfolge unter den<br \/>\n.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Signalen<br \/>\n&#8211; <em>reports<\/em>: geben die Resultat aus<br \/>\n.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (Konsole oder in File (textbasiertes Testing).<br \/>\n&#8211;<em> clk<\/em>:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>der clk <em>muss simuliert (erzeugt) werden<\/em><\/strong>.<br \/>\n.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<strong> Dies geschieht durch einen eigenen clk-prozess<\/strong><\/p>\n<pre class=\"lang:sh decode:true\">clk_generator  : process\r\nbegin\r\n.   wait for 1 * clk_halfp;\r\n.       clock_sig &lt;= '1';\r\n.   wait for 1 * clk_halfp;\r\n.       clock_sig &lt;= '0';\r\nend process;<\/pre>\n<pre class=\"lang:sh decode:true\"><strong>entity<\/strong> ram_tb is\r\n<strong>end<\/strong> ram_tb;\r\n\r\n\r\narchitecture struct of ram_tb is\r\n\r\n---------------------------------------------------------------\r\n-- component declaration\r\n---------------------------------------------------------------\r\ncomponent ram\r\nport(\r\n.    address     : IN STD_LOGIC_VECTOR (15 DOWNTO 0);\r\n.    clock       : IN STD_LOGIC  := '1';\r\n.    data        : IN STD_LOGIC_VECTOR (7 DOWNTO 0);\r\n.    wren        : IN STD_LOGIC ;\r\n.    q           : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)\r\n);\r\nend component;\r\n\r\n\r\n---------------------------------------------------------------\r\n-- signal instantiation\r\n---------------------------------------------------------------\r\n\r\nsignal address_sig : STD_LOGIC_VECTOR (15 DOWNTO 0);\r\nsignal clock_sig   : STD_LOGIC  := '1';\r\nsignal data_sig    : STD_LOGIC_VECTOR (7 DOWNTO 0);\r\nsignal wren_sig    : STD_LOGIC ;\r\nsignal q_sig       : STD_LOGIC_VECTOR (7 DOWNTO 0);\r\n\r\nsignal clk_halfp   : time := 10 ns;\r\nsignal clk_period  : time := 20 ns;\r\n\r\n-- eventuell constanten mit resultaten definieren\r\n\r\nbegin\r\n---------------------------------------------------------------\r\n-- component instantiation\r\n---------------------------------------------------------------\r\n\r\ninst_1 : ram\r\nport map (\r\n.   address  =&gt; address_sig,\r\n.   clock    =&gt; clock_sig,\r\n.   data     =&gt; data_sig,\r\n.   wren     =&gt; wren_sig,\r\n.   q        =&gt; q_sig\r\n);\r\n\r\n---------------------------------------------------------------\r\n-- Set stimuli in process with timing\r\n---------------------------------------------------------------\r\ntest_1: process(all)\r\n.    -- Initialwerte setzen\r\n\r\n.    -- Signale an Komponenten legen (Stimulation)\r\n\r\n.   -- Warten\r\n\r\n.   -- Signal von Ausgang Komponente abfangen\r\n\r\n.   -- Vergleichen des Outputs mit Erwartung\r\n\r\n.   -- Ausgabe Testresulat\r\n\r\nend; -- test_1\r\n\r\nend; -- architektur<\/pre>\n<p>Wie man die Tests startet, wird unter dem Eintrag <a href=\"http:\/\/coolt.ch\/notizen\/testbench-ausfuehren\/\">Testbench ausf\u00fchren<\/a> erkl\u00e4rt. Eine professioneller Form des Testens basiert auf <a href=\"http:\/\/coolt.ch\/notizen\/vhdl-textbasierte-test\/\">textbasierten Scripts<\/a>.<\/p>\n<p>Hier wird die Syntax der Testbench-Fehler (assert, report, severity,..) beschrieben.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In VHDL geh\u00f6rt die Simulation (schreiben einer Testbench) fix zur Entwicklung dazu. Die Testbench ist in VHDL geschrieben und liegt im Ordner vhdl. Achtung: Nie in Quartus-Projekt einbinden.\u00a0 Quartus kann waits und asserts nicht kompilieren. Ausgef\u00fchrt (kompiliert) wird die Testbench \u00fcber die Konsole vom Simlationsprogramm (per Script): Simulationsprogramm Bei altera ist questasim die Vollversion des &hellip; <a href=\"https:\/\/coolt.ch\/notizen\/testbench\/\" class=\"more-link\"><span class=\"screen-reader-text\">Testbench Aufbau<\/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":[43,48],"_links":{"self":[{"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/posts\/619"}],"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=619"}],"version-history":[{"count":15,"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/posts\/619\/revisions"}],"predecessor-version":[{"id":944,"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/posts\/619\/revisions\/944"}],"wp:attachment":[{"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/media?parent=619"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/categories?post=619"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/tags?post=619"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}