mikrocontroller.net

Forum: FPGA, VHDL & Co. Compiling Error bei Testbenchen


Autor: Kon W. (koo)
Datum:
Angehängte Dateien:
  • preview image for MC.PNG
    MC.PNG
    87,4 KB, 77 Downloads

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
nach stundenlangem Versuch verschiedene Testbechen zu kompilieren, bin 
ich mal einen Schritt zurück gegangen und habe es mit einer simplen 
Vorlage aus dem Internet probiert. Und auch da, es wir immer der selber 
Fehler angezeigt!

Error (12061): Can't synthesize current design -- Top partition does not 
contain any logic

Irgendwas mache ich grundlegend falsch, oder ist falsch eingestellt in 
Quartus 10.1 lite.

- Top entity ist immer die Testbench (Projektnavigator -> files -> 
rechte Tast ("Set top level...)
- Name von Projekt und Top entity stimmen über ein
-In Settings wird die richtige Top entity angezeigt

Wo könnte das Problem liegen?


Meine Codevorlagen:
module basic_and #(parameter WIDTH = 1)(
    input [WIDTH-1:0] a,
    input [WIDTH-1:0] b,
    output [WIDTH-1:0] out
  );
 
  assign out = a & b;
 
endmodule
module Simple_tb();
 
  reg [3:0] a, b;
  wire [3:0] out;
 
  basic_and #(.WIDTH(4)) DUT (
    .a(a),
    .b(b),
    .out(out)
  );
 
  initial begin
    a = 4'b0000;
    b = 4'b0000;
    #20
    a = 4'b1111;
    b = 4'b0101;
    #20
    a = 4'b1100;
    b = 4'b1111;
    #20
    a = 4'b1100;
    b = 4'b0011;
    #20
    a = 4'b1100;
    b = 4'b1010;
    #20
    $finish;
  end
 
endmodule

: Bearbeitet durch User
Autor: Blechbieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falsches Werkzeug! Eine Testbench wird nicht in Quartus für einen FPGA 
synthetisiert sondern mit einem Simulator, z.B. Modelsim, ausgeführt.

Das Modul basic–and alleine sollte aber synthetisierbar sein.

Autor: Duke Scarring (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Kon W. schrieb:
> Error (12061): Can't synthesize current design -- Top partition does not
> contain any logic

Synthezie != Simulate

Bei Intel/Quartus kann man sich eine Light-Version von Modelsim holen.
Bei Lattice gibt es eine Schnupperversion von Aldec und bei Xilinx gibt 
es einen Simulator im Vivado.
Aus der Open-Source-Welt wäre noch GHDl (für VHDL) und icarus (für 
Verilog) zu erwähnen.

Das sind dann Werkzeuge, die mit dem Testbenchcode klarkommen. Teilweise 
könne die Simulatoren auch direkt aus der jeweiligen 
Entwicklungsumgebung gestartet werden.

Duke

Autor: Kon W. (koo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, funktioniert schon viel besser, verstehe nur noch die 
Zusammenhänge nicht ganz. Z.b was synthetisieren/ synthetisierbar für 
FPGAs genau bedeutet, vlt könnte mir jemand das kurz erklären? Oder wie 
verschiedene Module (files) zu der Testbench im Projekt hierarchisch 
angeordnet sind.

Wie ich jetzt verstanden habe: Top Entity bleibt immer das Top-Module, 
ich erstelle ein neues Verilog HDL File für die Testbench, binde das Top 
Module als DUT ein, synthetisiere, starte ModelSim aus Quartus heraus 
und simuliere nur das Testbench File (?)

Oder, in Quartus gibt es noch so ein spezielle Testbench File .vt, ist 
das vielleicht besser zu nutzen?

Autor: Gustl B. (-gb-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kon W. schrieb:
> synthetisieren/ synthetisierbar für
> FPGAs genau bedeutet

Nun, VHDL ind Verilog können sehr viel, z. B. Text in Dateien schreiben. 
Das sind aber dinge die es im FPGA so nicht gibt. Da gibt es keine 
Hardware für und somit kann man diesen Teil aus VHDL dort nicht 
verwenden. In der Simulation ist das fein, da will man gelegentlich Zeug 
in Dateien schreiben.
Gebauso diese Warteanweisungen die eine bestimmte Zeit warten.
wait 10 ns;
Das geht im FPGA nicht weil es keine Hardware gibt die weiß was 10 ns 
sind. Da kann man bis zu einer Taktflanke warten weil, die gibt es dort, 
oder ein paar Takte zählen und währenddessen nichts tun.
In der Simulation ist das aber irre praktisch weil man da den 
umgekehrten Fall hat, man hat keine Hardware. Also auch keinen 
Taktgeber. Den baut man sich in der Testbench selber
clk <= not clk after 5 ns;
und hat eine 100 MHz Clock.

Tja, was ist eigentlich diese Testbench, nun, das kommt aus der Antike. 
Man hat eine Hardware gebaut, viele unterschiedliche ICs einzeln als 
einzelne Entitys, dann diese ICs auf eine Platine gesetzt und 
untereinander verbunden. Das ist quasi die Top Entity, die Platine. Da 
werden die einzelnen ICs als Components benannt und mit den Port Map 
verbunden. Tja, dann hat man eine Platine (also die Top Entity) und weiß 
nicht ob die das macht was man will, aber die hat IOs. Und dann legt man 
die auf den Tisch auf dem man testet, die Test Bench. Und wie im Labor 
üblich geht man dann an die IOs der Platine ran und macht damit Dinge. 
An die Eingänge der Platine legt man Signale an, z. B. eine Clock und 
die Ausgänge der Platine guckt man sich an. Z. B. mit einem 
Logikanalyser.
Die Testbench als Datei ist wieder in VHDL/Verilog und beschreibt die 
Hardware die man nur zum Testen an die Platine/Top Entity/DUT(Device 
under Test) ranhängt. Also mit der Testbench baut man sich selber die 
Testhardware zusammen mit allen Signalen die man später in der 
Simulation sehen können möchte.

Beispiel:

Eine ganz einfache Schaltung wird gebaut:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity andgate is port (
   A : in STD_LOGIC:='0';
   B : in STD_LOGIC:='0';
   Y : out STD_LOGIC);
end andgate;

architecture Behavioral of andgate is
begin

Y <= A AND B;

end Behavioral;

Diese Schaltung soll jetzt getestet werden. Dabei müssen für beide 
Eingänge alle möglichen Kombinationen durchgegangen werden. Also 4 
Stück. Eine Testbench könnte so aussehen:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity andgate_bench is
end andgate_bench;

architecture Behavioral of andgate_bench is

component andgate is port(
   A : in STD_LOGIC:='0';
   B : in STD_LOGIC:='0';
   Y : out STD_LOGIC);
end component;

signal A: STD_LOGIC:='0';
signal B: STD_LOGIC:='0';
signal Y: STD_LOGIC:='0';

begin

DUT: andgate port map(
   A => A,
   B => B,
   Y => Y);

process begin
A <= '0';
B <= '0';
wait for 10 ns;
A <= '1';
B <= '0';
wait for 10 ns;
A <= '0';
B <= '1';
wait for 10 ns;
A <= '1';
B <= '1';
wait for 10 ns;
end process;

end Behavioral;

Auch schön beschrieben ist das hier:
https://www.mikrocontroller.net/articles/VHDL_Testbench

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.