Forum: FPGA, VHDL & Co. Formale Sprachen fuer Pipelining


von Martin S. (strubi)


Lesenswert?

Moin,

komplexe Pipelines machen bekanntlich in klassischer HDL keinen Spass, 
deswegen der Ruf nach uebergeordneten Formalismen, die a) Beschreibung 
vereinfachen b) formale Verifikation (automatisch) erlauben.

Also im Prinzip das, was ein aufwendiger DSP-Compiler bereits macht, 
aber mit feinkoernigerer Kontrolle, dass es mit beliebigem Resourcen-Set 
- sprich FPGA funktioniert (und das bitte abseits C -> HDL-Ansaetzen).

Im Grunde genommen ist der Workflow momentan so:
- Berechnungsformel/Datenzugriffsmethode als Prototyp programmieren
- Mit bitgenauen (fixpoint)-Datentypen erweitern
- Ausgabe in eine Zwischendarstellung einer Pipeline
- Analyse/Verifikation, Latency-Matching verzahnter Pipelines
- Synthese/Ausgabe in HDL aus der Zwischenform

Fuer einfache Vorwaertsberechnungen ist das recht "straightforward", 
schwieriger wirds bei Rekursionen wie allgemeinen IIR, wo man die 
Pipeline nicht beliebig tief machen kann (wegen Feedback des Resultats 
in einer spaeteren Stufe in eine fruehere Stufe).
Da benoetigt es zusaetzliche Formalismen, um allfaellig noetige 
vorwaertsschauende Logik (Stichwort "lookahead") zu generieren.

Ist jemandem noch neben den Scala/Haskell/PipelineC-basierenden 
Ansaetzen noch eine Zwischenform (lesbar, also weniger LLVM-%-dekoriert) 
bekannt, mit der man effektiv arbeiten kann, heisst, dass laufende 
Verifikationen bei der Umstellung der Pipeline automatisch vonstatten 
gehen koennen?

von Bradward B. (Firma: Starfleet) (ltjg_boimler)


Lesenswert?

Hm, letztens einige Presentationen zum Thema Filter/Pipeline-design mit 
HLS (High level Synthesis) gehört. Da vielleicht mal reinschauen, obwohl 
Pipeline stalls und ähnlicher ungemach da eher nicht behandelt werden.

* https://hls.academy/topics/pipelining/
* 
https://onlinedocs.microchip.com/oxy/GUID-37AD5EEE-6FAB-48FC-89F6-CAA649534B2A-en-US-1/GUID-6C4B75B7-B6F1-43C3-A9B1-2315EF95717C.html
* https://docs.amd.com/r/en-US/ug1399-vitis-hls/Pipelining-Loops


Grundprinzipien des Pipelinings wurden früher gern mit Control Data Flow 
Graphen (CDFG) erklärt, vielleicht wäre das noch ein Ansatz für den 
Architekturentwurf:

* https://users.ece.northwestern.edu/~seda/2005_1.pdf

* 
https://scispace.com/pdf/architecture-level-synthesis-for-automatic-interconnect-1p49913gds.pdf

von Gustl B. (gustl_b)


Lesenswert?

Bei Quartus funktioniert das Register Balancing ziemlich gut. Da 
schreibe ich zwar die Pipeline von Hand, füge ein paar Stufen ein die 
nichts machen, und dann verschiebt die Synthese das so hin dass das 
Timing passt.

von Bradward B. (Firma: Starfleet) (ltjg_boimler)


Lesenswert?

Mit einem konkreten beispiel für:

" ... Rekursionen wie allgemeinen IIR, wo man die
Pipeline nicht beliebig tief machen kann (wegen Feedback des Resultats
in einer spaeteren Stufe in eine fruehere Stufe).
Da benoetigt es zusaetzliche Formalismen, um allfaellig noetige
vorwaertsschauende Logik (Stichwort "lookahead") zu generieren "

wird wohl verständlicher was die eigentliche Aufgabenstellung sein 
könnte.
Es geht wohl um  Datenpfadumschaltung zwischen den einzelnen 
Pipelinestufen ?!

