Emulation

  • Emulation
  • Emulationskonzept
  • Schaltungsabbildung
  • Lookup-Tables (LUT)
  • CLB mit 2 Lookup-Tables (LUTs)
  • Rekonfigurierbare Netze
  • Partitionierung
  • Fiduccia-Mattheyses-Algorithmus
  • Anzahl der Pins
  • Eigenschaften der Emulation
  • Simulation/Emulation/ASIC
  • Emulationsbetriebsarten
  • Vector Debug Modus
  • In-Circuit-Emulation
Startseite
Fiduccia-Mattheyses-Algorithmus FM-Partitionierung(G(V,E), max_passes, tol): P ← balancierte Zufallspartition von V wiederhole max_passes mal: gain(v) ← ext(v) − int(v) für alle v locked ← ∅; moves ← []; cum ← 0; best ← 0; best_i ← −1 solange es freie Knoten gibt: v ← freier Knoten mit max gain(v), der die Balance einhält wenn keiner existiert: abbrechen verschiebe v in die andere Partition; locked ← locked ∪ {v} für freie Nachbarn u von v: gain(u) −= 2 wenn P[u] = P[v], sonst gain(u) += 2 cum += gain(v); moves.add(v) wenn cum > best: best ← cum; best_i ← |moves| − 1 mache alle Moves nach Index best_i rückgängig wenn best = 0: abbrechen gib P zurück   CLB CLB CLB CLB CLB CLB     Knoten v ext(v)=externe Kante int(v)=externe Kante AktuellerCut Laufzeit linear in |E| Kanten und k passes : O( k * |E| ), aber heuristisches Ergebnis

Das Partitionierungsproblem ist an sich sehr schwer zugänglich (NP-Hart), da es sehr viele Möglichkeiten der Zuordnung der Knoten zu den Partitionen gibt. Allerdings können wir es heuristisch effizient lösen. Dazu betrachten wir ein einfacheres Problem der balanzierten Bi-Partitionierung eines Graphen. Balanziert meint, das die Partitionen des Ergebnisses annähernd gleich groß sein müssen. Die Kanten seien einfach und haben alle das Gewicht 1. Die zusätzlichen Bedingungen wie kritischer Pfad in einer Partition und Sodnerbehandlung von Ein- und Ausgängen sowie Netze (Kanten) mit mehr als 2 angeschlossenen Knoten können dem Problem hinzugefügt werden, ohne das Problem stark zu beeinflussen. Des weiteren können wir auch mehr als 2 Partitionen für mehr als 2 FPGAs durch rekursive BiPartitionierung erreichen.

Für die balanzierte Bi-Partitionierung gibt es eine guten Algorithmus, den Fiduccia Matheyses Algorithmus, der von einer zufälligen Startpartitionierung ausgeht und dann in mehreren Durchläufen jeweils eine Liste von gains bestimmt, die aussagt, was es bringen würde, einen Knoten in die andere Partition zu verschieben. Diese Liste wird absteigend abgearbeitet und jeweils immer wieder upgedated, so dass jeder Knoten einmal verschoben wurde. Letztlich merkt sich der Algorithmus dann die beste Lösung jedes der ca. 10 Durchläufe und gibt diese zurück.

Es handelt sich um einen heuristischen Algorithmus mit keiner Garantie auf ein Optimum. Diese Eigenschaft ist für unser Problem akzeptabel denn letzlich müssen die Partitionen in die FPGAs passen und es müssen nicht zu viele Kanten für die IOs beschnitten werden. Wenn es ein paar mehr als das Optimum sind stört das nicht weiter.

Der Fiduccia-Mattheyses-Algorithmus hat eine nahezu lineare Laufzeit in der Kantenzahl des Graphen. Was deutlich besser ist als der Vorgänger, der Kerninghan-Lin-Algorithmus, der eine Laufzeit von O(n^2 * log(n)) für n Knoten aufweist. Moderne Partitionierungsalgorithmen arbeiten teilweise konstruktiv durch Lösen eines Eigenwert Problems auf eine modifizierten Adjazenzmatrix.