2016-06-01 18 views
1

Ich habe ein Problem, das einfacher mit einem HLS-Tool als mit dem Schreiben der rohen VHDL/Verilog gelöst wird. Momentan verwende ich eine Xilinx Virtex-7, da ich denke, dass dies bereits von einigen anderen Anbietern gelöst wurde.HLS-Tool, um Mathematik auf FPGAs einfacher zu machen

kann ich VHDL verwenden 2008.

So in VHDL vorstellen, dass Sie viele Berechnungen haben wie:

p1 <= a x b - c; 
p2 <= p1 x d - e; 
p3 <= p2 x f - g; 
p4 <= p2 x p1 - p3; 

Zeit, wenn ich dies mit IP-Cores schreiben, wäre es vier DSP-IP-Cores sein und aufgrund der unterschiedlichen Portbreiten müsste ich diesen IP-Core 4 mal generieren. Immer wenn ich einige dieser externen Signale ändere, würden sich alle Breiten wieder ändern. Das Verfolgen all dieser Größenänderungen ist ein Schmerz, insbesondere wenn die Größe von signierten Vektoren reduziert wird.

Ich habe viel Mathematik und damit viel DSP-Logik. Es wäre einfacher, diesen Block mit einem HLS-Tool zu schreiben. Idealerweise möchte ich, dass die Daten entsprechend gehandhabt werden.

Gibt es ein solches Tool? Welchen würdest du empfehlen?

Punkte Bonus:

jedes dieser Werkzeuge Fassen Punkt Mathematik schwimmend und lassen Sie Präzision steuern?

+0

VHDL-2008-Features in Vivado 2.016,1 Krieg sehr einfach. Es ist nicht der volle Funktionsumfang. – Paebbels

+0

Ich würde wirklich gerne ein HLS-Tool, das die Anzahl der Bit-Signale verwendet, die Größen ändern, als den Code überprüfen zu müssen. Es würde die Produktivität beschleunigen. – fiz

+0

Wenn Sie ein oder zwei HLS-Tools verwendet haben, werden Sie feststellen, dass die Produktivität/Design-Beschleunigung für ein erstes Arbeitsergebnis sehr hoch ist, aber das generierte Design ist schrecklich. Dann verbringen Sie Tage und Wochen, um das Design zu verbessern, was Ihre Design-Geschwindigkeit verringert, aber Ihre Ergebnisse verbessert ... am Ende könnten Sie an der Stelle sein zu sagen: "Wenn ich mit VHDL angefangen hätte, wäre ich schon fertig, und das Design wäre viel schneller oder verwenden weniger Ressourcen. " – Paebbels

Antwort

6

Es gibt viele Möglichkeiten, Ihr Ziel zu erreichen. Aber zuerst, um deine Punkte anzusprechen.

Wenn ich das jetzt mit IP Cores schreiben würde, wären es drei DSP IP Cores, und wegen der unterschiedlichen Portbreiten müsste ich diesen IP Core 3 mal generieren.

Nicht unbedingt. Wenn Ihre Eingaben a bis g alle Fixpunkte sind, können Sie ieee.numeric_std verwenden oder in VHDL-2008 können Sie ieee.fixed_pkg verwenden. Diese werden DSP-Kerne (wie den DSP48 auf Xilinx) ableiten. Zum Beispiel:

-- Assume a, b, and c are all signed integers (or implicit fixed point) 
signal a : signed(7 downto 0); 
signal b : signed(7 downto 0); 
signal c : signed(7 downto 0); 
signal p1 : signed(a'length+b'length downto 0); -- a times b produces a'length + b'length +1 (which also corresponds to (a times b) - c adding one bit). 
... 
p1 <= a*b - resize(c, p1'length); 

Dies wird Multiplikatoren und Addierer bedeuten.

Und dies kann ähnlich mit UFIXED oder SFIXED getan werden. Aber Sie müssen die Bitbreiten verfolgen.

Auch gibt es ein Gleitkomma-Paket (ieee.float_pkg), aber ich würde das für Hardware nicht empfehlen. Sie sind besser Timing und Ressourcen-weise, um es in Fixpunkt zu implementieren.

Jedes Mal wenn ich einige dieser externen Signale ändere, würden sich alle Breiten wieder ändern. Den Überblick über all diese Größenänderungen zu behalten, ist ein Schmerz.

Sie können dies automatisch tun. Schau dir mein Beispiel oben an. Sie können Breiten basierend auf den Vorgängen einfach bestimmen. Multiplikationen summieren die Anzahl der Bits. Zusätze fügen ein einzelnes Bit hinzu. Also, wenn ich:

y <= a * b; 

Dann kann ich die Länge der y als einfach a'length + b'length abzuleiten. Es kann getan werden.Das Problem ist jedoch ein bisschen Wachstum. Die Kette von Operationen, die Sie beschreiben, wird erheblich zunehmen, wenn Sie die volle Genauigkeit behalten. An bestimmten Punkten müssen Sie abschneiden oder runden, um die Anzahl der Bits zu reduzieren. Dies ist der schwierige Teil. Wie viel Fehler Sie tolerieren können, hängt vom Algorithmus und der erwarteten Dateneingabe ab.

Ich habe viel Mathematik und damit viel DSP-Logik. Es wäre einfacher, diesen Block mit einem HLS-Tool zu schreiben. Idealerweise möchte ich, dass die Daten entsprechend gehandhabt werden.

Automatische Handhabung ist der schwierige Teil. In VHDL wird dies nicht passieren (und auch nicht Verilog). Aber Sie können es ziemlich gut verfolgen und Bit-Breiten-Aktualisierung wie notwendig haben. Aber es wird nicht automatisch Dinge wie Rundung, Kürzung und das Verwalten von Fehlergrenzen behandeln. Ein DSP-Techniker sollte diese Probleme lösen und den RTL-Entwickler auf die entsprechenden Breiten und den Zeitpunkt des Rundens oder Kürzens hinweisen.

Gibt es ein solches Tool? Welchen würdest du empfehlen?

Es gibt eine Vielzahl von Optionen, um dies auf einer höheren Ebene zu tun. Keines davon ist in Bezug auf Ressourcen besonders sparsam. Matlab verfügt über ein Tool zur Code-Generierung, das Matlab-Modelle (entsprechend konstruiert) in RTL konvertiert. Es werden sogar Probleme wie Runden, Abschneiden und Bestimmen der geeigneten Bitbreiten analysiert. Sie können die Genauigkeit steuern, aber es ist Fixpunkt. Wir haben damit gespielt und fanden es weit davon entfernt, effizienten, schnellen Code zu produzieren.

Alternativ verfügt Xilinx über eine HLS-Suite (siehe Vivado). Ich bin nicht so versiert in der Methodik, aber wie ich es verstehe, erlaubt es C-Code schreiben, um Algorithmen zu implementieren. Das C-Doe wird dann zu etwas "synthetisiert", das in einer Art von Ausführungs-Engine ausgeführt wird. Sie müssen diesen C-Code immer noch mit der RTL-Infrastruktur verbinden, und das ist eine Herausforderung für sich. Der Grund, warum wir es bisher nicht stark verfolgt haben (obwohl wir DSP-Designs machen) ist, dass es eine große Herausforderung ist, HLS und RTL zusammen als System zu simulieren.

+0

Vielen Dank für Ihre ausführliche Antwort. "Aber es wird nicht automatisch Dinge wie Rundung, Kürzung und das Verwalten von Fehlergrenzen behandeln." Und das ist mein Problem. Die Mathematik wird potenziell riesig sein. Ich brauche wirklich ein Werkzeug, das damit umgehen kann. Vor allem, wenn Sie die Größe eines signierten Vektors verkleinern. – fiz

+1

@fiz Ich mache viele DSP-Entwicklung, aber ich bin kein DSP-Ingenieur. Wir haben DSP-Experten, die uns helfen RTL-Leute zu bestimmen, wann zu runden und abzuschneiden ist. Es ist eine Einbahnstraße. Die DSP-Leute wollen volle Präzision, wir drängen auf Timing- und Ressourcenbeschränkungen zurück. Die DSP-Jungs sagen uns, wann wir rund/verkürzen können und die reduzierte Präzision. Schließlich konvergieren wir auf eine Lösung, die die Präzision hat, die die DSP-Leute wollen und die Ressourcennutzung, mit der wir leben können. Es ist iterativ und vor allem für große Systeme komplex. – PlayDough

+0

Sicherlich würde dies jedoch von einem HLS-Tool hervorragend gehandhabt werden. Du gibst die Mathematik ein, sagst du, dass du 1 DSP pro Multiplikator verwenden sollst, benutze volle Präzision wo möglich (d. H. Die vollen a/b/c Breiten) und es würde durchgehen und den Code generieren. – fiz

1

In der Vergangenheit habe ich flopoco gefunden, um beliebige mathematische Funktionen in Hardware zu generieren. Wenn ich mich richtig erinnere, unterstützt es viele Arten von Funktionen. Zum Beispiel könnte es einen arithmetischen Kern erzeugen, um etwas wie a = 3 * sin² (x + pi/3) zu berechnen. Für diese Berechnungen können Sie die Gesamtpräzision der Ein-/Ausgänge (für Fließkomma/Festkomma) oder die Breite der Eingaben (Ganzzahl) angeben. Es kann auch die Ausführungshäufigkeit und das Pipelining der Funktion angegeben werden.

Hier ist ein altes Tutorial ich gefunden, wie es zu benutzen: tutorial

+0

Also zum Beispiel mit diesem Paket, wenn ich sagte, dass 'a (1 downto 0)' und 'c (2 downto 0)' würde es in dieser Berechnung 'p = axb wissen, dass die Breite von p ist 5 Bits bei voller Präzision? – fiz

+0

Es ist eine Weile her, seit ich damit gearbeitet habe. Es sollte so etwas machen können. Hör zu. – Lincoln

+1

Ich schaute dies nach oben und für einfache Integer-Operationen wird nur die Eingabegröße angegeben, so dass die Ausgabegröße basierend auf der Eingabegröße berechnet wird. – Lincoln