Klassischerweise gibt es ein "flush" über mehrere Takte, das die 
Datenkohärenz wiederherstellt. So macht es jedenfalls bei den 
Befehl-pipelines von CPU's. Da wechselt aber auch nie die Richtung wie 
beim TO (wenn ich ihn recht verstehe ("Rückführung v. spätere Stufe 
"(bspw _n+2) "in frühere" (bspw. _n)) , statt ausschliesslich _n -> ... 
_n+2.

Vielleicht eine Struktur aus "Anti-parallel geschalteten FF" aufbauen ?!
So was könnte man mit direkter Manipulation an der Netzliste machen, 
also in einer Netzliste mit den FF mittels tcl-skript o.ä. die 
FF-Referenzen durch Referenzen auf die "Anti-parallel FF" ersetzen. ?! 
Und vor der Esretzung könnte man wie vom Vorredner vorgeschlagen durch 
Registerbalancing die Pipeline passend für die Vorwärtsrichtung 
platzieren lassen ?!

Aber wie gesagt, ganz konkret ist hier noch nicht angekommen, um welche 
Pipelinestruktur es hier geht.
Vielleich hilft es wenn der TO die (vereinfachten) Gleichungen für das 
Filter nennt.
Also sowas wie y_n = Sum (P_0*x_0, P_1*x_1, ... P_n*x_n) wobei x_ der 
Inhalt der jeweiligen Pipeline-stufe ist.


 Literaturtechnisch fällt mir der Pirsch ein, der sich allgemein mit 
sowas beschäftigt (ISBN: 978-3-322-96724-4). Die dort verwendete 
"Formale Sprache" sind Blockbilder und die "klassischen" Summenformeln 
der Filtertechnik.

: Bearbeitet durch User
von Martin S. (strubi)


Lesenswert?

Also die allgemeine Formel schaut in etwa so aus:

Fuer einen klassischen Resonator z.B. gilt M=2, also brauche ich als 
Startbedingung ein y[-2] und ein y[-1], wenn ich mal n=0 (das diskrete 
jetzt) setze. So rein programmatisch linear keine Crux, wenn's in die 
Pipeline geht, liegt aber das Resultat ja etwas spaeter erst vor.
Die am Ende der Pipeline berechneten y[0] werden typischerweise in eine 
Queue (Schieberegister) gesteckt und aus der Pipeline-Beschreibung 
formal indiziert wie oben.
Sagen wir, wir haben nach K Zyklen erst ein gueltiges y[0], was in die 
Rekursion fruehestens der Stufe 0 fliesst.
Dementsprechend kann man nicht einfach mal eben eine Stufe vor 'k' 
einfuegen, ohne dass die Geschichte umgeschrieben werden muss, naemlich 
per als allgemein referenzierte Lookahead-Methods die Pipeline erst mal 
mit den berechneten Werten fuellen.

Das kann der "DSP-Compiler" schon, auch Retiming/automatische Delays, um 
parallel laufende / verzweige Pipeslines zu "matchen". Mir geht es 
darum, dass solche Konstrukte ausserhalb des Compilers ueber eine 
formale Verifikation als korrekt bewiesen werden koennen, auch wenn z.B. 
die Zwischenform manuell editiert wird. Es kann auch nicht einfach der 
Synthese ueberlassen werden, da danach keine formale Verifikation mehr 
moeglich ist.

Der "grafische" Ansatz, der auch noch mancherorten per 
Tabellenkalkulation vonstatten geht, ist zum Entwurf bzw. zum Verstehen 
ok, aber nicht zielfuehrend. Und der Vitis-Ansatz per C-code und 
#pragma-Dekoration ist abgesehen von der Proprietaet keine Option fuer 
mich.

von Christoph Z. (christophz)


Lesenswert?

Es gibt eine weitere eher neue HDL namens SPADE die vielleicht / 
hoffentlich gerade diesen Punkt verbessert. Pipelines sind nämlich 
Sprach-nativ und in den Beispielen gezeigt:
https://spade-lang.org/

Ich habe es selber noch nicht ausprobiert, habe vor ca. 1 Monat von 
einem Freund von dieser Sprache erfahren und bis jetzt nur mal die ganze 
Homepage durchgelesen.
Hat aus meiner Sicht durchaus interesannte Ansätze drin und könnte recht 
OK zu schreiben sein. Würde gerne mal ein Beispiel mit FSM und mehreren 
Komponenten sehen.

von J. S. (engineer) Benutzerseite


Lesenswert?

Bradward B. schrieb:
> Grundprinzipien des Pipelinings wurden früher gern mit Control Data Flow
hm, wenn man ein control set einführt, also die pipeline pulst ist die 
meistens nicht mehr so effektiv. Geht auch so richtig nur bei 1D-pipes.

Gustl B. schrieb:
> Register Balancing ziemlich gut. Da
> schreibe ich zwar die Pipeline von Hand
auch das  geht ausschließlich bei 1D-pipes

Ich sehe das Problem weniger in der Formulierung sondern mehr in der 
Dokumentation und dem Entwurf eines System. Solange das eindimensionale 
Rechenketten sind, ist es vergleichsweise einfach das in Python 
hinzuschreiben und bauen zu lassen. Oder man macht es gleich in Exce, 
wie ich, wo man Module passend zusammenhängt, die auch gleich die 
Vektoren optimieren und kürzen - je nach Erfordernissen. Schon das ist 
ja mit automatischen tools nicht so ohne weiteres erreichbar weil man 
denen die funktionellen ranges nicht wirklich mitgeben kann (nur die 
technischen).

Gerade wenn es um optimiertes kleines VHDL und effektive 
FPGA-resourcen-Nutzung geht, kommt man um händisches Optimieren nicht 
herum.

Abstraktere Sprachen wie z.B. embedded MATLAB funktionieren zwar für 
einfache pipelines, liefern aber nicht unbedingt ein optimales Resultat. 
Ist halt mitunter nur schneller!

Martin S. schrieb:
> Der "grafische" Ansatz, der auch noch mancherorten per
> Tabellenkalkulation vonstatten geht, ist zum Entwurf bzw. zum Verstehen
> ok, aber nicht zielfuehrend.
Ich nehme an, du möchtest das automatisch skalieren können, sodaß sich 
die pipeline delays und loops durch Iterationen anpassen?

Da gabe ich dir Recht, allerdings sind solche mehrdimensionalen 
pipelines ja auch immer an Randbedingungen geknüpft und werden bei 
IRGENDWELCHEN Werten auch schnell ineffektiv. Ganz konkrete laufen meine 
audio pipes z.B. in 4er -Systemen, d.h. iterierende Funktionen wie IIR 
über Kanäle werkeln mit 4x4x4 = 64 (3D) oder 8x8 (2D), um die HW 
wirklich pausenfrei zu nutzen.

Die meisten Strukturen, die mehrdimensionale pipes erfordern, sind von 
der Aufgabenstellung auch ähnlich gelagert, z.B. ein CIC3 - der völlig 
iterativ an mehreren Stellen aufblähen muss, wodurch die pipeline-Latenz 
so wächst wie die Iteration und damit passt.

Martin S. schrieb:
> Vitis-Ansatz per C-code
Da sehe ich auch keine Möglichkeit, etwas dynamischer zu formulieren, 
als es eh in VHDL geht. Mit einem GENERATE-Konstrukt kann man Delays, 
Latenzen, Zusatzregister und auch Loops (über bedingte 
feed-back-Zuweisungen und Zählerstände) ja allesamt dynamisch steuern 
und sich sogar ausrechnen lassen.

Für eine Optimierung krummer Werte, die nicht sofort evident sind, 
könnte man Variationsrechnungen laufen lassen, mit leichtabweichenden 
Werten, diese in die Simulation stecken und die Effizienz bewerten. Bei 
vielen Systemen ist das aber recht durchsichtig, z.B. sind ein 7x9 oder 
6x10 -System nicht weit weg von einem 8x8 und brauchen nur einige wenige 
"Warteregister". Auch eine zyklische Dezimation von 5x5x5 passt mit 125 
gut zu einem 2x64er-Taktsystem und ein 7x8x9 CIC wiederum gut zu einem 
2x256er Dezimator.

von Bradward B. (Firma: Starfleet) (ltjg_boimler)


Lesenswert?

>  Mir geht es
> darum, dass solche Konstrukte ausserhalb des Compilers ueber eine
> formale Verifikation als korrekt bewiesen werden koennen, auch wenn z.B.
> die Zwischenform manuell editiert wird.

Weil es hier um IIR (rückgekoppelte) Filter geht die bekanntlich zum 
Schwingen neigen ist die Forderung nach Verifikation nachvollziehbar. 
Wobei ich das eher in der echten Kette kenne, also Generator an den 
Filtereingang und Ausgang bewerten. Die Beachtung von Numerik-rauschen 
macht das ganze auch nicht einfacher, vielleicht ein Job den der 
Projektleiter extra Headcount zuweist. Als FPGA-Engineer neigt man eher 
zu resourcensparenden Lösungen und hat nicht alle Auswirkungen im Blick.

Ein Kollege hatte mal ein IIR statt FIR in einem Funkgerät eingesetzt um 
die geforderte Steilheit mit weniger Taps zu erreichen (war halt ein 
kleiner FPGA) und hatte damit auch erfolg weil er das Ganze seinen 
Worten nach intensiv testete. Intensiv klang bei dem nach mehrfach 
länger als gewöhnliche Funkgerätetests. Das war zu Anfangszeiten von 
kommerziellen SDR.

Wenn man es mathematisch begründen muß, helfen vielleicht 
Stabilitätskritereien mit Grosszügigen Margin (aehm, ich weiss das ist 
eine sehr wolkige Formulierung) und der Nachweis, das kritische Zustände 
nicht auftreten können. Wobei nach Murphy es irgendwann doch passiert. 
Dann wäre es gut zu zeigen wie diese Fehler (hier Schwingungsverhalten) 
abgefangen werden. Live könnte man das mit Fehlerinjektion überprüfen.
Also vielleicht "Extras" wie Scanpath etc vorhalten um den Test in echt 
zu vereinfachen.

Aber wenn formale verifikation gefordert ist, die tools das aber nicht 
hergeben dan muss halt der Projektleiter ne Entscheidung treffen. 
Vielleicht zwei Optionen vorlegen sicher Varianten (FIR) braucht x 
resourcen, die nicht formal verifizierte u.U. kritische Variante (IIR) 
kommt mit z% von der Variante FIR aus.

Die Skepsis bezüglich HLS teile ich, nicht zuletzt weil mir vor kurzem 
ein FAE der gerade noch BildverarbeitungsFilterdesign mit HLS anpries 
eher abriet das in kritischen Bereichen wie Medizintechnik einzusetzen 
weil es eben noch zu neu ist - "Never change a running system".

von Martin S. (strubi)


Lesenswert?

J. S. schrieb:
> Ich nehme an, du möchtest das automatisch skalieren können, sodaß sich
> die pipeline delays und loops durch Iterationen anpassen?

Ja, was im Grunde genommen öfters vorkommt, ist, dass man 
Berechnungsterme in eine andere Stage verschiebt, oder die Tiefe der 
Pipeline ändern muss. Noch böser wird es, wenn wie schon angesprochen 
Datenpfade geschaltet (multiplex) werden, also mehrere "lanes" 
alternierend durch eine Pipeline genudelt werden (wie z.B. 
dual-lane-DCT).

Die Analyse meckert dann, wenn die Latenzoffsets nicht mehr stimmen, 
also man versehentlich was, was in Stage n bereit ist, in Stage n+2 zur 
Berechnung verwendet und nicht mit einem Delay-Register überbrückt. Aber 
gerade sowas zwingt einen bei Rekursion schon zu Konstrukten, die die 
Latenz automatisch anpassen, aber trotzdem meckern, wenn die 
Kausalitäten einer rekursiven Formel verletzt sind.

In Python kann man z.B. die Referenz auf ein y[-2] so garnieren:
1
y = FeedbackQueue(y_result, init = START_VALUES)
2
3
@pipeline.stage
4
def func_mul():
5
    z.next = const[2] * y[func_mul, -2]

Wenn man's dann in eine spätere Stage verschieben sollte, macht das nix, 
da die Queue-Logik den Index relativ zum Stage-'funclet' korrigiert und 
allfällig nötige Delays implizit instanziiert.

Thema Spade/Clash und Konsorten habe ich jetzt mal unter den 
Haskell/Scala-artigen Ansätzen verbucht und vor einer Weile mal 
angesehen, aber mir scheinen da eine Menge HLS-Probleme (wie das 
IIR-Szenario) noch nicht elegant gelöst. Aber vielleicht liesse sich 
deren "DSP-Compiler" schon zur stückweisen Verifikation per Ausgabe in 
deren Beschreibung umsetzen.

Bradward B. schrieb:
> Weil es hier um IIR (rückgekoppelte) Filter geht die bekanntlich zum
> Schwingen neigen ist die Forderung nach Verifikation nachvollziehbar.

Der numerische Aspekt ist in der Stufe der Verifikation nicht mehr 
relevant. Es geht nur noch darum, die seriell "programmierte" Formel 
(bitgenau) korrekt in eine Pipeline zu überführen, und das insbesondere 
unter manueller Optimierung der Zwischenform. Das Beispiel IIR habe ich 
vor allem wegen der Stolperfallen betreffend verletzter Kausalitäten in 
Bezug auf Pipeline-Tiefe angeschnitten.

von Rbx (rcx)


Lesenswert?

Hast du schon mal die KI hinsichtlich praxisbewährter Workflows befragt? 
Teilweise kann man die schon etwas genauer fragen und kann schon ganz 
gute Antworten diesbezüglich bekommen. Hängt natürlich auch von den 
Fragen selber ab ;)

von Martin S. (strubi)


Lesenswert?

Rbx schrieb:
> Hast du schon mal die KI hinsichtlich praxisbewährter Workflows
> befragt?
> Teilweise kann man die schon etwas genauer fragen und kann schon ganz
> gute Antworten diesbezüglich bekommen. Hängt natürlich auch von den
> Fragen selber ab ;)

