fence
lyszt.net obejmuje fence i inne instrukcje RISC-V w większych szczegółach.
Opis
Instrukcje FENCE służą do porządkowania operacji wejścia/wyjścia urządzeń oraz dostępów do pamięci w sposób widziany przez inne harty RISC-V oraz urządzenia zewnętrzne lub koprocesory. Dowolna kombinacja wejścia urządzenia (I), wyjścia urządzenia (O), odczytów pamięci (R) i zapisów pamięci (W) może być uporządkowana względem dowolnej kombinacji tych samych operacji. Mówiąc nieformalnie, żaden inny hart RISC-V ani urządzenie zewnętrzne nie może zaobserwować żadnej operacji ze zbioru successor następującego po FENCE przed jakąkolwiek operacją ze zbioru predecessor poprzedzającego FENCE. memorymodel zawiera precyzyjny opis modelu spójności pamięci RISC-V.
Instrukcje FENCE porządkują również odczyty i zapisy pamięci wykonywane przez hart w sposób obserwowany przez odczyty i zapisy pamięci wykonywane przez urządzenie zewnętrzne. Jednakże instrukcje FENCE nie porządkują obserwacji zdarzeń dokonywanych przez urządzenie zewnętrzne przy użyciu jakiegokolwiek innego mechanizmu sygnalizacji.
EEI zdefiniuje, jakie operacje wejścia/wyjścia są możliwe, a w szczególności które adresy pamięci, gdy są dostępne przez instrukcje ładowania i zapisu, będą traktowane i porządkowane odpowiednio jako operacje wejścia urządzenia i wyjścia urządzenia, a nie jako odczyty i zapisy pamięci. Na przykład urządzenia wejścia/wyjścia odwzorowane w pamięci będą zazwyczaj dostępne za pomocą niebuforowanych operacji ładowania i zapisu, które są porządkowane za pomocą bitów I i O, a nie bitów R i W. Rozszerzenia zestawu instrukcji mogą również opisywać nowe instrukcje wejścia/wyjścia, które również będą porządkowane za pomocą bitów I i O w instrukcji FENCE.
Kodowanie trybu Fence
Pole trybu FENCE fm definiuje semantykę instrukcji FENCE. FENCE (z fm=0000) porządkuje wszystkie operacje pamięci w swoim zbiorze poprzedzającym przed wszystkimi operacjami pamięci w swoim zbiorze następującym.
Instrukcja FENCE.TSO jest kodowana jako instrukcja FENCE z fm=1000, predecessor=RW i successor=RW. FENCE.TSO porządkuje wszystkie operacje ładowania w swoim zbiorze poprzedzającym przed wszystkimi operacjami pamięci w swoim zbiorze następującym oraz wszystkie operacje zapisu w swoim zbiorze poprzedzającym przed wszystkimi operacjami zapisu w swoim zbiorze następującym. To pozostawia operacje zapisu non-AMO w zbiorze poprzedzającym FENCE.TSO's nieuporządkowane względem ładowań non-AMO w jego zbiorze następującym.
Nieużywane pola w instrukcjach FENCE --rs1 and rd-- są zarezerwowane dla drobnoziarnistych fence'ów w przyszłych rozszerzeniach. Dla zgodności w przód implementacje bazowe będą ignorować te pola#, a standardowe oprogramowanie będzie zerować te pola. Podobnie wiele ustawień fm oraz zbiorów poprzedzających/następujących jest również zarezerwowanych do przyszłego użycia. Implementacje bazowe będą traktować wszystkie takie zarezerwowane konfiguracje jako instrukcje FENCE (z fm=0000), a standardowe oprogramowanie będzie używać wyłącznie konfiguracji niezarezerwowanych.