Alternativ ...
Eigenschaft/Sequenzen obwohl sie erscheinen kleiner Code zu sein, in diesem Fall für jeden erf einen separaten Prozess mit einem eigenen Zähler (die noch keinen rsp erhalten) gegabelt. Dies führt dazu, dass viele Zähler sehr ähnliche Arbeiten ausführen. Wenn es viele req im Flug gibt (und/oder viele Instanzen der Eigenschaft oder Sequenz), beginnt es mit der Addition in die Simulationslaufzeit [obwohl dies nur ein kleiner Block von Code ist]
so ein anderer Ansatz ist halte den Trigger einfacher und wir versuchen, die Verarbeitung linear zu halten.
int counter=0; // you can use a larger variablesize to avoid the roll-over issue
int arr1[int] ; // can use array[MAX_SIZE] if you know the max request id is small
always @(posedge clk) counter <= counter + 1 ; // simple counter
function int latency (int type_set_get , int a) ;
if (type_set_get == 0) arr1[a] = counter; // set
//DEBUG $display(" req id %d latency %d",a,counter-arr1[a]);
// for roll-over - if (arr1[a] > counter) return (MAX_VAL_SIZE - arr1[a] + counter) ;
return (counter - arr1[a]); //return the difference between captured clock and current clock .
endfunction
property ps();
@(posedge clk)
disable iff (~rst)
##[0:$]((req,latency(0,req_id)) or (rsp,cg_inst.sample(latency(1,rsp_id))));
endproperty
assert property (ps);
Die obige Eigenschaft wird nur dann ausgelöst, wenn req/rsp zu sehen ist und nur 1 Thread aktiv ist, es zu suchen. Bei Bedarf können zusätzliche Prüfungen in der Funktion hinzugefügt werden, aber für die Latenzzählung sollte dies in Ordnung sein.
Anekdote:
Mentor AE - Dan eine Behauptung entdeckt, die um mehr als 40% unserer Simulationen wurde verlangsamt. Die schlecht geschriebene Behauptung war Teil unseres Block-TB und ihre Auswirkungen blieben dort unbemerkt, da unser Block-Level-Test, die Laufzeiten, begrenzt waren.Es schlich sich dann in unsere Top-Level-TB und verursachte unzählige Laufzeitverluste, bis es ein Jahr später entdeckt wurde :). [denke, wir hätten unsere Simulationsläufe früher profilieren sollen]
Zum Beispiel wenn das obige Protokoll zu einem späteren Zeitpunkt einen Abbruch einleitete, dann wird der req-rsp-Thread weiterarbeiten und warten (bis die Simulation endet) abgebrochene Transaktion, obwohl es die Funktionalität nicht beeinträchtigt, wird es schleichend weiterhin Prozessorressourcen rauben, die nichts Nützliches im Gegenzug tun. Bis schließlich ein Verkäufer AE einsteigt, um den Tag zu retten :)
** Hat nicht funktioniert ** bedeutet was? Ein Compilerfehler? keine Abdeckung? Bitte stellen Sie einen Testfall zur Verfügung. –
Es tut mir leid. Ich möchte wissen, ob dies der richtige Weg war. Bedeckt dies meine Latenz? – user1978273