fence

fence

Asembler RISC-V Referencja

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.

ℹ
Urządzenie może zaobserwować dostęp do lokalizacji pamięci za pośrednictwem pewnego zewnętrznego mechanizmu komunikacji, np. rejestru sterującego odwzorowanego w pamięci, który steruje sygnałem przerwania do kontrolera przerwań. Ta komunikacja wykracza poza zakres mechanizmu porządkowania FENCE, a zatem instrukcje FENCE nie mogą dawać żadnej gwarancji, kiedy zmiana sygnału przerwania będzie widoczna dla kontrolera przerwań. Konkretne urządzenia mogą zapewniać dodatkowe gwarancje porządkowania w celu zmniejszenia narzutu oprogramowania, ale wykraczają one poza zakres modelu pamięci RISC-V.

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.

ℹ
Ponieważ FENCE RW,RW narzuca nadzbiór uporządkowań narzucanych przez FENCE.TSO, poprawne jest zignorowanie pola fm i zaimplementowanie FENCE.TSO jako FENCE RW,RW.

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.

ℹ
Wybraliśmy złagodzony model pamięci, aby umożliwić wysoką wydajność prostym implementacjom maszyn oraz prawdopodobnym przyszłym rozszerzeniom koprocesorów lub akceleratorów. Oddzielamy porządkowanie wejścia/wyjścia od porządkowania odczytów/zapisów pamięci, aby uniknąć niepotrzebnej serializacji w harcie sterownika urządzenia, a także aby obsługiwać alternatywne ścieżki niepamięciowe do sterowania dodanymi koprocesorami lub urządzeniami wejścia/wyjścia. Proste implementacje mogą dodatkowo ignorować pola predecessor and successor i zawsze wykonywać konserwatywny FENCE na wszystkich operacjach.