首页 > 解决方案 > 如何验证 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可以成功地将数据存储到数据存储器中,但实际上应该导致存储失败。

标签: assemblycpu-architectureriscv

解决方案


beq不是在 LR 和 SC 之间执行的动态代码的一部分。这不违反您引用的约束,因为不执行。它只是坐在内存中什么都不做,就像你用.beqjal

动态表示执行顺序,静态表示内存地址顺序。

此外,CPU不需要使此类序列始终失败,只是允许这样做。因此,如果程序员想要确保每个 RISC-V CPU 都可以通过 LR/SC 序列而不会因为某些特定的非法条件(例如执行backs )而中止,则应该避免使用它们beq


推荐阅读