Ich habe mich mit FPGA-Design beschäftigt und bin dann auf diese Begriffe Throughput
und gestoßen Latency
. Der Autor lieferte also ein Beispiel für eine hochgradig Pipeline-Implementierung zum Finden der Kubikwurzel einer Zahl:
was anscheinend das folgende Logikdiagramm hat:
.Dann hat der Autor versucht, die 'Latenz' zu reduzieren, indem er den Code wie folgt geschrieben hat:
die sich so abrollt:
Meine Frage ist, dass mir beide Implementierungen fast identisch erscheinen, also wie unterscheiden sie sich? Ich verstehe die blockierende und nicht blockierende Zuweisung, aber wie verursachen sie in diesem Fall ein anderes Logikdiagramm? Wie verringert es latency
im zweiten Fall die der Schaltung?
Logisch gesehen hast du Recht, sie sind identisch. Die erste Implementierung ist jedoch getaktet (beachten Sie die Always- @(posedge clk)
Anweisungen im Vergleich zu den @*
Anweisungen in der zweiten), sodass sie eine Latenz von mindestens drei Zyklen aufweist, die von der Taktperiode bestimmt wird. Die zweite Implementierung wird vollständig asynchron berechnet, sodass ihre Latenz nur von der Geschwindigkeit Ihrer Technologie abhängt (wie schnell sich die Multiplikationen und Routing-Verzögerungen auflösen).
Was dieses Beispiel veranschaulicht, ist, dass viele digitale Funktionen in einer stark gepipelineten Weise oder in einem langen Logikpfad oder irgendwo dazwischen implementiert werden können. Welche Sie wählen, kann von vielen Faktoren abhängen. Die erste Implementierung ist weniger ressourceneffizient, da sie viele zusätzliche Register verwendet, um die Pipeline-Werte von Zyklus zu Zyklus zu speichern. Der zweite ist ressourceneffizienter , aber wenn Sie ihn in ein synchrones System mit hoher Taktfrequenz einsetzen, wird es schwieriger, das Timing auf zu schließen , weil er so viel Logik in einen Zyklus passt.
Bemerkenswerterweise haben beide Implementierungen einen gleichwertigen Durchsatz . Beide können in jedem Taktzyklus eine Berechnung durchführen, nur dass die erste Implementierung die Ausgabe drei Taktzyklen nach dem Empfang der entsprechenden Eingaben liefert.
DuttaA
always
Aussage macht den Unterschied? Was ist mit den Registern? Warum ist es in der zweiten Implementierung nicht vorhanden?Jalalipop
DuttaA
Jalalipop
DuttaA
Jalalipop