Ja, die ist sogar ordentlich involviert. Die Antwort ist, dass sie mit 
DSL-Dialekten (domain specific languages) sehr gut performt, und man ihr 
die auch gut beibringen kann. Weil sie aber des öfteren noch die 
Randszenarien verpeilt, braucht es eine formale Darstellung, die sie mit 
ihrem temporären 'SLM' (small statt large) gut erfassen kann. Aber das 
ist eher experimenteller Nebenschauplatz.

von Rbx (rcx)


Lesenswert?

Martin S. schrieb:
> Aber das
> ist eher experimenteller Nebenschauplatz.

Ah ja, ok. Aber immerhin weiß sie schon, dass die Orientierung am 
Balancing sehr zentral sein kein. Parallelprogrammierung hat so seine 
Tücken, und da kann man wirklich jede Hilfe gebrauchen.
Ich kenne auch Bereiche, wo die KI einiges durcheinanderbringt. Das hat 
aber auch damit zu tun, wenn nicht viele Informationen hinsichtlich der 
Fragen verfügbar sind.
Ich habe mal nach Balancing gefragt, eher wegen der Schreibweise, aber 
egal, dieser Link hier ist auch gar nicht so schlecht (meint auch etwas 
anders, aber..):
https://ieeexplore.ieee.org/document/11105416

