assembly - 如何验证 LR/SC 序列的约束(RISC-V ISA)
问题描述
我已经阅读了关于 RV32A 扩展的 RISC-V 规范,我有一个问题:如果程序执行这些指令,CPU 如何验证 LR/SC 序列的约束:
lr.w x6,x0,(x0)
jal x0,dest
.......
beq x0,x0,-1
.......
dest:
sc.w x1,x6,(x0)
规范说:“为了保证序列最终成功,在 LR 和 SC 指令之间执行的动态代码只能包含来自基本“I”指令集的其他指令,不包括加载、存储、向后跳转或采取的向后分支、JALR、FENCE、FENCE.I 和 SYSTEM 指令。”。
因此,如果程序跳过 beq(采用违反上述约束的反向分支),CPU 如何检测 'beq' 出现在 LR/SC 序列中。在我的设计中,如果程序执行上述指令,硬件无法检测到'beq',那么SC可以成功地将数据存储到数据存储器中,但实际上应该导致存储失败。
解决方案
beq
不是在 LR 和 SC 之间执行的动态代码的一部分。这不违反您引用的约束,因为不执行。它只是坐在内存中什么都不做,就像你用.beq
jal
动态表示执行顺序,静态表示内存地址顺序。
此外,CPU不需要使此类序列始终失败,只是允许这样做。因此,如果程序员想要确保每个 RISC-V CPU 都可以通过 LR/SC 序列而不会因为某些特定的非法条件(例如执行backs )而中止,则应该避免使用它们beq
。
推荐阅读
- python - 创建解码器目标序列
- java - Netty 中的 MessageToMessageCodec 与 MessageToMessageDecoder 和 MessageToMessageEncoder
- mysql - mysql/mariadb 上用户 'root'@'localhost 的访问被拒绝
- jquery - jQuery - 在链中使用上下文?
- excel - 一种在 Excel 文件中获取 vlookup 以使用单元格值在设置目录中搜索 csv.file 然后从 csv 文件返回给定单元格值的方法?
- javascript - ERROR 错误:路由“ViewPayments”的组件必须是 React 组件。例如:
- jquery - 以可见屏幕为中心的弹出框(也向下滚动)
- go - 从属于同一项目的单独包的未定义导入
- javascript - 通过 Ajax 主体中的 API 传递表单修改数据和数据
- node.js - 与 GraphQL 数据加载器一起实现内存缓存