Forum: FPGA, VHDL & Co. vhdl synthetisiarbar machen


von Zitty Z. (Firma: ZATT) (zitierer)


Lesenswert?

hi möchte einen code synthetesierbar machen.
Original tb:
1
   p_config_status_vector : process
2
   begin
3
     configuration_vector <= (others => '0');
4
     wait for 1 us;
5
     assert false report "Clearing status vector outputs" severity note;
6
     while status_vector /= "11111100" loop
7
       wait until clk156 = '1';
8
       configuration_vector(2) <= '1';
9
       configuration_vector(3) <= '1';
10
       wait until clk156 = '0';
11
       wait until clk156 = '1';
12
       configuration_vector <= (others => '0');
13
     end loop;
14
     assert false report "DUT Ready" severity note;
15
     dut_ready <= '1';
16
     wait;
17
   end process p_config_status_vector;

Mein äußerst kleverer Ansatz:
Scheint aber nicht mal zu simulieren.
Oder irgendwas scheint da sehr lange zu dauern.
Muss ich die ganzen wait untils umschreiben als if anweisung oder so?

1
      p_config_status_vector : process 
2
   begin
3
    -- configuration_vector <= (others => '0');
4
  
5
    if  dut_ready = '0' then
6
      
7
         if status_vector /= "11111100" then
8
           wait until refclk_p = '1';
9
           configuration_vector(2) <= '1';
10
           configuration_vector(3) <= '1';
11
           wait until refclk_p = '0';
12
           wait until refclk_p = '1';
13
           configuration_vector <= (others => '0');
14
        else              
15
         dut_ready <= '1';
16
          end if;
17
     end if;
18
   
19
   end process p_config_status_vector;

würde jetzt einfach mal die Logik herausarbeiten. und dann muss das Ding 
einfach nur toggeln... sollte eigentlich machbar sein.

glaub ich brauch noch nen zähler. dann zählt der hoch und dann wird 
getogglt. - aso der togglet ja jeden takt! dann brauch man doch keinen 
zähler xD


oh jetz scheint es wenigstens mal die Simulation auf zu machen:
1
 p_config_status_vector2 : process (refclk_p)
2
   begin
3
  --   configuration_vector <= (others => '0');
4
      if  dut_ready = '0' and status_vector /= "11111100" then
5
            if ( refclk_p = '1') then
6
                configuration_vector(2) <= '1';
7
                configuration_vector(3) <= '1';
8
            else 
9
configuration_vector <= (others => '0');
10
            end if;
11
       end if;
12
   end process p_config_status_vector2;


und jetzt sehe ich hier noch
.. da ist ja ne while-schleife drin.
wie soll man das ganze synthesefähig machen xD
ist die ganze prozedur etwa komplett zu ersetzen?
1
procedure send_frame (
2
             constant frame : in frame_typ) is
3
             variable column_index : integer;
4
          begin  -- send_frame
5
             column_index := 0;
6
    
7
             while column_index < frame.length loop
8
                send_column(frame.stim(column_index));
9
                column_index := column_index + 1;
10
             end loop;    
11
    
12
          end send_frame;

: Bearbeitet durch User
von RuckZuckFresseDick (Gast)


Lesenswert?

Vergiss es!

Man schreibt von Anfang realisierbaren Code, nicht irgendwelchen 
akademixen Pseudogedröhns.

Und das kann man erst, wenn man verstanden hat:
-was überhaupt gemacht werden soll?
-welche Werkzeuge man dazu zu Verfügung hat!

von Zitty Z. (Firma: ZATT) (zitierer)


Lesenswert?

RuckZuckFresseDick schrieb:
> Man schreibt von Anfang realisierbaren Code, nicht irgendwelchen
> akademixen Pseudogedröhns.

Der Code stammt von einer Testbench. Habe gedacht man kann den 
synthetisierbar machen.

Kann man daraus nicht ableiten wie eine synthesefähige Logik dazu 
aussieht?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Zitty Z. schrieb:
> wie soll man das ganze synthesefähig machen xD
Du musst dir erst mal eine Hardware ausdenken. Und die beschreibst du 
dann mit der HardwareBESCHREIBUNGSsprache VHDL.

> ist die ganze prozedur etwa komplett zu ersetzen?
Du musst eine komplett andere Strategie auflegen (mein Tipp: fang mit 
einem Blinklicht und einem Lauflicht an) und auch mal den Userguide zum 
Synthesizer lesen. Da steht drin, wie du was schreiben musst, dass er es 
versteht und Hardware draus machen kann.
Im Mengenlehre-Unterricht hätte man das nämlich etwa so gezeichnet:
1
     ________________________________________________________________
2
    |                                                                |
3
    | gesamter                                                       |
