Skip to content

Commit 513a705

Browse files
authored
Define a reverse carry-less multiply function for cmulr instructions
Also define a SMT property to prove equivalence with the previous implementation. Update the Makefile.old to use the check_properties target to test the property with Z3, pending CMake integration. Fixes #824.
1 parent c5b4e17 commit 513a705

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

Makefile.old

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ SAIL_DEFAULT_INST += riscv_insts_vext_red.sail
6767
SAIL_DEFAULT_INST += riscv_insts_vext_fp_red.sail
6868
SAIL_DEFAULT_INST += riscv_insts_zicbom.sail
6969
SAIL_DEFAULT_INST += riscv_insts_zicboz.sail
70+
SAIL_DEFAULT_INST += riscv_insts_zvbb.sail
71+
SAIL_DEFAULT_INST += riscv_insts_zvbc.sail
72+
SAIL_DEFAULT_INST += riscv_insts_zimop.sail
73+
SAIL_DEFAULT_INST += riscv_insts_zcmop.sail
7074

7175
SAIL_SEQ_INST = $(SAIL_DEFAULT_INST) riscv_jalr_seq.sail
7276
SAIL_RMEM_INST = $(SAIL_DEFAULT_INST) riscv_jalr_rmem.sail riscv_insts_rmem.sail
@@ -94,7 +98,7 @@ SAIL_VM_SRCS += riscv_vmem_tlb.sail
9498
SAIL_VM_SRCS += riscv_vmem.sail
9599

96100
# Non-instruction sources
97-
PRELUDE = prelude.sail riscv_errors.sail $(SAIL_XLEN) $(SAIL_FLEN) $(SAIL_VLEN) prelude_mem_addrtype.sail prelude_mem_metadata.sail prelude_mem.sail
101+
PRELUDE = prelude.sail riscv_errors.sail $(SAIL_XLEN) $(SAIL_FLEN) $(SAIL_VLEN) prelude_mem_addrtype.sail prelude_mem_metadata.sail prelude_mem.sail arithmetic.sail
98102

99103
SAIL_REGS_SRCS = riscv_csr_begin.sail # Start of CSR scattered definitions.
100104
SAIL_REGS_SRCS += riscv_reg_type.sail riscv_freg_type.sail riscv_regs.sail riscv_pc_access.sail riscv_sys_regs.sail
@@ -125,6 +129,7 @@ SAIL_RVFI_SRCS = $(addprefix model/,$(SAIL_ARCH_RVFI_SRCS) $(SAIL_SEQ_INST_SRCS)
125129
SAIL_COQ_SRCS = $(addprefix model/,$(SAIL_ARCH_SRCS) $(SAIL_SEQ_INST_SRCS) $(SAIL_OTHER_SRCS) $(SAIL_OTHER_COQ_SRCS))
126130

127131
SAIL_FLAGS += --require-version 0.19
132+
SAIL_FLAGS += --config config/default.json
128133
SAIL_FLAGS += --strict-var
129134
SAIL_FLAGS += -dno_cast
130135
SAIL_DOC_FLAGS ?= -doc_embed plain
@@ -142,8 +147,8 @@ export LEM_DIR
142147

143148
C_WARNINGS ?=
144149
#-Wall -Wextra -Wno-unused-label -Wno-unused-parameter -Wno-unused-but-set-variable -Wno-unused-function
145-
C_INCS = $(addprefix c_emulator/,riscv_prelude.h riscv_platform_impl.h riscv_platform.h riscv_softfloat.h)
146-
C_SRCS = $(addprefix c_emulator/,riscv_prelude.c riscv_platform_impl.c riscv_platform.c riscv_softfloat.c riscv_sim.c)
150+
C_INCS = $(addprefix c_emulator/,riscv_prelude.h riscv_sail.h riscv_config.h riscv_platform_impl.h riscv_platform.h riscv_softfloat.h rvfi_dii.h)
151+
C_SRCS = $(addprefix c_emulator/,riscv_prelude.cpp riscv_platform_impl.cpp riscv_platform.cpp riscv_softfloat.c rvfi_dii.cpp riscv_sim.cpp)
147152

148153
SOFTFLOAT_DIR = dependencies/softfloat/berkeley-softfloat-3
149154
SOFTFLOAT_INCDIR = $(SOFTFLOAT_DIR)/source/include
@@ -205,6 +210,9 @@ all: c_emulator/riscv_sim_$(ARCH)
205210
check: $(SAIL_SRCS) model/main.sail Makefile.old
206211
$(SAIL) $(SAIL_FLAGS) $(SAIL_SRCS) model/main.sail
207212

213+
check_properties: $(SAIL_SRCS) Makefile.old
214+
$(SAIL) --smt --smt-auto --smt-auto-solver z3 $(SAIL_FLAGS) $(SAIL_SRCS)
215+
208216
interpret: $(SAIL_SRCS) model/main.sail
209217
$(SAIL) -i $(SAIL_FLAGS) $(SAIL_SRCS) model/main.sail
210218

model/arithmetic.sail

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,26 @@ function carryless_mul(a, b) = {
1616
};
1717
result
1818
}
19+
20+
/* Reverse carry-less multiply. */
21+
val carryless_mulr : forall 'n, 'n > 0. (bits('n), bits('n)) -> bits('n)
22+
function carryless_mulr(a, b) = {
23+
var result : bits('n) = zeros();
24+
foreach (i from 0 to ('n - 1)) {
25+
if a[i] == bitone
26+
then result = result ^ (b >> ('n - i - 1));
27+
};
28+
result
29+
}
30+
31+
/* Equivalent reverse carry-less multiply. */
32+
val carryless_mul_reversed : forall 'n, 'n > 0. (bits('n), bits('n)) -> bits('n)
33+
function carryless_mul_reversed(a, b) = {
34+
let prod = carryless_mul(reverse(a), reverse(b));
35+
reverse(prod['n - 1 .. 0])
36+
}
37+
38+
$[property]
39+
function cmulr_equivalence(a : bits(16), b : bits(16)) -> bool = {
40+
carryless_mul_reversed(a, b) == carryless_mulr(a, b)
41+
}

model/riscv_insts_zbc.sail

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ mapping clause assembly = RISCV_CLMULR(rs2, rs1, rd)
5252
<-> "clmulr" ^ spc() ^ reg_name(rd) ^ sep() ^ reg_name(rs1) ^ sep() ^ reg_name(rs2)
5353

5454
function clause execute (RISCV_CLMULR(rs2, rs1, rd)) = {
55-
let prod = carryless_mul(reverse(X(rs1)), reverse(X(rs2)));
56-
X(rd) = reverse(prod[xlen - 1 .. 0]);
55+
X(rd) = carryless_mulr(X(rs1), X(rs2));
5756
RETIRE_SUCCESS
5857
}

0 commit comments

Comments
 (0)