von J. S. (engineer) Benutzerseite


Lesenswert?

Bradward B. schrieb:
> Weil es hier um IIR (rückgekoppelte) Filter geht die bekanntlich zum
> Schwingen neigen ist die Forderung nach Verifikation nachvollziehbar.

... aber technisch schwierig zu lösen, weil man theoretisch JEDEN 
möglichen Fall simullieren müsste. Das erfordert zunächst, bitgenau mit 
exakt den möglichen Samples zu arbeiten, weil die zeitliche 
Sampleauflösung nämlich - gerade im Bereich der hohen Signalanteile - 
starken Einfluss nimmt. Da kommt dann auch Klirren hinein, was 
untersucht werden muss.

Meines Erachtens ist das dann aber auch weniger ein Problem einer 
konkreten Sprache, sondern mehr das des logisch richtigen Ansatzes: Es 
müssen die Fälle identifiziert werden, in denen das Produkt aus 
Amplitude und Zeitdauer des einspeisenden Signals maximal sind und dann 
für jeden Samplefall (oder gruppenweise mit nach oben abgeschätzten 
Signale) die Folgestufen simuliert werden. Das allein kann schon 
ziemlich saftig werden, wenn da einiges hinten dran hängt. Kürzlich 
hatte ich das mit verkoppelten OPs, ihren internen Filtern und 
nachgeschalteten Filtern mitsamt einem langen Kabelmodell - alles 
übrigens in pure VHDL und ModelSim.

