mikrocontroller.net

Forum: FPGA, VHDL & Co. Quartus FPGA Fehler Anfänger For


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Bliad B. (bliad_b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi guten Tag,

ich habe hier ein System Verilog Code für eine Hashfunktion. Ich habe 
den Code aus C übernommen. Leider komme ich nicht weiter. In ModelSim 
hat es geklappt mit der Simulation. In Quartus lässt sich der "Code" 
aber nicht "compilieren".

Hier die Fehlermeldung aus Quartus:
Error: Quartus Prime Analysis & Synthesis was unsuccessful. 1 error, 24 warnings
  Error: Peak virtual memory: 630 megabytes
  Error: Processing ended: Sun Jul 28 23:45:53 2019
  Error: Elapsed time: 00:00:18
  Error: Total CPU time (on all processors): 00:00:43
Error (293001): Quartus Prime Full Compilation was unsuccessful. 3 errors, 24 warnings

Interessant ist hier zum Beispiel: Peak virtual memory mit 630 MB.
Wahrscheinlich ist in dem Code etwas , was zu viel Speicher beansprucht 
für einen FPGA.
Evtl. ist das mit der For Schleife nicht so gut gelöst, siehe unten.
Hier der Code bis zur wahrscheinlichen Fehlerquelle:
 module sha1( 
);
// ##### Variablen
int unsigned m; // anzahl msg bits
int unsigned mp; // anzahl padded msg bits
int unsigned k; // anzahl 0 en
int unsigned anzBloecke =2;
int unsigned anzWoerter;
//int unsigned testarray [4000:0] ;
int unsigned test [0:15] = '{'h61626380,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'h00000018};
int unsigned a;
int unsigned b;
int unsigned c;
int unsigned d;
int unsigned e;

int unsigned H0='h67452301;
int unsigned H1='hefcdab89;
int unsigned H2='h98badcfe;
int unsigned H3='h10325476;
int unsigned H4='hc3d2e1f0;

int unsigned H0save='h67452301;
int unsigned H1save='hefcdab89;
int unsigned H2save='h98badcfe;
int unsigned H3save='h10325476;
int unsigned H4save='hc3d2e1f0;
int unsigned Wj[80]; // Parameter muss für jeden Block M neu berechnet werden
//##### Funktionen
function int add(input int s1,s2);
add = s1+s2;
$display("beste leben");
endfunction
//# Rotate Left x = variable n = rotationen
function int unsigned rotl(input int unsigned x,n);
rotl=((x << n) | (x >> (32 - n)));
endfunction

//## f1...f4
function int unsigned f1(input int unsigned b,c,d);
f1=((b & (c)) | ((~b) & d));
endfunction

function int unsigned f2(input int unsigned b,c,d);
f2= (b ^ c ^ d);
endfunction

function int unsigned f3(input int unsigned b,c,d);
f3= ((b & c) | ((b & d) | (c & d)));
endfunction

function int unsigned f4(input int unsigned b,c,d);
f4= (b ^ c ^ d);
endfunction



// es soll hier eine Nachricht erwartet werden die in einem int unsigned array kommt. jedes wort/ Element hat dabei 32 Bit
// Padding algorithm 

initial begin

// # Padding, Die Nachricht wird nun gepadded:
  // # die gepaddete Nachricht besteht aus:
  // # Nachrichtenlänge = m
  // # Leangeninformation = m64
  // # Ein Bit am Ende der Nachricht = 1
  // # Auffüllen damit vielfaches von 512 = k
  k = 512 - ((m + 1 + 64) % 512);// # Berechnung von k = anzahl von anzuhängenden "0"-Bits damit die gepaddedet Nachricht ein Vielfaches von 512 ist
  anzBloecke = (m + 1 + 64 + k) / 512; // Berechnung anzhal der Blöcke
  mp = anzBloecke * 512; // Anzahl Bits nach padding
  anzWoerter = anzBloecke * 16;

// füge an stelle m+1 die 1 hinzu

// füge k nullbits hinzu
// fürge 64 bits mit der information der leange hinzu



Hier an dieser Stelle wird es problematisch:

for( int r=0; r<1; r++) begin// sha1 4 Rounds for each Block

for(int i = 0; i<16;i++) begin // Wj: im betreffenden Block r werden zuerst 16 Wj Wert 0...15 herausgelesen für Wj
Wj[i] = test[(r*16)+i]; //  r = aktueller block bei r = 0 wörter: 0...15 lesen, bei r = 1 => 16...31 usw. öletzter block und element bzw. letztes wort: bei 3 *16 +15 =>48...63
end



Vielleicht sieht jemand ja sofort den Fehler, weil er einfach 
offensichtlich ist :D

Danke !

Autor: Markus F. (mfro)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Bliad B. schrieb:
> Hier die Fehlermeldung aus Quartus:Error: Quartus Prime Analysis &
> Synthesis was unsuccessful. 1 error, 24 warnings
>   Error: Peak virtual memory: 630 megabytes
>   Error: Processing ended: Sun Jul 28 23:45:53 2019
>   Error: Elapsed time: 00:00:18
>   Error: Total CPU time (on all processors): 00:00:43
> Error (293001): Quartus Prime Full Compilation was unsuccessful. 3
> errors, 24 warnings

Das ist (höchstwahrscheinlich) nicht der eigentliche Fehler. Such' 
weiter vorne. Ich würde (Schuß ins Blaue) vermuten, deine 
Schleifen-Maxima sind nicht konstant.

Verilog sieht zwar (ein bißchen) aus wie C, ist aber keins.

Dir ist klar, wie HDLs for-Schleifen in Hardware umsetzen?

Anscheinend nicht.

Schleifen werden durch die HDL vollständig ausgerollt. D.h. - so wie 
geschrieben - passiert alles, was in der Schleife ablaufen soll, in der 
Hardware-Umsetzung parallel und innerhalb eines einzigen Taktes.

Falls Du das überhaupt zum Laufen bekommst, wird die maximale 
Taktfrequenz höchstwahrscheinlich unterirdisch sein.

: Bearbeitet durch User
Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Bliad B. schrieb:
> Vielleicht sieht jemand ja sofort den Fehler
Du berechnest den Wert mit jedem Takt in einer riesengroßen 
kombinatorischen Schaltung.

> Wahrscheinlich ist in dem Code etwas , was zu viel Speicher beansprucht
> für einen FPGA.
Er bekommt die Tabelle, die für das Aufdröseln der Funktion in 
Kombinatorik nötig wäre, nicht ins RAM. Und weil du parallel auf das 
Array zugreifst, kann er das nicht in einen speicherblock packen, 
sondern muss jedes Bit mit einzelnen Flipflops aus den Funktionsblöcken 
nachbilden. Vermutlich ist dafür dann das FPGA schon zu klein, denn 
schon die beiden Arrays (test und Wj) brauchen zusammen über 3000 
Flipflops.

Vom testarray mal gar nicht zu reden...

Fazit: um das Ganze tatsächlich ins FPGA zu bekommen, musst du die 
Hash-Funktion so umarbeiten, dass er Takt für Takt einen Wert nach dem 
anderen bearbeitet.

Autor: Markus F. (mfro)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Lothar M. schrieb:
> Er bekommt die Tabelle, die für das Aufdröseln der Funktion in
> Kombinatorik nötig wäre, nicht ins RAM.

das ist zwar einigermassen wahrscheinlich, aber nicht unbedingt gesagt.

Für diejenigen, die Quartus nicht kennen: die o.a. "Fehlermeldung" ist 
die ganz normale Quartus "Fertigmeldung". Also kein Fehler.

Und daß Quartus mal 630 MB Hauptspeicher braucht, ist auch völlig normal 
(bzw. eher wenig).

Die Tatsache, daß bereits nach 18 Sekunden abgebrochen wird, spricht 
eher dafür, daß - zusätzlich zur schon diskutierten Problematik - noch 
irgendwo ein Syntaxfehler steckt. So wahnsinnig viel kann Quartus da 
nämlich noch nicht gemacht haben...

Autor: Vancouver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Code beschreibt einen Algorithms, keine Struktur. Deswegen 
funktioniert er im Simulator, geht aber nicht durch die Synthese. Hast 
du dir Gedanken darum gemacht, wie das spätere Hardwaredesign auf 
RTL-Ebene aussehen soll?
Es gibt keinen Takt, keinen Reset, keine Register. Dein Modul hat zudem 
keine Eingänge und keine Ausgänge... wie soll das Design an seine Daten 
kommen und wo soll es die Ergebnisse hinliefern?  Selbst wenn die 
Synthese durchlaufen würde, käme der Optimizer korrekterweise zu dem 
Schluss, dass ein Design, das keine Daten bekommt, nichts zu tun hat und 
würde es komplett wegoptimieren.

Auch wenn es nervt, ich sage es nochmal: Um HDL zu verstehen, musst Du 
etwas über Digitaldesign lernen. Wenn du mal eine LED zum Blinken oder 
einen Zähler zum Zählen gebracht hast, wirst Du verstehen, warum dein 
Design nicht mal ansatzweise funktionieren kann.

Autor: Bliad B. (bliad_b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok ich habe gerade einen simplen Test gemacht:
initial begin

for(int i =0; i<5;i++) begin
end// endfor
end
wenn man dann noch folgendes hinzufügt kommt auf jeden fall mal ein 
fehler


for( int r=0; r<anzBloecke; r++)begin 
end //endfor
end
Error (10119): Verilog HDL Loop Statement error at synthtest.sv(82): 
loop with non-constant loop condition must terminate within 250 
iterations


Ist also schon mal ein guter Hinweis :D
werden mal weitermachen !

Autor: Bliad B. (bliad_b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
komischf finde ich aber, dass ich das weiter oben im code bekannt 
gegeben habe, dass anzbloecke =2 ist !
warum hat das tool dann solche Angst, dass es 250 wird ?

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bliad B. schrieb:
> bekannt gegeben habe
Mit einer Variablen, die Werte von −2.147.483.648 bis +2.147.483.647 
annehmen könnte.
Mach mal eine Konstante draus.

: Bearbeitet durch Moderator

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.