็ๆฌ: 0.3.0 | ๆดๆฐ: 2026-06-05
ๆฌๆๆกฃๅฎๆด่ฏดๆ ScratchV ๅฆไฝๅฐ ONNX CNN ๆจกๅ็ผ่ฏไธบ RISC-V ๅฏๆง่กไปฃ็ ๏ผ่ฆ็ ScratchV ๅ็่ทฏๅพ๏ผQ16.16 ๅฎ็น๏ผ ๅ LLVM ่ทฏๅพ๏ผfloat32๏ผ ไธคๆก็ผ่ฏ็ฎก็บฟใ
- ้กน็ฎๆป่ง
- ScratchV ๅ็่ทฏๅพ๏ผONNX โ RISC-V ๆบๅจ็
- LLVM ่ทฏๅพ๏ผONNX โ LLVM IR โ RISC-V
- ๅ่ทฏๅพๅฏนๆฏ
- ๆจกๅๅฐๅพ
- ๆฐๆฎๆตไธๆไปถๆ ผๅผ
ScratchV ๆฏไธไธช Python ๅฎ็ฐ็ AI ็ผ่ฏๅจ๏ผๅฐ ONNX ๆทฑๅบฆๅญฆไน ๆจกๅ็ผ่ฏไธบ RISC-V ๆไปค้ใ
โโโโโโโโโโโโโโโโโโโโโโโ
โ ONNX ๆจกๅ (.onnx) โ
โ Conv, Gemm, ReLU, โ
โ MaxPool, Sigmoid... โ
โโโโโโโโโโโฌโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโ
โผ โผ
โโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโ
โ ScratchV ๅ็่ทฏๅพ โ โ LLVM ่ทฏๅพ โ
โ (Q16.16 ๅฎ็น) โ โ (float32 ๆตฎ็น) โ
โ โ โ โ
โ ONNX โ IR โ RISC-V โ โ ONNX โ IR โ LLVM IR โ
โ ๅ็ๆบๅจ็ (.bin) โ โ โ llc โ RISC-V โ
โโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โผ โผ
RV32IM ๆบๅจ็ RV64FD ๆฑ็ผ / LLVM IR
(ๆ ไพ่ต, ้ถ runtime) (ๅฏๆฅ llc/opt/lli)
่ฎพ่ฎกๅฒๅญฆ:
- Python ๆ ๅๅบๅณๅฏ่ฟ่ก๏ผๆ ธๅฟ็ผ่ฏๅจ้ถๅค้จไพ่ต๏ผ
- ไธคๆก่ทฏๅพๅ ฑไบซๅไธไธช IR ๅ็ซฏ๏ผๅ็ซฏๅๅ
- ๅ่ทฏๅพๅฏนๆฏ โ ๆ็ปญไผๅ ScratchV ่ถ ่ถ LLVM
ONNX ๆจกๅๆไปถ (.onnx)
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Stage 1: ONNX ่งฃๆ (ProtoReader) โ
โ ๆไปถ: scratchv/standalone/ โ
โ onnx_to_riscv_standalone.py โ
โ โ
โ ๆๅทฅ่งฃๆ protobuf wire format โ
โ โ ๆๅ graph nodes, initializers, โ
โ tensor shapes, weights, biases โ
โ โ ๆๅปบ ONNXModel ๅฏน่ฑก โ
โโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Stage 2: ๅ
ๅญ่งๅ (MemoryPlan) โ
โ โ
โ ไธบๆ้/ๅ็ฝฎ/่พๅ
ฅ/่พๅบๅ้
ๅฐๅ็ฉบ้ด โ
โ ๅฐ float32 ๆ้่ฝฌไธบ Q16.16 ๅฎ็นๆ ผๅผ โ
โ โ Q16.16: ้ซ 16 ไฝๆดๆฐ, ไฝ 16 ไฝๅฐๆฐ โ
โ โ ๅผๅ: [-32768, 32767.99998] โ
โโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Stage 3: RISC-V ไปฃ็ ็ๆ โ
โ (CNNRISCVGenerator) โ
โ โ
โ ้็ฎๅญ็ๆๅ
่ RISC-V ๆบๅจ็ : โ
โ โ
โ Conv2D: 6 ๅฑๅตๅฅๅพช็ฏ โ
โ for oh in 0..OH: โ
โ for ow in 0..OW: โ
โ for oc in 0..OC: โ
โ for kh in 0..KH: โ
โ for kw in 0..KW: โ
โ for ic in 0..IC: โ
โ load input[ic][h][w] โ
โ load weight[oc][ic][kh][kw]โ
โ mul (Q16.16) โ
โ add (accumulate) โ
โ srai 16 (Q16.16 ๅฎ็น่ฟๅ) โ
โ + bias[oc] โ
โ store output[oc][oh][ow] โ
โ โ
โ Gemm: 3 ๅฑๅตๅฅๅพช็ฏ (ๆฏๆ transB) โ
โ MaxPool: 5 ๅฑๅตๅฅๅพช็ฏ + ่พน็ๆฃๆฅ โ
โ ReLU: max(a0, zero) โ
โ Sigmoid: ๆฅ่กจๆณ + ็บฟๆงๆๅผ โ
โ Reshape: ็ดๆฅๆท่ด โ
โโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Stage 4: ๆบๅจ็ ็ผ็ + ้พๆฅ โ
โ (RISCVEmitter) โ
โ โ
โ ๅฐ RV32IM ๆไปค็ผ็ ไธบ 32-bit ๆบๅจ็ โ
โ ไธค้ๆซๆ: โ
โ ็ฌฌไธ้: emit ๆๆๆไปค, ่ฎฐๅฝ label ไฝ็ฝฎ โ
โ ็ฌฌไบ้: ๅๅกซๅๆฏ/่ทณ่ฝฌๅ็งป้ (fixup) โ
โ โ ่พๅบ flat binary (.bin), position- โ
โ independent, ๅฏ็ดๆฅๅ ่ฝฝๅฐๅ
ๅญๆง่ก โ
โโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโ
โ output.bin โ โ RV32IM flat binary
โ output.s โ โ (ๅฏ้) ไบบ็ฑปๅฏ่ฏปๆฑ็ผ
โโโโโโโโโโโโโโโโ
Q16.16 ๅฎ็น่ฟ็ฎ:
- ไนๆณ:
MUL a, bโ 64 ไฝ็ปๆ โSRAI 16ๆชๆญๅ 32 ไฝ - ๅ ๆณ: ็ดๆฅ
ADD๏ผๅฐๆฐ็นๅฏน้ฝ๏ผ - ็ฒพๅบฆๆๅคฑ: ~1.5e-5 ็ธๅฏน่ฏฏๅทฎ๏ผCNN ๆจ็่ถณๅค
- ไปฃไปท: ๆฏไธช MAC ้ ~30 ๆกๆไปค๏ผๅซๅฐๅ่ฎก็ฎใๅ ่ฝฝใไนๆณใๅฎ็น่ฟๅ๏ผ
ๆ Runtime ไพ่ต:
- ๆๆ็ฎๅญ้่ฟๅ ่ๅพช็ฏๅฎ็ฐ๏ผไธไพ่ตๅค้จๅบ
- Flat binary ๅฏ็ดๆฅๅ ่ฝฝๅฐ FPGA/ASIC ็ RISC-V ๆ ธๆง่ก
- ๆ้ๅตๅ ฅไบ่ฟๅถๆไปถไธญ
Q16.16 ๅฎ็น่ฝฌๆข:
def float32_to_q16(value: float) -> int:
"""ๅฐ float32 ่ฝฌไธบ Q16.16 ๅฎ็นๆดๆฐ"""
# ไนไปฅ 2^16 = 65536๏ผๅๆด
return int(value * 65536.0) & 0xFFFFFFFF # 32-bit ๆชๆญ# ScratchV ๅ็็ผ่ฏ
python scratchv/standalone/onnx_to_riscv_standalone.py models/graph/cnn.onnx \
-o output.bin # ่พๅบ flat binary
--asm output.s # ๅๆถ่พๅบๆฑ็ผ
--estimate # ๆง่ฝไผฐ็ฎ (ๅจๆๆไปคๆฐ)
--report # ็ๆ่ฏฆ็ปๆฅๅONNX ๆจกๅๆไปถ (.onnx)
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Stage 1: ONNX ่งฃๆ โ
โ ๆไปถ: scratchv/standalone/ โ
โ onnx_to_llvm_standalone.py โ
โ โ
โ ๅค็จ ONNXModel (ๅๅ็่ทฏๅพ) โ
โ ๆๅ่็นไฟกๆฏใๆ้ใtensor ๅฝข็ถ โ
โ โ ๆ้ไฟๆ float32 (ไธ่ฝฌ Q16.16) โ
โโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Stage 2: LLVM IR ็ๆ โ
โ (LLVMCNNGenerator + LLVMIRBuilder) โ
โ โ
โ ้็ฎๅญ็ๆ float32 LLVM IR: โ
โ โ
โ ; ็คบไพ: Conv2D ๅ
ๅฑๅพช็ฏ็ LLVM IR ็ๆฎต โ
โ %idx = getelementptr float, float** %w, โ
โ i32 %w_offset โ
โ %w_val = load float, float* %idx โ
โ %in_val = load float, float* %in_ptr โ
โ %mul = fmul float %in_val, %w_val โ
โ %acc = fadd float %acc, %mul โ
โ โ
โ ็นๆง: โ
โ - ็ๆญฃ็ float32 ่ฟ็ฎ (fmul, fadd, fdiv) โ
โ - GEP ๅฐๅ่ฎก็ฎ (ๆฟไปฃๆๅจ MUL+ADD) โ
โ - ๅตๅฅๅพช็ฏ + padding ่พน็ๆฃๆฅ โ
โ - ๅฝๆฐ็ญพๅ: float* (ๆ้ไผ ้ tensor) โ
โ - target triple: riscv64-unknown-elf โ
โโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Stage 3: LLVM ไผๅ + ็ฎๆ ไปฃ็ ็ๆ (ๅค้จ) โ
โ โ
โ ้้กน A: llc (้ๆ็ผ่ฏ) โ
โ $ llc output.ll -o output.s โ
โ -O3 -march=rv64fd โ
โ โ RISC-V 64-bit float ๆฑ็ผ โ
โ โ
โ ้้กน B: opt + llc (่ชๅฎไนไผๅ) โ
โ $ opt -O3 output.ll | llc -O3 -o out.s โ
โ โ LLVM ๅ
จๅฅไผๅ pass โ
โ โ
โ ้้กน C: lli (JIT ๆง่ก) โ
โ $ lli output.ll โ
โ โ ็ดๆฅๅจไธปๆบไธ JIT ่ฟ่ก (่ฐ่ฏ/้ช่ฏ) โ
โโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโ
โ output.ll โ โ LLVM IR ๆๆฌ
โ output.s (via llc) โ โ RISC-V ๆฑ็ผ
โโโโโโโโโโโโโโโโโโโโโโ
Float32 ๅ็่ฟ็ฎ:
- ๆฏๆก MAC =
fmul + faddโ 2 ๆกๆไปค๏ผvs Q16.16 ็ ~30 ๆก๏ผ - ๆ ้ๅฎ็น่ฝฌๆขๅผ้
- ไธ ONNX ๅๅง็ฒพๅบฆไธ่ด๏ผๆฐๅผ้ช่ฏๆด็ฎๅ
LLVM IR ไฝไธบไธญ้ดไบง็ฉ:
- ๅฏๆฅ LLVM ๅ
จๅฅไผๅ pass (
-O3: ๅพช็ฏๅฑๅผใๅ้ๅใๆไปคๅๅนถ...) - ๅฏๅค็ฎๆ ็ผ่ฏ๏ผRV64, x86-64, ARM๏ผ
- ไบบ็ฑปๅฏ่ฏป็ SSA ๆๆฌๆ ผๅผ๏ผไพฟไบๅๆๅ่ฐ่ฏ
GEP ๅฐๅ่ฎก็ฎ:
- LLVM ็
getelementptrๆไปคๅๆกๅฎๆๅค็ปดๆฐ็ปๅฐๅ่ฎก็ฎ - ๆฟไปฃ ScratchV ๅ็่ทฏๅพไธญๆๅจ็ ~5 ๆก
MUL + ADD้พ
# LLVM IR ็ๆ
python scratchv/standalone/onnx_to_llvm_standalone.py models/graph/cnn.onnx \
-o output.ll # ่พๅบ LLVM IR
--compare # ไธ ScratchV ๅฏนๆฏไผฐ็ฎ
# ็จ llc ็ผ่ฏไธบ RISC-V ๆฑ็ผ
llc -O3 -march=rv64fd -mattr=+d output.ll -o output.s
# LLVM vs ScratchV ็ผๅญๅฏนๆฏๅๆ
python scratchv/standalone/llvm_cache_compare.py \
--json-output output/llvm_vs_scratchv.json| ็ปดๅบฆ | ScratchV ๅ็ | LLVM |
|---|---|---|
| ๆฐๅผๆ ผๅผ | Q16.16 ๅฎ็น (int32) | IEEE 754 float32 |
| ็ฎๆ ISA | RV32IM (ๆดๆฐ) | RV64FD (ๆตฎ็น) |
| ่พๅบๆ ผๅผ | Flat binary (.bin) | LLVM IR (.ll) |
| ๆฏๆก MAC ๆไปคๆฐ | ~30 ๆก | ~2 ๆก |
| ไพ่ต | Python stdlib | ้่ฆ llvmlite / llc |
| ่ฟ่กๆถ | ้ถไพ่ต, ็ดๆฅๆง่ก | ้่ฆ C runtime (printf ็ญ) |
| ๅฏ็งปๆคๆง | RV32IM ้็จ | ไพ่ต LLVM ๅทฅๅ ท้พ |
| ไผๅ่ฝๅ | ๆๅจๅ ่ๅพช็ฏ | LLVM ๅ จๅฅไผๅ pass |
| ๆฐๅผ็ฒพๅบฆ | ~1.5e-5 ็ธๅฏน่ฏฏๅทฎ | ๅ็ float32 |
| ๆๆ | LLVM (RV64FD) | ScratchV (RV32IM) | ๆฏๅผ |
|---|---|---|---|
| ้ๆๆไปคๆฐ | 1,059 | 785 | 0.74x |
| ๅจๆๆไปคๆฐ | 18.5 ไบฟ | 77.7 ไบฟ | 4.2x |
| ๅจๆ Load | 5.27 ไบฟ (28.6%) | 15.6 ไบฟ (20.1%) | 0.34x |
| ๅจๆ Store | 0.03 ไบฟ (0.2%) | 5.19 ไบฟ (6.7%) | 0.01x |
| ๅจๆ FP/ALU | 5.25 ไบฟ (28.4%) | 46.6 ไบฟ (60.0%) | 0.14x |
| ๅจๆ Branch | 0.81 ไบฟ (4.4%) | 5.20 ไบฟ (6.7%) | 0.16x |
| D$ ๅฝไธญ็ | 88.75% | 88.75% | 1:1 |
| D$ ็ผบๅคฑๅญ่ | 19.1 ไบฟ | 74.8 ไบฟ | 3.9x |
| ็ปผๅๅ ้ๆฏ | 1x (baseline) | 0.23x | LLVM 4.4x ๅฟซ |
- Q16.16 ๅฎ็นๅผ้ (ไธปๅ ): ๆฏไธช MAC ้่ฆ ~15 ๆกๆดๆฐๆไปค๏ผ
MULโSRAI 16โADD+ ๆบขๅบๅค็๏ผ๏ผ่ LLVM float32 ๅช้fmul + faddโ 2 ๆก - ๅฐๅ่ฎก็ฎๅผ้: ๆ
getelementptr๏ผๆๅจMUL + ADD้พ ~5 ๆก/ๆฌก - Store ๅทฎ่ท: ScratchV ๆฏไธช่พๅบๅ
็ด ้ฝ้่ฆ
SWๅๅ๏ผLLVM ๅฏๅฐไธญ้ด็ปๆไฟ็ๅจๆตฎ็นๅฏๅญๅจไธญ - ๅพช็ฏๅๆข: LLVM
-O3่ชๅจๅ loop unrolling / interchange / vectorization๏ผScratchV ๆ ไปปไฝๅพช็ฏไผๅ
ScratchV ็ไผๅฟไธๅจไบ้็จ็ผ่ฏ๏ผ่ๅจไบ CNN ไธ็จไผๅ:
- ็ฎๅญ่ๅ: Conv+ReLU ็ซฏๅฐ็ซฏ่ๅ๏ผๆถ้คไธญ้ด store/load
- ๅ ๅญๅธๅฑๅฎๅถ: CHWโHWC ๅๆขๆๅ cache ๅฑ้จๆง
- ไธ็จๆไปค: ๅฆๆ็กฌไปถๆฏๆ SIMD/P ๆฉๅฑ๏ผLLVM ไธไธๅฎ่ฝ่ชๅจๅฉ็จ
- ็ฒพๅบฆ/้ๅบฆๆไธญ: Q16.16 ๅจๆจ็ๅบๆฏ่ถณๅค๏ผๅฏๅฐ่ฏ Q8.8 ่ฟไธๆญฅๅๅฐๆไปค
ScratchV ้กน็ฎ โ ๅฎๆดๆจกๅๅฐๅพ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๅ็ซฏ (Frontend) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ scratchv/frontend/onnx_parser.py ONNX ๆจกๅ่งฃๆ โ
โ scratchv/frontend/dsl_parser.py DSL ่งฃๆ (ๆ ONNX ไพ่ต) โ
โ scratchv/frontend/dsl_extended.py ๆฉๅฑ DSL (if/while) โ
โ scratchv/frontend/dsl_errors.py DSL ้่ฏฏๆ็คบ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ไธญ้ด่กจ็คบ (IR) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ scratchv/ir/types.py OpCode, Value, DataType ๅฎไน โ
โ scratchv/ir/builder.py IRBuilder (ไธๅฐๅ็ ๆ้ ๅจ) โ
โ scratchv/ir/printer.py IRPrinter (ๆๆฌ่พๅบ) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโ
โผ โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ไผๅๅจ (Optimizer) โ โ ๅๆ (Analysis) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโค โโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ constant_folding.py โ โ cfg_builder.py โ
โ dead_code.py โ โ ir_verifier.py โ
โ peephole.py โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ muladd_fusion.py โ
โ licm.py (ๅพช็ฏไธๅ้ๅคๆ) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๅ็ซฏ (Backend) โ ไธคๆก่ทฏๅพ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ RISC-V ไปฃ็ ็ๆ: LLVM ไปฃ็ ็ๆ: โ
โ โ instruction_select.py โ llvm_codegen.py โ
โ โ inst_select_ext.py (IR โ LLVM IR) โ
โ โ register_alloc.py โ
โ โ regalloc_linear.py โ
โ โ asm_emit.py โ
โ โ asm_peephole.py (ๅไผๅ) โ
โ โ const_merge.py (ๅธธ้ๅๅนถ) โ
โ โ asm_beautifier.py (ๆ ผๅผๅ) โ
โ โ inst_scheduler.py (ๆไปค่ฐๅบฆ) โ
โ โ inst_counter.py (ๆไปค็ป่ฎก) โ
โ โ cycle_estimator.py (ๆตๆฐด็บฟๆจกๆ) โ
โ โ riscv_encoder.py (ๆฑ็ผโๆบๅจ็ ) โ
โ โ machine_types.py (็ฑปๅๅฎไน) โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ็ฌ็ซๅทฅๅ
ท (Standalone) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ onnx_to_riscv_standalone.py ONNX โ RV32IM ๅ็็ผ่ฏๅจ โ
โ onnx_to_llvm_standalone.py ONNX โ LLVM IR ็ผ่ฏๅจ โ
โ benchmark.py RV32IM ไปฟ็ๅจ + ๆง่ฝ่ฎกๆฐๅจ โ
โ cache_model.py Set-associative cache ๆจกๅ โ
โ spike_sim.py Spike ไปฟ็ๅจๅ
่ฃ
โ
โ run_spike_bench.py ๅธฆ cache ็ๅฎๆดไปฟ็ๅจ โ
โ llvm_cache_compare.py LLVM vs ScratchV ็ผๅญๅฏนๆฏ โ
โ tinyfive_compare.py TinyFive ้ๆๅฏนๆฏ โ
โ compare_codegen.py ไปฃ็ ็ๆ่ดจ้ๅฏนๆฏ โ
โ rv32_bench.py RV32 ๅ
จ้ Benchmark โ
โ bench_report.py HTML/JSON/MD ๆฅๅ็ๆ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ CI / Dashboard โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ scratchv/ci/ci_benchmark.py CI ๅบๅๆต่ฏ็ผๆๅจ โ
โ scratchv/ci/dashboard.py ๆง่ฝๅฏนๆฏไปช่กจ็ (็บฏ้ๆ HTML) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๆจกๆๅจ / ้ช่ฏ (Simulator / Verification) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ scratchv/simulator/tinyfive.py TinyFive ้้
ๅจ โ
โ scratchv/simulator/rv32_emulator.py RV32IM ๅ
จๅ่ฝไปฟ็ๅจ โ
โ scratchv/verification/verifier.py ONNX Runtime / numpy ้ช่ฏ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
models/graph/cnn.onnx โ ่พๅ
ฅ: ONNX protobuf
โ
โ onnx_to_riscv_standalone.py
โผ
output.bin โ RV32IM flat binary (position-independent)
output.s โ (ๅฏ้) GAS ๆฑ็ผ
benchmark_reports/cnn_scratchv.s โ CI ไบง็ฉ
models/graph/cnn.onnx โ ่พๅ
ฅ: ONNX protobuf
โ
โ onnx_to_llvm_standalone.py
โผ
benchmark_reports/cnn.onnx_llvm.ll โ LLVM IR ๆๆฌ
โ
โ llc -O3 -march=rv64fd
โผ
output.s โ RISC-V 64 ๆฑ็ผ
models/graph/cnn.onnx
โ
โโโโ onnx_to_riscv_standalone.py โ cnn_scratchv.s โ tinyfive_compare.py
โ โ
โโโโ onnx_to_llvm_standalone.py โ cnn.onnx_llvm.ll โ
โ โ
โโโโ llvm_cache_compare.py โโโโโโโโโโโโโโโโโโโ
โ
โโโ benchmark_reports/llvm_vs_scratchv.json
โโโ benchmark_reports/llvm_vs_scratchv.md
โโโโ dashboard.py
โ
โผ
benchmark_reports/dashboard.html
โ
โ upload-pages-artifact
โผ
https://scratchv-compiler.github.io/ScratchV/
32-bit ๆดๆฐ็้ซ 16 ไฝ = ๆดๆฐ้จๅ
32-bit ๆดๆฐ็ไฝ 16 ไฝ = ๅฐๆฐ้จๅ
ไพ: 3.14159 โ int(3.14159 ร 65536) = 205887
205887 = 0x0003243F
้ซ 16 ไฝ: 0x0003 = 3 (ๆดๆฐ้จๅ)
ไฝ 16 ไฝ: 0x243F โ 0.14159 (ๅฐๆฐ้จๅ, ็ฒพๅบฆ 1/65536 โ 1.5e-5)
ไนๆณ: MUL a, b โ 64-bit โ SRAI 16 (ๅณ็งป 16 ไฝๆชๆญ)
ๅ ไธบ (a ร 2^16) ร (b ร 2^16) = (a ร b) ร 2^32
้่ฆๅณ็งป 16 ไฝ่ฟๅไธบ Q16.16 โ ็ปๆ ร 2^16
ๅ ๆณ: ADD a, b (็ดๆฅๅ ๏ผๅฐๆฐ็นๅทฒๅฏน้ฝ)
# ScratchV ๅ็็ผ่ฏ + ไผฐ็ฎ
python scratchv/standalone/onnx_to_riscv_standalone.py models/graph/cnn.onnx \
-o output.bin --asm output.s --estimate --report
# LLVM IR ็ๆ + ๅฏนๆฏ
python scratchv/standalone/onnx_to_llvm_standalone.py models/graph/cnn.onnx \
-o output.ll --compare
# LLVM vs ScratchV ็ผๅญๅฏนๆฏ
python scratchv/standalone/llvm_cache_compare.py \
--json-output output/llvm_vs_scratchv.json
# TinyFive ้ๆๅๆ
python scratchv/standalone/tinyfive_compare.py \
--json output/tinyfive_compare.json
# Dashboard ็ๆ
python scratchv/ci/dashboard.py \
--llvm-json output/llvm_vs_scratchv.json \
--tinyfive-json output/tinyfive_compare.json \
-o dashboard.html
# ไธ้ฎ CI ๅ
จ้จ
make bench-ci
# Harness ้ช่ฏ
python .claude/harness/verify/run.py --level L2- ๐ ๆฐๆๅ ฅ้จ: 00-็ฏๅขๆญๅปบ โ 01-ๆฆๅฟตๅ ฅ้จ โ 02-ๅฟซ้ไธๆ
- ๐ ๆๆ ่งฃ่ฏป: 03-ๆๆ ่งฃ่ฏปๆๅ
- ๐ ๆทฑๅ ฅๅญฆไน : Topic 03 โ IR ็ณป็ป | Topic 08 โ ๆไปค้ๆฉ | Topic 19 โ Standalone RISC-V
- ๐ ๅจ็บฟ่ฏพ็จ: ไบคไบๅผ่ฏพ็จ็ซ็น
- ๐ ๅ จ้จๆๆกฃ: INDEX.md