IIRs sind deshalb ein Problem, weil faktisch ein cleaner, nackter IIR 
immer zum Überlaufen zu bringen ist, wenn man die Anregung genügend 
lange stehen lässt, respektive diese den Filter günstig = 
energieliefernd anregt, also im Bereich der Resonanzfrequenz und der 
richtigen Phase arbeitet.

Das ist nicht so easy und muss funktionell untersucht werden, was da 
überhaupt kommen kann!

In der Audiotechnik lösen wir das ganz elegant mit verlustbehafteten 
Filtern, welche proportional (oder auch gerne mal überproportional) 
einen gewissen Prozentsatz ihres Amplitudenwertes "verlieren". Das heißt 
das Filter geht zunehmend in Sättingung. Das verschiebt die 
Resonanzfrequenz und (was man auch korrigieren könnte, wenn man wollte) 
verringert etwas die Güte - entspricht aber durchaus dem realen 
Verhalten der Elektronik, die wir ja nachstellen möchten. Tut man das 
nun auch in der allgemeinen Signalverarbeitung per Software, bekommt man 
einen noch weitgehend ideal funktionierenden Filter, dessen Maximalwert 
aber sehr genau determiniert ist, weil sich dieser aus 1/X des 
Prozentsatzes ergibt, welcher durch das Maximum der Anregung definiert 
ist. Ein Filter, das mit einem 32 Bit-Wert angeregt wird und 1/1024 
"vergisst", braucht demnach 42 Bit Auflösung.

q.e.d. !

Mit solchen Taktiken schafft man es, den Verifikationsaufwand 
kleinzuhalten und hat sein System im Griff. Ganz generell wird auch kaum 
jemand in der Industrie eine VHDL-Komponente im System akzeptieren, die 
einen Heidenaufwand an Verifikation aufwirft und womöglich dann 3 Tage 
mehr Entwicklungszeit nachsichzieht, nur um ein paar Kröten für die 
Komponente oder FPGA-Resourcen zu sparen. Der aktuelle Weg ist ja eher, 
billig entwickeln und Ranshid haut den Standard rein, dafür fetter FPGA.

