---
title: Terilog(仮称): 三進拡張Verilogを作ってみた
tags: 
author: [きっちー](https://www.docswell.com/user/4857820990)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/D7Y4ZGW4EM.jpg?width=480
description: コンパイラのコンパの部分 #2
published: April 17, 26
canonical: https://www.docswell.com/s/4857820990/5GN1RP-2026-04-17-201914
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/D7Y4ZGW4EM.jpg)

きっちー (@rikeden_net)
コンパイラのコンパの部分 #2


# Page. 2

![Page Image](https://bcdn.docswell.com/page/VENY3G96J8.jpg)

Motivation
• 自作三進CPUを作った。
• (±5V, トランジスタ 2000 個ぐらい)


# Page. 3

![Page Image](https://bcdn.docswell.com/page/Y79P9W2RE3.jpg)

Motivation
• 三進回路は脳内シミュレーションで
設計していたためミスが頻発
• 次世代機を作る前にシミュレーショ
ンツールを作ろう！


# Page. 4

![Page Image](https://bcdn.docswell.com/page/G78D9N5G7D.jpg)

Over v iew
➀三進リテラル、三進信号を含めた
Verilog風HDL
➁1 trit を 2 bit で表現して
Sy stemVerilog にトランスパイル
3&#039;t10#
6&#039;b100001
twire, treg
wire[1:0], reg[1:0]
bwire, breg
wire, reg
tvalue ?? exp_1 : exp_0 : exp_#
tvalue == 2&#039;b10 ? exp_1 :
tvalue == 2&#039;b00 ? exp_0 : exp_#


# Page. 5

![Page Image](https://bcdn.docswell.com/page/L7LMWPYXJR.jpg)

Ex ample: 命令デコーダ
module decoder (
input twire[4:0] inst,
output twire d_ExeCmp,
);
bwire op1s, op2s, cmps;
assign op1s = (inst[4:3] == 2&#039;t01);
assign op2s = (inst[4] == 1&#039;t1 | inst[4:3] == 2&#039;t00) &amp; (inst[2:1] == 2&#039;t#0);
assign d_ExeCmp = (op2s | op1s) ? 1&#039;t1 : 1&#039;t#;
endmodule
`include &quot;terilog.sv&quot;
module decoder (
input wire [9:0] inst,
output wire [1:0] d_ExeCmp
);
wire op1s,op2s,cmps;
assign op1s = (inst[9:6]) == (4&#039;b0010);
assign op2s = (((inst[9:8]) == (2&#039;b10)) | ((inst[9:6]) == (4&#039;b0000))) &amp;
((inst[5:2]) == (4&#039;b0100));
assign d_ExeCmp = ((op2s) | (op1s)) ? (2&#039;b10) : (2&#039;b01);
endmodule


# Page. 6

![Page Image](https://bcdn.docswell.com/page/4EMY94N3EW.jpg)

Ex ample: 加算器
module adder (
input twire[4:0] a,
input twire[4:0] b,
output twire[4:0] c,
output twire carry
);
assign {carry, c} = {1&#039;t0, a} + {1&#039;t0, b};
endmodule
`include &quot;terilog.sv&quot;
module adder (
input wire [9:0] a,
input wire [9:0] b,
output wire [9:0] c,
output wire [1:0] carry
);
assign {carry, c} = terilog::tadd6(
{2&#039;b00, a}, {2&#039;b00, b});
endmodule


# Page. 7

![Page Image](https://bcdn.docswell.com/page/PER9GWDRJ9.jpg)

Transpiler
• Rust 製
• lalr pop で文法定義、パーサ生成
• 型チェック、emit を実装
(Github はさっき public にしたので
まだ検索引っかからない)
(他の方の同名のリポジトリが存在す
ることにさっき気付いた)
https://github.com/Kitchy-rikeden/Terilog


# Page. 8

![Page Image](https://bcdn.docswell.com/page/P7XQXP1YEX.jpg)

宣伝
• 技術書典オンラインマーケットにて
自作三進CPU本販売中！(~ 4/26)
• 平衡三進数、三値論理、
三値論理回路の構成法
• 自作三進CPUのアーキテクチャ
• etc.