4
    | VHDL-Sprachumfang                                              |
5
    |                                                                |
6
    |                                                                |
7
    |                                                                |
8
    |                                                                |
9
    |                                                                |
10
    |                                                                |
11
    |                                                                |
12
    |                                                                |
13
    |                                                                |
14
    |                                ___________________             |
15
    |                               |  davon            |            |
16
    |                               |  synthetisierbar  |            |
17
    |                               |___________________|            |
18
    |                                                                |
19
    |                                                                |
20
    |________________________________________________________________|

Zitty Z. schrieb:
> Der Code stammt von einer Testbench.
> Habe gedacht man kann den synthetisierbar machen.
Wozu sollte man eine Testbench synthetisierbar machen und in ein FPGA 
packen? Eine Testbench hat ein völlig anderes Ziel und natürlich auch 
eine ganz andere Designstrategie.

Das ist, wie wenn du aus einem Fußballfeld einen Fußball machen 
wolltest. Es hat zwar beides mit Fußball zu tun, aber der Ball wird auf 
dem Feld gespielt.

: Bearbeitet durch Moderator
von Duke Scarring (Gast)


Lesenswert?

Zitty Z. schrieb:
> Kann man daraus nicht ableiten wie eine synthesefähige Logik dazu
> aussieht?
Nein. Wir wissen ja noch nichtmal, was für Signale rein und rausgehen...

Bisher ist ja nur das hier bekannt:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity unknown_dut is
5
port
6
( 
7
   configuration_vector : in  std_logic_vector( 3 downto 0);
8
   status_vector        : out std_logic_vector( 7 downto 0)
9
};
10
end entity dunknown_dut;

Duke

von Zitty Z. (Firma: ZATT) (zitierer)


Lesenswert?

Lothar M. schrieb:
> Userguide zum
> Synthesizer

ja mache ich!

nur noch vollständigkeitshalber:

send_frame soll aus einem Prozess 4 mal aufgerufen werden, um 4 Frames 
zu senden.
Allerdings beinhaltet send_frame einen weiteren procedure-Aufruf, bei 
dem send_column "sehr oft" aufgerufen wird.

Könnt ihr  ungefähr sagen, ob die while-Schleife komplett 
unsynthetisierbar ist? Oder wäre das doch möglich, da die Grenzwerte 
statisch sind?

Habe gerade nur send_frame betreffendes auskommentiert und die Synthese 
wurd schonmal von Vivado durchgeführt.

hier noch mal das betreffende:
1
procedure send_frame (
2
3
             constant frame : in frame_typ) is
4
             variable column_index : integer;
5
          begin  -- send_frame
6
             column_index := 0;
7
             while column_index < frame.length loop
8
                send_column(frame.stim(column_index));
9
                column_index := column_index + 1;
10
             end loop;        
11
          end send_frame;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Zitty Z. schrieb:
> send_frame soll aus einem Prozess 4 mal aufgerufen werden
> procedure send_frame (
Nur zur Einschätzung der Lage: du bist ein Programmierer, der Hardware 
machen muss. Stimmts?

: Bearbeitet durch Moderator
von Zitty Z. (Firma: ZATT) (zitierer)


Lesenswert?

ja

von Zitty Z. (Firma: ZATT) (zitierer)


Lesenswert?

aber die procedure wird von der original testbench wirklich 4 mal 
aufgerufen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Zitty Z. schrieb:
> ja
Und deshalb willst du VHDL "programieren" und findest sogar noch ein 
paar "false friends", die du aus deiner Programmiersprache kennst.

Zum Prozess: ein Prozess wird in der Hardware in der (theoretischen) 
Zeit 0 abgearbeitet. Wenn in dem Prozess eine Schleife ist, wird die zu 
paralleler Hardware ausgerollt und gleichzeitig bearbeitet. Wenn du in 
einem Prozess etwas nacheinander machen willst, dann brauchst du einen 
Zustandsautomaten.

> send_frame soll aus einem Prozess 4 mal aufgerufen werden

Zeichne das als Schaltplan und beschreibe die Funktion dann mit VHDL.

Zitty Z. schrieb:
> aber die procedure wird von der original testbench wirklich 4 mal
> aufgerufen.
Ja, aber das geht eben nur in der Testbench. Und die Testbench ist von 
Anfang an nicht darauf ausgelegt, dass man sie synthetisieren könnte.


Wie gesagt: Blinklicht simulieren, synthetisieren. Lauflicht simulieren, 
synthetisieren. VGA-Schnitte simulieren, synthetisieren. Serielle 
Schnitte simulieren, synthetisieren. Und danach stellst du viele Fragen 
nicht mehr, die dich grade so plagen.
Dort gehts los:
http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html

: Bearbeitet durch Moderator
von Zitty Z. (Firma: ZATT) (zitierer)


Lesenswert?

Lothar M. schrieb:
> Ja, aber das geht eben nur in der Testbench. Und die Testbench ist von
> Anfang an nicht darauf ausgelegt, dass man sie synthetisieren könnte.

Ja möchte aus dem Konzept aber synthesefähige Logik machen.
Wollte nur wissen inwiefern man schon vorhandenen Code nehmen kann.
Bevor ich unnötig alles kompliziert umschreibe..

von Cle (Gast)


Lesenswert?

Zitty Z. schrieb:
> Lothar M. schrieb:
>> Ja, aber das geht eben nur in der Testbench. Und die Testbench ist von
>> Anfang an nicht darauf ausgelegt, dass man sie synthetisieren könnte.
>
> Ja möchte aus dem Konzept aber synthesefähige Logik machen.
> Wollte nur wissen inwiefern man schon vorhandenen Code nehmen kann.
> Bevor ich unnötig alles kompliziert umschreibe..

Das Problem jetzt ist  das du eine gewisse "Uneinsichtigkeit" in 
Hardwarebeschreibungssprachen und die Schritte in der FPGA Entwicklung 
gezeigt hast. Hier liegen einige Probleme die es schwierig machen dir zu 
helfen.

Nochmal ganz klar: Testbenches sind schier unmöglich direkt in 
synthetisierbaren Code umzuwandeln.

Entweder ein Designer entwickelt eine Schaltung für die Realität, dann 
schreibt er direkt synthesefähigen Code, oder ein Verifikateur schreibt 
eine Testbench die nur für das Testen genutzt wird. Das kann durchaus in 
der selben Sprachen passieren, aber sind oft absolut unterschiedliche 
Sprachkonstruke und Paradigmen.

Du kannst du das "Verhalten" (die äußere Ansicht, also wie Signale 
togglen) anschauen und das ganze von Testbench zu Design übertragen 
(oder andersrum).

von Gustl B. (-gb-)


Lesenswert?

Cle schrieb:
> Testbenches sind schier unmöglich direkt in
> synthetisierbaren Code umzuwandeln.

Naja, auch eine Testbench kann durchaus in synthetisierbarem Code 
geschrieben sein. Muss aber eben nicht.

Hier wäre es hilfreich, wenn wir mal die komplette Testbench sehen 
würden. Vielleicht sind die Stimulussignale nicht von Ausgängen der UUT 
abhängig und können quasi starr durchgefahren werden mit der Zeit.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Zitty Z. schrieb:
> möchte aus dem Konzept aber synthesefähige Logik machen.
Was soll das bringen? Willst du zwei FPGAs vetbinden und mit dem einen 
FPGA (="synthetisierte Testbench") ein anderes (=DUT device under test) 
stimulieren?

von Zitty Z. (Firma: ZATT) (zitierer)


Lesenswert?

Cle schrieb:
> Du kannst du das "Verhalten" (die äußere Ansicht, also wie Signale
> togglen) anschauen und das ganze von Testbench zu Design übertragen
> (oder andersrum).

Ja das wäre interessant. Ich möchte 4 Ethernetframes immer wieder senden 
lassen.
Bzw. es wäre mir fast schon egal ob es nur 1 Ethernetframe ist xD

Lothar M. schrieb:
> Was soll das bringen? Willst du zwei FPGAs vetbinden und mit dem einen
> FPGA (="synthetisierte Testbench") ein anderes (=DUT device under test)
> stimulieren?

Ein FPGA soll Frames aussenden über seine Transceiver. Diese sind am 
Ende mit einer Netzwerkkarte verbunden.
FPGA(->Transceiver) ->HW-> NIC

Werde einfach mal schauen ob ich die Frames mit Zählern senden kann xD

Cle schrieb:
> gewisse "Uneinsichtigkeit"
Ich hoffe das ändert sich schnell.
Man muss mir mal ordentlich mit nem FPGA auf den Kopf schlagen.

von Zitty Z. (Firma: ZATT) (zitierer)


Lesenswert?

ahhhh
Habe mich vertan.
Diese Testbench sendet gar nicht ganze Ethernet frames.. .

Nacheinander Ethernet-frames  auf den xgmii bus legen, müsste aber 
irgendwie klappen.

Also eigentlich brauche ich nur einen Testframe. Der immer wieder 
gesendet wird.

Sind aber etwa 1500 Bit. Also muss ich die korrekt nacheinander auf den 
Bus 64+8 Bit - Bus legen lassen.

Laut Datenblatt kommen kurz nach clk-high neue 64 Bit xgmii + 8 Bit 
Kontroll-Daten auf den Bus.

Ca. 23 mal muss was auf den Bus ...
Wie würdet ihr das machen?

Ich könnte das ganze in Excel machen und dann einfügen
oder vorsichtig mit einer Schleife ein Array auslesen xD
haha

: Bearbeitet durch User
von Duke Scarring (Gast)


Lesenswert?

Ich würde einen RAM als ROM verwenden und mit einer FSM zyklisch 
auslesen.
Eine Schleife bringt Dir hier gar nix.

Duke

von Zitty Z. (Firma: ZATT) (zitierer)


Lesenswert?

Duke Scarring schrieb:
> RAM als ROM

Das ist auch gut.

Vielen Dank für den Tipp!

Dann kann man nach einander immer die benötigten Daten aus dem RAM 
lesen?

von Achim S. (Gast)


Lesenswert?

Zitty Z. schrieb:
> Dann kann man nach einander immer die benötigten Daten aus dem RAM
> lesen?

Ja. Und zwar indem du zusätzlich einen Adresszähler implementierst, der 
jeweils auf die Adresse der gerade benötigten Daten im RAM zeigt. Der 
muss im wesentlichen bei jeder Taktflanke, bei der du einen Wert aus dem 
RAM ausliest und versendest, um 1 erhöht werden und am Ende des 
Datenpakets wieder auf den Anfangswert zurückspringen.

von Zitty Z. (Firma: ZATT) (zitierer)


Angehängte Dateien:

Lesenswert?

ok RAM mit Address-Pointer hört sich vernünftig an.
Was passiert wenn man das so macht wie "sendethernet.txt"?

es wird zwar synthetisiert, aber ich kann nicht abschätzen was ich da 
wirklich rauskommt.

von Achim S. (Gast)


Lesenswert?

Zitty Z. schrieb:
> es wird zwar synthetisiert,

Ehrlich? Bekommst du keine Warnung wegen einer kombinatorischen Schleife 
oder sowas in der Art? Wie sieht denn der vollständige Code aus, hier 
sieht man ja nur ein Schnippsel...

An dieser Stelle
    if refclk_p = '1' then --- please  check for rising clock!
machst du nicht, was im Kommentar steht (und was notwendig wäre). Du 
prüfst nicht auf eine steigende Taktflanke. Sondern du prüfst, ob der 
Taktpegel high ist.

Zitty Z. schrieb:
> aber ich kann nicht abschätzen was ich da
> wirklich rauskommt.

Dafür gibt es einen Simulator...

von Zitty Z. (Firma: ZATT) (zitierer)



Lesenswert?

Achim S. schrieb:
> Ehrlich? Bekommst du keine Warnung wegen einer kombinatorischen Schleife
> oder sowas in der Art?

Im Anhang habe ich einen Screenshot davon.

Aber wenn du schon meinst, dass da etwas schlechtes entsteht, muss ich 
mir Gedanken machen!

Ich schaue mir gerade
http://www.lothar-miller.de/s9y/categories/36-Kombinatorische-Schleife
an.

Achim S. schrieb:
> if refclk_p = '1' then --- please  check for rising clock!

War mein eigener Kommentar, damit ich das noch ändere.

Achim S. schrieb:
> Dafür gibt es einen Simulator...

Bei jedem Takt (high) werden Daten auf den Bus gelegt. Das gesamte Frame 
wird immer wieder gesendet.
Werde auch gleich mal schauen, ob der Core das korrekt übersetzt - tu 
diesen Code in ein "example-design", wo auch ein Monitor drin ist.

: Bearbeitet durch User
von Achim S. (Gast)


Lesenswert?

Zitty Z. schrieb:
> Bei jedem Takt (high) werden Daten auf den Bus gelegt. Das gesamte Frame
> wird immer wieder gesendet.

Bei jeder Taktflanke sollte etwas passieren. Nicht dauernd, solange die 
Taktflanke auf high ist.

Was die Warnungen angeht:  du hast über 100 von denen nur ein Teil auf 
deinem Screenshot zu sehen ist. Und vieles von den erkennbaren Warnungen 
bezieht sich auf Teile des Codes, die du nicht gezeigt hast und die ich 
nicht erraten kann.

Zitty Z. schrieb:
> Ich schaue mir gerade
> http://www.lothar-miller.de/s9y/categories/36-Kombinatorische-Schleife
> an.

Oben wurde dir schon vorgeschlagen, mit einem einfachen Design zu 
starten um zumindest die "grundlegensten Grundlagen" zu kennen, bevor du 
an Ethernet-Pakete gehst.

Lothar M. schrieb:
> Dort gehts los:
> http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html

Mach dir an einem einfachen Design klar, wie man die Taktflanke abfrägt, 
ehe du dich an komplexere Projekte setzt.

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.