fence
lyszt.net охоплює fence та інші інструкції RISC-V більш детально.
Опис
Інструкції FENCE використовуються для впорядкування операцій введення-виведення пристроїв і звернень до пам'яті з точки зору інших хартів RISC-V та зовнішніх пристроїв або співпроцесорів. Будь-яка комбінація введення пристрою (I), виведення пристрою (O), читань пам'яті (R) і записів пам'яті (W) може бути впорядкована відносно будь-якої комбінації тих самих операцій. Неформально кажучи, жоден інший харт RISC-V або зовнішній пристрій не може спостерігати будь-яку операцію з множини successor, що йде після FENCE, раніше за будь-яку операцію з множини predecessor, що передує FENCE. memorymodel містить точний опис моделі узгодженості пам'яті RISC-V.
Інструкції FENCE також упорядковують читання та записи пам'яті, виконувані хартом, з точки зору читань і записів пам'яті, виконуваних зовнішнім пристроєм. Однак інструкції FENCE не впорядковують спостереження подій, виконувані зовнішнім пристроєм з використанням будь-якого іншого механізму сигналізації.
EEI визначить, які операції введення-виведення можливі, і зокрема, які адреси пам'яті при доступі до них за допомогою інструкцій завантаження та збереження будуть трактуватися та впорядковуватися як операції введення пристрою та виведення пристрою відповідно, а не як читання та записи пам'яті. Наприклад, до пристроїв введення-виведення з відображенням у пам'ять зазвичай звертаються за допомогою некешованих завантажень і збережень, які впорядковуються з використанням бітів I та O, а не бітів R та W. Розширення набору інструкцій також можуть описувати нові інструкції введення-виведення, які також будуть впорядковуватися з використанням бітів I та O в інструкції FENCE.
Кодування режиму Fence
Поле режиму FENCE fm визначає семантику інструкції FENCE. FENCE (з fm=0000) упорядковує всі операції з пам'яттю в своїй множині попередників перед усіма операціями з пам'яттю в своїй множині наступників.
Інструкція FENCE.TSO кодується як інструкція FENCE з fm=1000, predecessor=RW і successor=RW. FENCE.TSO упорядковує всі операції завантаження в своїй множині попередників перед усіма операціями з пам'яттю в своїй множині наступників, а також усі операції збереження в своїй множині попередників перед усіма операціями збереження в своїй множині наступників. Це залишає операції збереження non-AMO у множині попередників FENCE.TSO's невпорядкованими відносно завантажень non-AMO у його множині наступників.
Невикористовувані поля в інструкціях FENCE --rs1 and rd-- зарезервовані для дрібнозернистих fence у майбутніх розширеннях. Для прямої сумісності базові реалізації повинні ігнорувати ці поля#, а стандартне програмне забезпечення повинно обнуляти ці поля. Аналогічно, багато налаштувань fm і множин попередників/наступників також зарезервовані для майбутнього використання. Базові реалізації повинні трактувати всі такі зарезервовані конфігурації як інструкції FENCE (з fm=0000), а стандартне програмне забезпечення повинно використовувати лише незарезервовані конфігурації.