通过chip的eval()函数对trace表的列添加约束。本文列出每个chip的核心约束。列出如下变量/寄存器clk:每条指令运行的时间戳pc:指令指针,指向当前指令ci:当前指令,pc指向的指令mp:内存指针,执行一个内存单元mv:内存值,mp所指内存单元的值
通过 chip 的 eval() 函数对 trace 表的列添加约束。本文列出每个 chip 的核心约束。
列出如下变量/寄存器
clk:每条指令运行的时间戳pc:指令指针,指向当前指令ci:当前指令,pc 指向的指令mp:内存指针,执行一个内存单元mv:内存值,mp 所指内存单元的值cpu 表的约束如下
+ 指令涉及一次读内存和一次写内存,需要用不同的时间戳进行区分,所以 clk 每次递增 2lookup 细节见:https://aping-dev.com/index.php/archives/811
每条指令都应该进行约束,将指令分为四种类型,对应四种 chip,分别为 AluChip, JumpChip, IoChip 和 MemoryInstructionsChip
AluChip 对 + 和 - 指令进行约束。
+ 指令约束:$mv_{i+1} - mv_i - 1 = 0$
- 指令约束:$mv{i} - mv{i+1} - 1 = 0$
JumpChip 对 [ 和 ] 指令进行约束。
引入如下变量
inv:如果 mv 为 0,则值为 0,否则为 mv 的乘法逆元
iszero:1 - mv * inv 的结果,当 mv 为 0 时,它取值为 1,否则为 0
[ 指令约束
$(pc{i+1} - dst) \cdot iszero + (pc{i+1} - pc_i - 1)mv_i = 0$
表示如果 $mvi = 0$ 则 $pc{i+1} -$ 目标指令指针 = 0,进行跳转;否则 $pc_{i+1} - pc_i - 1 = 0$,跳过当前指令 [
] 指令约束
$(pc_{i+1} - dst)mvi + (pc{i+1} - pc_i - 1) \cdot iszero = 0$
表示如果 $mvi \ne 0$ 则 $pc{i+1} -$ 目标指令指针 = 0,进行跳转;否则 $pc_{i+1} - pc_i - 1 = 0$ ,跳过当前指令 ]
IoChip 对 , 和 . 指令进行约束。
通过 lookup 协议确保和 cpu 表中出现的 I/O 指令保持一致。
MemoryInstructionsChip 对 > 和 < 指令进行约束。
> 指令约束:$mp_{i+1} - mp_i - 1 = 0$
< 指令约束:$mp{i} - mp{i+1} - 1 = 0$
MemoryChip 用于对内存访问一致性进行约束。
MemoryChip 只记录对某个地址的初始化和最终状态的读写操作 $init, final$,而 CpuChip 记录对某个地址的所有读写操作 $read, write$,内存访问一致性需满足该约束:$read \cup final = write \cup init$
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!