Was konkret IIR-Filter angeht, ist es auch funktionell gesehen nicht 
zielführend, unbekannte Amplituden zu haben und handhaben zu müssen.
So ein typisches Filter, welches unmerklich "vergessen" soll, hat in 
meinem Synthesizer typisch 1/4096 ... 1/16384 an Verlust, je nach 
lokaler Samplefrequenz. Damit läuft es weitgehend frei und akustisch 
korrekt.

Aus funktioneller Sicht der Klangsynthese ist das aber nicht in Ordnung! 
Ich kann über einen langen Pfad keine abartig hohen Amplituden 
gebrauchen und es macht musikalisch auch keinen Sinn. Daher muss da 
entweder eine Amplitudenregelung hinein, die der user verstellen und 
anpassen kann, oder man lässt eine AGC wirken - bzw erhöht die Verluste 
im Filter bereits unnatürlich auf z.B. 1/128 etc. Das verfälscht 
natürlich die Filterwirkung, führt aber zu dem funktiell verwertbareren 
Ergebnis und das gilt nicht nur für Audio:

Bei praktisch allen Anwendungen gibt es indirekt eine Art von 
Sollbereich für die Amplitude, mit denr das System sinnvoll arbeiten 
kann und die darf nicht weitverlassen werden. Das kann bei mathematisch 
einfachen IIR aber leicht passieren, selbst wenn sie durchsimuliert oder 
beschränkt sind womit sie technisch nicht überlaufen. Das scheint aber 
irgendwie nicht so richtig verstanden zu sein:

Ich kann mehrere Firmen und Projekte benennen, wo sich offenkundig 
unerfahrene bachelor-Entwickler aus MATLAB heraus eine VHDL für einen 
IIR-Filter haben bauen lassen und dann wunderten, daß die Elektronik 
eines
a) Ultraschallkopfs für Medizin
b) StepperMotor für Medizin
c) Heistungsmotor für Militär
komische Sachen machte, übersteurte und sogar anfing, zu preifen und am 
Ende jeweils der Motor bzw. die Elektronik über den Jordan (oder sagen 
wir genauer die Tauber / den Neckar) ging.

Da fehlt Manchen einfach der funktionelle Denkansatz und das Verständnis 
für die Mechanik / Physik. Das lösen formale Verfikationssprachen genau 
so wenig, wie AI-Ansätze oder MATLAB.

Als mir zuletzt so ein Filter unter kam, musste ich auch wieder stutzen, 
weil es in einem wirklich sicherheitskritischen Bereich war und die 
elektronikliefernde Firma wirklich nur die Elektronik und die VHDL 
liefern sollte; inklusive aller funktionellen Testbenches - ohne jedoch 
die Betriebsfälle zu kennen. Das müsste der Endkunde dann selber tun, 
wird er aber nicht hinbekommen, ohne sehr genaue Modelle des 
Funktionsverhaltens und der Sensoren, deren Signale da gefiltert werden 
sollen. Mein Hinweis auf die Problematik wurde abgewiesen mit der 
Begründung, daß der Auftraggeber ausdrücklich einen IIR vorgeben hat.

Da ich weiß, wer der Auftraggeber ist, habe ich mich entschieden, wohl 
besser NICHT mit dessen Produkten mitzufliegen. :D

: Bearbeitet durch User
von J. S. (engineer) Benutzerseite


Lesenswert?

Bradward B. schrieb:
> muss halt der Projektleiter ne Entscheidung treffen.
> Vielleicht zwei Optionen vorlegen sicher Varianten (FIR) braucht x
> resourcen, die nicht formal verifizierte u.U. kritische Variante (IIR)
> kommt mit z% von der Variante FIR aus.

Das genau meinte ich. Das liegt bei der Zerstückelung heutiger Projekte 
und Verteilung auf Firmen und Abteilungen aber oft gar nicht mehr in 
dessen Hand. Er kann es gar nicht entscheiden, respektive er hat gar 
nicht die Kompetenzen, es zu verstehen, weil zu weit weg von der 
Thematik. Personen am Ende der Kette (= Entwickler) haben oft aber nicht 
die Lust, weiter oben angesiedelte Personen auf Denkfehler hinzuweisen.

Daher verschiebt sich die Thematik durchaus inzwischen vom technischen- 
zum juristischen Ansatz: Man muss als Entwickler (und besonders als 
externer Auftragnehmer!) sicherstellen, daß der Beauftrager/Kunde eine 
email bekommen hat, in der man das technisch Richtige empfohlen hat und 
eine weitere, in der zum Ausdruck kommt, daß dies angekommen ist und 
dann eine dritte, daß der Vorschlag abgelehnt wurde. Dann muss man noch 
zusehen, daß das Ganze schön sauber in der Projektdokumentation steht 
und der Beschluss die Komponente "X" zu benutzen, von Herrn Müller / dem 
Endkunden kommt und nicht von einem selber.

