fence
lyszt.net tratta fence e altre istruzioni RISC-V in modo più dettagliato.
Descrizione
Le istruzioni FENCE vengono utilizzate per ordinare l'I/O dei dispositivi e gli accessi alla memoria come visti da altri hart RISC-V e da dispositivi esterni o coprocessori. Qualsiasi combinazione di input di dispositivo (I), output di dispositivo (O), letture di memoria (R) e scritture di memoria (W) può essere ordinata rispetto a qualsiasi combinazione delle stesse. In modo informale, nessun altro hart RISC-V o dispositivo esterno può osservare un'operazione nell'insieme successor successivo a un FENCE prima di un'operazione nell'insieme predecessor precedente al FENCE. memorymodel fornisce una descrizione precisa del modello di coerenza della memoria RISC-V.
Le istruzioni FENCE ordinano anche le letture e le scritture di memoria effettuate dall'hart come osservate dalle letture e scritture di memoria effettuate da un dispositivo esterno. Tuttavia, le istruzioni FENCE non ordinano le osservazioni di eventi effettuate da un dispositivo esterno utilizzando qualsiasi altro meccanismo di segnalazione.
L'EEI definirà quali operazioni di I/O sono possibili e, in particolare, quali indirizzi di memoria, quando acceduti da istruzioni di load e store, saranno trattati e ordinati rispettivamente come operazioni di input di dispositivo e output di dispositivo anziché come letture e scritture di memoria. Ad esempio, i dispositivi di I/O mappati in memoria saranno tipicamente acceduti con load e store non in cache che sono ordinati utilizzando i bit I e O anziché i bit R e W. Estensioni del set di istruzioni potrebbero anche descrivere nuove istruzioni di I/O che saranno anch'esse ordinate utilizzando i bit I e O in un'istruzione FENCE.
Codifica della modalità Fence
Il campo modalità FENCE fm definisce la semantica dell'istruzione FENCE. Un FENCE (con fm=0000) ordina tutte le operazioni di memoria nel suo insieme predecessore prima di tutte le operazioni di memoria nel suo insieme successore.
Un'istruzione FENCE.TSO è codificata come un'istruzione FENCE con fm=1000, predecessor=RW e successor=RW. FENCE.TSO ordina tutte le operazioni di load nel suo insieme predecessore prima di tutte le operazioni di memoria nel suo insieme successore, e tutte le operazioni di store nel suo insieme predecessore prima di tutte le operazioni di store nel suo insieme successore. Questo lascia le operazioni di store non-AMO nell'insieme predecessore di FENCE.TSO non ordinate rispetto ai load non-AMO nel suo insieme successore.
I campi inutilizzati nelle istruzioni FENCE--rs1 and rd--sono riservati per fence a granularità più fine in future estensioni. Per la compatibilità futura, le implementazioni di base devono ignorare questi campi#, e il software standard deve azzerare questi campi. Allo stesso modo, molte impostazioni di fm e degli insiemi predecessore/successore sono anch'esse riservate per uso futuro. Le implementazioni di base devono trattare tutte queste configurazioni riservate come istruzioni FENCE (con fm=0000), e il software standard deve utilizzare solo configurazioni non riservate.