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


von Kon W. (koo)


Angehängte Dateien:

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:
1
module basic_and #(parameter WIDTH = 1)(
2
    input [WIDTH-1:0] a,
3
    input [WIDTH-1:0] b,
4
    output [WIDTH-1:0] out
5
  );
6
 
7
  assign out = a & b;
8
 
9
endmodule
1
module Simple_tb();
2
 
3
  reg [3:0] a, b;
4
  wire [3:0] out;
5
 
6
  basic_and #(.WIDTH(4)) DUT (
7
    .a(a),
8
    .b(b),
9
    .out(out)
10
  );
11
 
12
  initial begin
13
    a = 4'b0000;
14
    b = 4'b0000;
15
    #20
16
    a = 4'b1111;
17
    b = 4'b0101;
18
    #20
19
    a = 4'b1100;
20
    b = 4'b1111;
21
    #20
22
    a = 4'b1100;
23
    b = 4'b0011;
24
    #20
25
    a = 4'b1100;
26
    b = 4'b1010;
27
    #20
28
    $finish;
29
  end
30
 
31
endmodule

: Bearbeitet durch User
von Blechbieger (Gast)


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.

von Duke Scarring (Gast)


Angehängte Dateien:

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

von Kon W. (koo)


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?

von Gustl B. (-gb-)


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:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
entity andgate is port (
5
   A : in STD_LOGIC:='0';
6
   B : in STD_LOGIC:='0';
7
   Y : out STD_LOGIC);
8
end andgate;
9
10
architecture Behavioral of andgate is
11
begin
12
13
Y <= A AND B;
14
15
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:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
entity andgate_bench is
5
end andgate_bench;
6
7
architecture Behavioral of andgate_bench is
8
9
component andgate is port(
10
   A : in STD_LOGIC:='0';
11
   B : in STD_LOGIC:='0';
12
   Y : out STD_LOGIC);
13
end component;
14
15
signal A: STD_LOGIC:='0';
16
signal B: STD_LOGIC:='0';
17
signal Y: STD_LOGIC:='0';
18
19
begin
20
21
DUT: andgate port map(
22
   A => A,
23
   B => B,
24
   Y => Y);
25
26
process begin
27
A <= '0';
28
B <= '0';
29
wait for 10 ns;
30
A <= '1';
31
B <= '0';
32
wait for 10 ns;
33
A <= '0';
34
B <= '1';
35
wait for 10 ns;
36
A <= '1';
37
B <= '1';
38
wait for 10 ns;
39
end process;
40
41
end Behavioral;

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.