Spannend wird das Ganze, wenn demnächst die Anforderungen vom Product 
Owner mit der AI ins Doors oder Enterprise gequetscht werden und wer 
dann den schwarzen Peter hat, wenn die Funktion nicht passt.

Bradward B. schrieb:
> ie Skepsis bezüglich HLS teile ich, nicht zuletzt weil mir vor kurzem
> ein FAE der gerade noch BildverarbeitungsFilterdesign mit HLS anpries
> eher abriet das in kritischen Bereichen wie Medizintechnik einzusetzen
Die denken ganz genau so und das auch aus demselben Grund. Bei praktisch 
allen AXI- und SOC-Demos von XI steht drin, daß sie weder für MED noch 
MIL hergenommen werden sollen, was aber tagtäglich passiert und sogar 
passieren muss, wenn man damit effektiv arbeiten will. Selbiges gilt für 
Chips. Es wird alles auf den Kunden abgeladen.

Es geht inzwischen immer weniger um das technische Sicherstellen der 
Funktion, sondern immer mehr darum, daß man selber für die möglichen 
Fehler der wachsenden Komplexität der Systeme nicht verantwortlich sein 
möchte, weil man das alles gar nicht mehr im Griff hat.

Manche Firmen lösen das mit "back to the roots" und bauen wieder 
einfaches natives VHDL mit möäglichs wenig Baukasten, möglichst wenig 
MATLAB sondern fertigen getesten Modulen, die sie selber hosten und die 
garantiert arbeiten.

: Bearbeitet durch User
von Martin S. (strubi)


Lesenswert?

Es driftet gerade ein bisschen ab (speaking of IIR)...
Die numerische Instabilität ist eigentlich ganz gut in den Griff zu 
kriegen. Worum es hier geht, ist die formale Verifikation des 
Übergangs in die HW-Pipeline und bei entsprechendem Nachoptimieren, 
nicht ob das ganze numerisch Sinn macht. Das ist zumindest in meinem 
Workflow an früherer Stelle abgehakt, und wenn es um 
reale-Werte-Szenarien unter Randbedingungen geht, würde ich jetzt eher 
von Simulation sprechen. Das hat dann weder deterministischen noch 
formalen Charakter.

Die Ironie ist allerdings gerade, dass z.B. 
Fehlerakkumulation/Korrektur, damit IIR-Pole nicht anfangen zu wandern, 
die Pipeline eben verlängern kann. Diese Komplexität ist per klassische 
HDL nicht mehr wirklich fehlerfrei zu bewältigen, oder es endet in 
Write-Only-HDL.
Jetzt kann man einfach einem HLS-Tool (alias DSP-Compiler) vertrauen, 
oder den hybriden Ansatz wählen, bei letzterem scheint sich nach Jahren 
des Pröbelns herauszukristallisieren, dass eine formale, gut lesbare 
Darstellung eine Menge Erleichterung bringt und Fehler im Fluss sichtbar 
macht, schon einfache Erkennung von Latency-Mismatches bei verwobener 
Pipeline-Logik  ist Gold wert, ganz zu schweigen von einer gesunden 
Fixpoint-Arithmetik. Deswegen machen solche Ansätze wie sie Clash oder 
Spade verfolgen, durchaus Sinn.
Schlussendlich wäre es toll, wenn "der Automat" den ganzen Job inkl. die 
Verifikation der Umsetzung der Formel in die Pipeline erledigt, aber bis 
dahin freue ich mich schon über gelungene/editierbare Notationen.

von Rolf (audiorolf)


Lesenswert?

Martin S. schrieb:
> Ausgabe in eine Zwischendarstellung einer Pipeline
Was genau meinst du mit der Zwischendarstellung?
Beispiel?

Dann hätte ich mehrere Unklarheiten aus einem Satzpaket:

Martin S. schrieb:
> Fehlerakkumulation/Korrektur, damit IIR-Pole nicht anfangen zu wandern,
Wieso wandern die Pole und wann?

> die Pipeline eben verlängern kann.
Wieso verlängert sich dadurch die pipeline? die pipeline verlängert sich 
doch nur bei geänderter Formel oder wenn es mit dem timing nicht klappt 
und Flops benötigt werden

> Diese Komplexität ist per klassische
> HDL nicht mehr wirklich fehlerfrei zu bewältigen,
Wieso und an welchem Punkt ist das nicht fehlerfrei zu bewältigen?

> Write-Only-HDL
Was ist das dann nun? Haben wir in der Schweiz nicht.

von Martin S. (strubi)


Lesenswert?

Rolf schrieb:
> Martin S. schrieb:
>> Ausgabe in eine Zwischendarstellung einer Pipeline
> Was genau meinst du mit der Zwischendarstellung?
> Beispiel?

Sowas typischerweise:
1
    @mypipe.pipeline(clk, ce = data_valid,
2
                     reset = None, pass_out = pval)
3
    def worker_pipe():
4
        @mypipe.stage
5
        def mul_v():
6
            p0.next = COS * work_q[mul_v, -1] # implicit adjust
7
            t0.next = RS * work_q[mul_v, -2] # implicit adjust
8
9
 # gekuerzt
10
...
11
12
        @mypipe.stage
13
        def calc_squares():
14
            pi.next = out_i * out_i
15
            pq.next = out_q * out_q

>
> Dann hätte ich mehrere Unklarheiten aus einem Satzpaket:
>
> Martin S. schrieb:
>> Fehlerakkumulation/Korrektur, damit IIR-Pole nicht anfangen zu wandern,
> Wieso wandern die Pole und wann?
>

Numerische Instabilitäten (das Maschinen-Epsilon insbesondere der 
Fixpunkt-Arithmetik), die sich über die Zeit akkumulieren. Bei den 
"stupiden" Look-Ahead-Transformationen richtig lustig. Vorgängig werden 
die Zustände zwar immer ungenauer, aber faktisch kann man es auch als 
Poldrift sehen.

>> die Pipeline eben verlängern kann.
> Wieso verlängert sich dadurch die pipeline? die pipeline verlängert sich
> doch nur bei geänderter Formel oder wenn es mit dem timing nicht klappt
> und Flops benötigt werden
>

In besagtem Fall habe ich einen Fehlerakkumulator (Bresenham) mitlaufen. 
Der sorgt für Korrekturterme, die erst später vorliegen, aber früh genug 
wieder in die erste Stage als Feedback einfliessen sollen.

>> Diese Komplexität ist per klassische
>> HDL nicht mehr wirklich fehlerfrei zu bewältigen,
> Wieso und an welchem Punkt ist das nicht fehlerfrei zu bewältigen?
>

Ich sehe ehrlich gesagt nicht, wie man V*-HDL mit den eingebauten 
"Bordmitteln" Automatismen zur Fehlerquellenvermeidung beibringen kann, 
also sowas wie:

- Latenzkontrolle
- Vernünftige Fixpoint-Fehlerpropagation
- formale Verifikation der Formel

ohne alles manuell auszuformulieren, und man an mehreren Stellen drehen 
muss, wenn man eine "einfache" (doch nicht-trivial in den Auswirkungen) 
Änderung macht. Ein Quell der Fehlerfreude.

Damit wären wir beim:

>> Write-Only-HDL
> Was ist das dann nun? Haben wir in der Schweiz nicht.

Oh, es wird sogar an manchen Schweizer Hochschulen so gelehrt :-)

von Christoph Z. (christophz)


Lesenswert?

Martin S. schrieb:
>>> Write-Only-HDL
>> Was ist das dann nun? Haben wir in der Schweiz nicht.
>
> Oh, es wird sogar an manchen Schweizer Hochschulen so gelehrt :-)

Er meint hier ein Phänomen, dass in diversen Sprachen früher oder später 
eintritt.
Ab einer gewissen Komplexität vom Program und typischerweise zusätzlich 
durch Performanceoptimierung hat man zwar eine funktionierende 
Implementierung aber ohne ganz viele Komentare ist er einfach schlicht 
nicht mehr verstehbar.

Internet-Memes dazu drehen sich hauptsächlich um reguläre Ausdrücke und 
Perl das geht aber gerade so gut in C und VHDL :-)

von Rolf (audiorolf)


Lesenswert?

Martin S. schrieb:
> aber faktisch kann man es auch als
> Poldrift sehen.

Das sehe ich z.B. nicht so. Die Auswirkungen verändernder Pole (was in 
Einzelfällen in autoadaptiven Gleichungen ja vorkommt) ist i.d.R. eine 
völlig andere, als akkumulierte Fehler.

Martin S. schrieb:
>>> Write-Only-HDL
>> Was ist das dann nun? Haben wir in der Schweiz nicht.
> Oh, es wird sogar an manchen Schweizer Hochschulen so gelehrt :-)
Also an der ETH hatten wir mehrere Module die sich um strukturierten 
Code-Entwurf und -dokumentation drehten.

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.