SlideShare a Scribd company logo
1 of 34
Download to read offline
1 @ikwzm高位合成友の会(2016/11/22)
Iroha を使ってみた話
2016 年 11 月 22 日
@ikwzm
2 @ikwzm高位合成友の会(2016/11/22)
自己紹介みたいなもの
・ハンドルネーム ikwzm
・現在隠居中
・もうすぐ 52 才(けっこう年)
・主に論理回路設計(回路図~VHDL)
・たまにプログラム(アセンブラ~C/Ruby)
・言語の設計は素人
3 @ikwzm高位合成友の会(2016/11/22)
昔話を少し
4 @ikwzm高位合成友の会(2016/11/22)
アセンブリ言語(機械語)によるプログラミング(暗黒?)時代
Assemble
Code (.s)
Computer(A)
CPU
Mem
I/O
Binary Code
Assemble
Code (.s)
Computer(B)
CPU
Mem
I/O
Binary Code
Assembler
Load
Assembler
Load
CPU の命令セット(Instruction Set)
を一つずつ記述
互換性なし
◇ 問題点
・ 生産性
・ いちいち命令を並べるの?
(面倒くせ~)
・ 互換性
・ CPU 間で互換性無し
(メーカーによる囲い込み)
5 @ikwzm高位合成友の会(2016/11/22)
機械語コンバーター
Assemble
Code (.s)
Computer(A)
CPU
Mem
I/O
Binary Code
Assemble
Code (.s)
Computer(B)
CPU
Mem
I/O
Binary Code
Assembler
Load
Assembler
Load
◇ 問題点
・ 生産性
・ アセンブラで書くことには変
わりない (なんの解決にも
なってない)
・ 性能
・ 変換したコードは CPU が
本来持つ能力を発揮でき
なかった
Converter
CPU(A)の命令をもう CPU(B)の命令
に変換
Converter
6 @ikwzm高位合成友の会(2016/11/22)
高位言語とコンパイラによるプログラミング
Computer(A)
CPU
Mem
I/O
Binary Code
Computer(B)
CPU
Mem
I/O
Binary Code
Assembler
Load
Assembler
Load
Converter
C
Fortran
COBOL
Assemble
Code (.s)
Assemble
Code (.s)
CompilerCompiler
・ いくら命令セットが違うと言っても、
同じように命令をフェッチしてレジス
タやメモリからデータを読んで演算し
てレジスタやメモリに書き戻すっての
は同じ。
・ だったら、 同じ部分を抽象化して
記述して、 異なる命令セットなど
はコンパイラに任せればいい。
7 @ikwzm高位合成友の会(2016/11/22)
回路図による論理回路設計(暗黒?)時代
Schematic
ASIC(A 社)
Mask Mask
メーカーが提供するライブラリからセルを
一つ一つ選択して接続した回路図
互換性なし
◇ 問題点
・ 生産性
・ いちいちセルを並べるの?
(面倒くせ~)
・ 互換性
・ メーカー間(またはファミリー
間でさえも)互換性無し
(メーカーによる囲い込み)
ASIC(B 社)
Schematic
Place & Route Place & Route
製造 製造
8 @ikwzm高位合成友の会(2016/11/22)
論理回路コンバーター
Schematic
ASIC
Mask Bitstream
◇ 問題点
・ 生産性
・ 回路図を書くことにはかわり
ない。
・ 性能
・ 変換したコードは FPGA が
持つ本来の性能を生かし
きれなかった。
Schematic
ASIC の 回路図(セルとネットリスト)を
FPGA の回路図に変換
Converter
Place & Route Place & Route
製造 Load
FPGA
9 @ikwzm高位合成友の会(2016/11/22)
HDL(Hardware 記述言語)と論理合成による回路設計
ASIC
Mask Bitstream
FPGA
Net List Net List
VHDL
Verilog-HDL
Logic Synthesis
Converter
Logic Synthesis
Place & Route Place & Route
製造 Load
・ いくらセルの種類が違うと言っても、
同じようにレジスタがあって、 レジス
タ間の論理を記述するという点は
同じ。 いわゆる RTL(Register
Transfer Level)。
・ だったら、 同じ部分を抽象化して
記述して、 異なるセルの選択など
は論理合成に任せればいい。
10 @ikwzm高位合成友の会(2016/11/22)
今の話を少し
11 @ikwzm高位合成友の会(2016/11/22)
C 言語を使った論理回路設計
VHDL
Verilog-HDL
Mask
Net List
Bitstream
Net List
C
Binary
.s
Binary
.s
Computer(B)
CPU
Mem
I/O
Computer(A)
CPU
Mem
I/O
ASIC
Computer 用に C で記述された
プログラムを HDL に変換
FPGA
12 @ikwzm高位合成友の会(2016/11/22)
あ、 それ見たことある 一昔前に一つ下の階層でやってた
VHDL
Verilog-HDL
Mask
Net List
Bitstream
Net List
C
Binary
.s
Binary
.s
Computer(B)
CPU
Mem
I/O
Computer(A)
CPU
Mem
I/O
ASIC
この時はコンバーターよりも
より高位な言語による設計が選ばれた
FPGA
13 @ikwzm高位合成友の会(2016/11/22)
本当に欲しい高位言語
VHDL
Verilog-HDL
Mask
Net List
Bitstream
Net List
C
Binary
.s
Binary
.s
Computer(B)
CPU
Mem
I/O
Computer(A)
CPU
Mem
I/O
ASIC
本当に欲しい高位言語
はこれじゃないだろうか?
FPGA
???
14 @ikwzm高位合成友の会(2016/11/22)
昔は昔、 今は今 - C-HDL コンバーターの良い点と悪い点
・良い点(別に C 合成を dis ってるわけじゃない)
・ エンジニア数
・ HDL を書けるエンジニアに比べて C を書けるエンジニアの方が圧倒的に多い。
・ 生産性
・ HDL に比べて C の方が生産性は高い。
・悪い点(実はコンバーターと同じ問題があるんじゃないか?)
・ 生産性
・ C は本当に生産性は良いのか?
・ Python、 Ruby、 Scala などもっと生産性の良い言語があるじゃないか? 
・ 性能
・ 最初から HDL で書いたコードと比較してどうなの?
15 @ikwzm高位合成友の会(2016/11/22)
昔は昔、 今は今 - 下位層と上位層で距離が違う
VHDL
Verilog-HDL
Mask
Net List
Bitstream
Net List
C
Binary
.s
Binary
.s
Computer(B)
CPU
Mem
I/O
Computer(A)
CPU
Mem
I/O
ASIC
???
FPGA
本当に欲しい高位言語
はこれじゃないだろうか?
この距離とこの距離の違い
16 @ikwzm高位合成友の会(2016/11/22)
FPGA
本当に欲しい高位言語 ー そうは言っても
VHDL
Verilog-HDL
Mask
Net List
Bitstream
Net List
C
Binary
.s
Binary
.s
Computer(B)
CPU
Mem
I/O
Computer(A)
CPU
Mem
I/O
ASIC
???
本当に欲しい高位言語
はこれじゃないだろうか?
・ 私には具体的なイメージがわかない
共通点を抽象化して高位言語として昇華する必要
下層の事を知りすぎた私には共通点よりも相違点のほうが
目についてしまう
17 @ikwzm高位合成友の会(2016/11/22)
理想の高位言語 - 用途限定
VHDL
Verilog-HDL
Mask
Net List
Bitstream
Net List
C
Binary
.s
Binary
.s
Computer(B)
CPU
Mem
I/O
Computer(A)
CPU
Mem
I/O
ASIC
???
用途を絞れば出来るかも
(例えば TensorFlow とか)
FPGA
18 @ikwzm高位合成友の会(2016/11/22)
理想の高位言語 - C よりも高位なプログラミング言語をベース
VHDL
Verilog-HDL
Mask
Net List
Bitstream
Net List
Binary Binary
Computer(B)
CPU
Mem
I/O
Computer(A)
CPU
Mem
I/O
ASIC
Java
Go
Python
VM
(Virtual
Machine)
VM
(Virtual
Machine)
C よりも高位な言語から HDL へ
Java(Synthesijer)
Python(Polyphony)
高位言語すべての機能やライブラリ
が HDL に変換できるわけではない
ことに注意
FPGA
19 @ikwzm高位合成友の会(2016/11/22)
理想の高位言語 - 論理回路設計専用
VHDL
Verilog-HDL
Mask
Net List
Bitstream
Net List
C
Binary
.s
Binary
.s
Computer(B)
CPU
Mem
I/O
Computer(A)
CPU
Mem
I/O
ASIC
???論理回路設計用の高位言語
(SystemVerilog SFL NSL 等)
FPGA
コンピュータで動かすことには拘
らない(検証に限定)
私が今欲し
いのはコレ
20 @ikwzm高位合成友の会(2016/11/22)
Iroha て何?
21 @ikwzm高位合成友の会(2016/11/22)
Iroha - FPGA エクストリーム・コンピューティング(2016/8/24)より抜粋
・ Iroha: Intermediate Representation Of Hardware Abstraction
・ URL: https://github.com/nlsynth/iroha
・ Author: Yusuke TABATA
・ 高位合成の共通バックエンド(LLVM 的な物)を目指して
・ 現状
・ Synthesijer と Neon Light が iroha 出力を実装
・ Neon Light の最適化コードを流用
・ そのうち
・ フロントエンドの開発が楽になる
・ 最適化を改善して遊べるようになる
・ 高位合成友の会が盛り上がる
・ 海外の大学かどっかが潤沢なリソースで同じようなものを開発する...
22 @ikwzm高位合成友の会(2016/11/22)
Iroha の構造
(MODULE mod-id mod-name
(PARAMS (PARAM name value) ...)
(TABLE tab-id tab-name
(REGISTERS
(REGISTER reg-id reg-name {REGS/WIRE/CONST} type init-value)
:
)
(RESOURCES
(RESOURCE res-id res-name input-types output-types params)
:
)
(STATE state-id
(INSN inst-id res-name res-id res-op (state-id ...)(reg-id ...)(reg-id ...))
:
)
:
)
)
mod-id はファイル内でユニークな番号
mod-name は文字列
一つの MODULE に複数の TABLE
tab-id はモジュール内でユニークな番号
tab-name は文字列
一つの TABLE に複数の REGISTER
reg-id は TABLE 内でユニークな番号 reg-name は文字列 () でも可
type は現在 (INT width) か (UINT width)
一つの TABLE に複数の RESOURCE
res-id は TABLE 内でユニークな番号 res-name はリソース名
input-types と output-types は入出力レジスタの type
一つの TABLE に複数の STATE
state-id は TABLE 内でユニークな番号
一つの STATE に複数の INST(Instruction)
inst-id は TABLE 内でユニークな番号
res-id は RESOURCE で宣言した番号
reg-id は REGISTER で宣言した番号
23 @ikwzm高位合成友の会(2016/11/22)
Iroha の構造
・ Lisp みたいな文法
・ テーブル単位で レジスタ、 リソース、 ステートを管理
・ (REGISTER ...)でテーブル内で使用するレジスタを宣言
・ reg-id は TABLE 内でユニークな番号。
・ reg-name は任意の文字列。 () も可。
・ REGS/WIRE/CONST はクラス。
・ type は今のところ (UINT width) か (INT width) のみ。 width はビット数。
・ init-value は今のところ整数。
24 @ikwzm高位合成友の会(2016/11/22)
Iroha の構造
・ (RESOURCE ...) でテーブル内で使用するリソースを宣言
・ res-id は TABLE 内でユニークな番号。
・ res-name はリソース名。
・ 現時点で用意されているリソース
・ set などのレジスタ間データ転送
・ add, sub, mul などの数値演算
・ eq, gt, gte などの比較演算
・ bit-and,bit-or,bit-inv,bit-xor,bit-sel,bit-concat,shift などのビット演算
・ ext-input, ext-output などの外部入出力ポート
・ channel-read, channel-write などのチャネル入出力
・ shared-reg, shared-reg-reader などの共有レジスタ
・ submodule-task, submodule-task-call, sibling-task, sibling-task-
call などのタスク制御
・ その他、 いろいろ追加予定?
25 @ikwzm高位合成友の会(2016/11/22)
Iroha の構造
・ (STATE ...) でステート(状態)を定義して、 そのステートで実行す
る命令を宣言
・ (INST ...) でステートで実行する命令を宣言
・ 命令は次のようなものを指定する
・ 使用するリソースを res-id(リソース番号)で指定
・ リソースにデータを入力するレジスタを reg-id(レジスタ番号)で指定
・ リソースからの出力を保持するレジスタを reg-id(レジスタ番号)で指定
・ 次にどのステートに移行するかを state-id(ステート番号)で指定
26 @ikwzm高位合成友の会(2016/11/22)
iroha-ruby - Iroha を Ruby で扱うライブラリ
・ Iroha を(私が)理解するためのトライアル的な位置づけ
・ URL: https://github.com/ikwzm/iroha-ruby
・ Iroha の各種構造を Ruby のクラスとして定義
・ MODULE → ./iroha-ruby/lib/iroha/iroha/i_module.rb
・ REGISTER → ./iroha-ruby/lib/iroha/iroha/i_register.rb
・ TABLE → ./iroha-ruby/lib/iroha/iroha/i_table.rb
・ 等々
・ Parser (Iroha 形式を Ruby のクラスとして入力)
・ treetop(https://github.com/nathansobo/treetop) を使用。
・ Grammer → ./iroha-ruby/lib/iroha/builder/exp_parser.tt
・ Writer (Ruby のクラスから Iroha 形式に出力)
・ 各クラス に_to_exp メソッドを定義
27 @ikwzm高位合成友の会(2016/11/22)
iroha-ruby - Iroha を Ruby で扱うライブラリ
・ Simple Builder
・ 簡易的な Iroha 形式の構築ツール
・ Iroha からどんな HDL が生成されるかを見るために、 Iroha を直接記述してみたい。
しかし、 Iroha ではリソースやレジスタをユニークな番号で管理しているので直接記述す
るのは面倒。 そのため、 簡易的な構築ツールを作ってみた。
・ 当初は本当に簡易的なものだったが、 なんだか知らないうちに色々と拡張してしまった。
・ Ruby の内部 DSL
・ ./iroha-ruby/lib/iroha/builder/simple.rb
・ サンプル
・ ./iroha-ruby/examples/*.rb
28 @ikwzm高位合成友の会(2016/11/22)
Simple Builder の記述例
require_relative '../lib/iroha/builder/simple'
include Iroha::Builder::Simple
design = IDesign :design do
IModule :mod do
ITable :tab do
Wire :req => Unsigned(1)
Register :counter => Unsigned(32) <= 0
Constant :one => Unsigned(32) <= 1
Constant :done => Unsigned(1) <= 1
ExtInput :data_in => Unsigned(1)
ExtOutput :flow_out => Unsigned(1) <= 0
DataFlowIn :flow_in => Unsigned(1)
IState :state1
IState :state2
IState :state3
state1.on {
req <= data_in
flow_in <= req
Goto state2
}
state2.on {
counter <= counter + one
Goto state3
}
state3.on {
flow_out <= done
}
end
end
end
(MODULE 1 mod
(TABLE 1 tab
(REGISTERS
(REGISTER 1 req WIRE (UINT 1) ())
(REGISTER 2 counter REG (UINT 32) 0 )
(REGISTER 3 one CONST (UINT 32) 1 )
(REGISTER 4 done CONST (UINT 1) 1 )
)
(RESOURCES
(RESOURCE 1 ext-input () () (PARAMS ..
(RESOURCE 2 ext-output () () (PARAMS ..
(RESOURCE 3 dataflow-in ((UINT 1)) () ..
(RESOURCE 4 tr () () (PARAMS))
(RESOURCE 5 add ((UINT 32) (UINT 32))..
)
(INITIAL 1)
(STATE 1
(INSN 1 ext-input 1 () () () (1))
(INSN 2 dataflow-in 3 () () (1) ())
(INSN 3 tr 4 () (2) () ())
)
(STATE 2
(INSN 4 add 5 () () (2 3) (2))
(INSN 5 tr 4 () (3) () ())
)
(STATE 3
(INSN 6 ext-output 2 () () (4) ())
)
)
)
29 @ikwzm高位合成友の会(2016/11/22)
Simple Builder の サンプル
・ 作ったら使ってみたい
・ というわけで、 いくつか簡単な回路を書いてみた
将来の Iroha への布石(Iroha で必要になるかもしれない演算)
・ div.rb - 整数除算器
・ fadd.rb - 浮動小数点加減算器
・ fmul.rb - 浮動小数点乗算器
・ fdiv.rb - 浮動小数点除算器
30 @ikwzm高位合成友の会(2016/11/22)
fadd.rb - 浮動小数点加減算器
・ ./iroha-ruby/examples/fadd.rb
(さすがにスライドじゃ入りきらない)
・ Simple Builder 用に記述したソースを Ruby で Iroha に変換
shell$ ruby ./examples/fadd.rb > ./examples/fadd.iroha
・ Iroha を iroha で Verilog-HDL に変換
shell$ iroha -v ./examples/fadd.iroha > ./test/fadd/src/fadd.v
・ Vivado でシミュレーション
./test/fadd/Readme.md 参照
31 @ikwzm高位合成友の会(2016/11/22)
fmul.rb - 浮動小数点乗算器
・ ./iroha-ruby/examples/fmul.rb
(さすがにスライドじゃ入りきらない)
・ Simple Builder 用に記述したソースを Ruby で Iroha に変換
shell$ ruby ./examples/fmul.rb > ./examples/fmul.iroha
・ Iroha を iroha で Verilog-HDL に変換
shell$ iroha -v ./examples/fmul.iroha > ./test/fmul/src/fmul.v
・ Vivado でシミュレーション
./test/fmul/Readme.md 参照
32 @ikwzm高位合成友の会(2016/11/22)
fdiv.rb - 浮動小数点除算器
・ ./iroha-ruby/examples/fdiv.rb
(さすがにスライドじゃ入りきらない)
・ Simple Builder 用に記述したソースを Ruby で Iroha に変換
shell$ ruby ./examples/fdiv.rb > ./examples/fdiv.iroha
・ Iroha を iroha で Verilog-HDL に変換
shell$ iroha -v ./examples/fdiv.iroha > ./test/fdiv/src/fdiv.v
・ Vivado でシミュレーション
./test/fdiv/Readme.md 参照
33 @ikwzm高位合成友の会(2016/11/22)
で、 結局 Iroha って?
・ どうやら ステート(状態)とリソースを色々と良きに計らってくれるらしい
・ Scheduling + Allocation
・ ステートの結合と分割
・ リソースの共通化(逐次処理)か分散化(並列処理)を選択
・ 抽象的なステート(状態)をデバイスに合わせて最適なクロック単
位のステートに変換してくれる...ことはやってくれるのかな?
現時点では不明、 出来ればしてほしい(希望)
34 @ikwzm高位合成友の会(2016/11/22)
Iroha こうなってほしいな~(3か月しか触っていないのにおこがましいけど)
・ 現状、 最適化と HDL 出力は Tabata さん頼み
・ みんなで弄れるようになれば高位合成友の会で盛り上がるかも
???
Iroha
FrontEnd
Compiler
Iroha
Verilog-HDL
現状
Iroha
Pass
Iroha
Iroha
Pass
Iroha
HDL Writer
Verilog-HDL
こうなったらいいな
この部分をみんな
で作って持ち寄る
みんなで作る際の
共通フォーマットと
しての Iroha
Pass

More Related Content

Viewers also liked

Viewers also liked (11)

高位合成でDeep learning
高位合成でDeep learning高位合成でDeep learning
高位合成でDeep learning
 
Hls friends 20161122.key
Hls friends 20161122.keyHls friends 20161122.key
Hls friends 20161122.key
 
PythonとVeriloggenを用いたRTL設計メタプログラミング
PythonとVeriloggenを用いたRTL設計メタプログラミングPythonとVeriloggenを用いたRTL設計メタプログラミング
PythonとVeriloggenを用いたRTL設計メタプログラミング
 
PYNQ 祭り: Pmod のプログラミング
PYNQ 祭り: Pmod のプログラミングPYNQ 祭り: Pmod のプログラミング
PYNQ 祭り: Pmod のプログラミング
 
PYNQ祭り
PYNQ祭りPYNQ祭り
PYNQ祭り
 
Pynqでカメラ画像をリアルタイムfastx コーナー検出
Pynqでカメラ画像をリアルタイムfastx コーナー検出Pynqでカメラ画像をリアルタイムfastx コーナー検出
Pynqでカメラ画像をリアルタイムfastx コーナー検出
 
TensorFlow User Group #1
TensorFlow User Group #1TensorFlow User Group #1
TensorFlow User Group #1
 
PYNQ単体でUIを表示してみる(PYNQまつり)
PYNQ単体でUIを表示してみる(PYNQまつり)PYNQ単体でUIを表示してみる(PYNQまつり)
PYNQ単体でUIを表示してみる(PYNQまつり)
 
Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)
 
2値化CNN on FPGAでGPUとガチンコバトル(公開版)
2値化CNN on FPGAでGPUとガチンコバトル(公開版)2値化CNN on FPGAでGPUとガチンコバトル(公開版)
2値化CNN on FPGAでGPUとガチンコバトル(公開版)
 
ゆるふわコンピュータ (IPSJ-ONE2017)
ゆるふわコンピュータ (IPSJ-ONE2017)ゆるふわコンピュータ (IPSJ-ONE2017)
ゆるふわコンピュータ (IPSJ-ONE2017)
 

Similar to 高位合成友の会第四回(2016/11/22)スライド

詳解Dexファイルフォーマット
詳解Dexファイルフォーマット詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
Takuya Matsunaga
 
ROS Tutorial 02 - CIT
ROS Tutorial 02 - CITROS Tutorial 02 - CIT
ROS Tutorial 02 - CIT
Daiki Maekawa
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成
弘毅 露崎
 
ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話
Preferred Networks
 
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
Takuya Matsunaga
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章
Tomonobu_Hirano
 

Similar to 高位合成友の会第四回(2016/11/22)スライド (20)

PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
V6 unix in okinawa
V6 unix in okinawaV6 unix in okinawa
V6 unix in okinawa
 
本当にあった怖い話し Db編
本当にあった怖い話し Db編本当にあった怖い話し Db編
本当にあった怖い話し Db編
 
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
 
textsearch_jaで全文検索
textsearch_jaで全文検索textsearch_jaで全文検索
textsearch_jaで全文検索
 
ROS Tutorial 02 - CIT
ROS Tutorial 02 - CITROS Tutorial 02 - CIT
ROS Tutorial 02 - CIT
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成
 
ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
 
One - Common Lispでもワンライナーしたい
One - Common LispでもワンライナーしたいOne - Common Lispでもワンライナーしたい
One - Common Lispでもワンライナーしたい
 
What is Metasepi?
What is Metasepi?What is Metasepi?
What is Metasepi?
 
awk v.s. bashどっちが強い?@OSC2011Tokyo
awk v.s. bashどっちが強い?@OSC2011Tokyoawk v.s. bashどっちが強い?@OSC2011Tokyo
awk v.s. bashどっちが強い?@OSC2011Tokyo
 
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207
 
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめDTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめ
 
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。
 
Tokyo r25 hiro_macchan
Tokyo r25 hiro_macchanTokyo r25 hiro_macchan
Tokyo r25 hiro_macchan
 

高位合成友の会第四回(2016/11/22)スライド

  • 2. 2 @ikwzm高位合成友の会(2016/11/22) 自己紹介みたいなもの ・ハンドルネーム ikwzm ・現在隠居中 ・もうすぐ 52 才(けっこう年) ・主に論理回路設計(回路図~VHDL) ・たまにプログラム(アセンブラ~C/Ruby) ・言語の設計は素人
  • 4. 4 @ikwzm高位合成友の会(2016/11/22) アセンブリ言語(機械語)によるプログラミング(暗黒?)時代 Assemble Code (.s) Computer(A) CPU Mem I/O Binary Code Assemble Code (.s) Computer(B) CPU Mem I/O Binary Code Assembler Load Assembler Load CPU の命令セット(Instruction Set) を一つずつ記述 互換性なし ◇ 問題点 ・ 生産性 ・ いちいち命令を並べるの? (面倒くせ~) ・ 互換性 ・ CPU 間で互換性無し (メーカーによる囲い込み)
  • 5. 5 @ikwzm高位合成友の会(2016/11/22) 機械語コンバーター Assemble Code (.s) Computer(A) CPU Mem I/O Binary Code Assemble Code (.s) Computer(B) CPU Mem I/O Binary Code Assembler Load Assembler Load ◇ 問題点 ・ 生産性 ・ アセンブラで書くことには変 わりない (なんの解決にも なってない) ・ 性能 ・ 変換したコードは CPU が 本来持つ能力を発揮でき なかった Converter CPU(A)の命令をもう CPU(B)の命令 に変換 Converter
  • 6. 6 @ikwzm高位合成友の会(2016/11/22) 高位言語とコンパイラによるプログラミング Computer(A) CPU Mem I/O Binary Code Computer(B) CPU Mem I/O Binary Code Assembler Load Assembler Load Converter C Fortran COBOL Assemble Code (.s) Assemble Code (.s) CompilerCompiler ・ いくら命令セットが違うと言っても、 同じように命令をフェッチしてレジス タやメモリからデータを読んで演算し てレジスタやメモリに書き戻すっての は同じ。 ・ だったら、 同じ部分を抽象化して 記述して、 異なる命令セットなど はコンパイラに任せればいい。
  • 7. 7 @ikwzm高位合成友の会(2016/11/22) 回路図による論理回路設計(暗黒?)時代 Schematic ASIC(A 社) Mask Mask メーカーが提供するライブラリからセルを 一つ一つ選択して接続した回路図 互換性なし ◇ 問題点 ・ 生産性 ・ いちいちセルを並べるの? (面倒くせ~) ・ 互換性 ・ メーカー間(またはファミリー 間でさえも)互換性無し (メーカーによる囲い込み) ASIC(B 社) Schematic Place & Route Place & Route 製造 製造
  • 8. 8 @ikwzm高位合成友の会(2016/11/22) 論理回路コンバーター Schematic ASIC Mask Bitstream ◇ 問題点 ・ 生産性 ・ 回路図を書くことにはかわり ない。 ・ 性能 ・ 変換したコードは FPGA が 持つ本来の性能を生かし きれなかった。 Schematic ASIC の 回路図(セルとネットリスト)を FPGA の回路図に変換 Converter Place & Route Place & Route 製造 Load FPGA
  • 9. 9 @ikwzm高位合成友の会(2016/11/22) HDL(Hardware 記述言語)と論理合成による回路設計 ASIC Mask Bitstream FPGA Net List Net List VHDL Verilog-HDL Logic Synthesis Converter Logic Synthesis Place & Route Place & Route 製造 Load ・ いくらセルの種類が違うと言っても、 同じようにレジスタがあって、 レジス タ間の論理を記述するという点は 同じ。 いわゆる RTL(Register Transfer Level)。 ・ だったら、 同じ部分を抽象化して 記述して、 異なるセルの選択など は論理合成に任せればいい。
  • 11. 11 @ikwzm高位合成友の会(2016/11/22) C 言語を使った論理回路設計 VHDL Verilog-HDL Mask Net List Bitstream Net List C Binary .s Binary .s Computer(B) CPU Mem I/O Computer(A) CPU Mem I/O ASIC Computer 用に C で記述された プログラムを HDL に変換 FPGA
  • 12. 12 @ikwzm高位合成友の会(2016/11/22) あ、 それ見たことある 一昔前に一つ下の階層でやってた VHDL Verilog-HDL Mask Net List Bitstream Net List C Binary .s Binary .s Computer(B) CPU Mem I/O Computer(A) CPU Mem I/O ASIC この時はコンバーターよりも より高位な言語による設計が選ばれた FPGA
  • 13. 13 @ikwzm高位合成友の会(2016/11/22) 本当に欲しい高位言語 VHDL Verilog-HDL Mask Net List Bitstream Net List C Binary .s Binary .s Computer(B) CPU Mem I/O Computer(A) CPU Mem I/O ASIC 本当に欲しい高位言語 はこれじゃないだろうか? FPGA ???
  • 14. 14 @ikwzm高位合成友の会(2016/11/22) 昔は昔、 今は今 - C-HDL コンバーターの良い点と悪い点 ・良い点(別に C 合成を dis ってるわけじゃない) ・ エンジニア数 ・ HDL を書けるエンジニアに比べて C を書けるエンジニアの方が圧倒的に多い。 ・ 生産性 ・ HDL に比べて C の方が生産性は高い。 ・悪い点(実はコンバーターと同じ問題があるんじゃないか?) ・ 生産性 ・ C は本当に生産性は良いのか? ・ Python、 Ruby、 Scala などもっと生産性の良い言語があるじゃないか?  ・ 性能 ・ 最初から HDL で書いたコードと比較してどうなの?
  • 15. 15 @ikwzm高位合成友の会(2016/11/22) 昔は昔、 今は今 - 下位層と上位層で距離が違う VHDL Verilog-HDL Mask Net List Bitstream Net List C Binary .s Binary .s Computer(B) CPU Mem I/O Computer(A) CPU Mem I/O ASIC ??? FPGA 本当に欲しい高位言語 はこれじゃないだろうか? この距離とこの距離の違い
  • 16. 16 @ikwzm高位合成友の会(2016/11/22) FPGA 本当に欲しい高位言語 ー そうは言っても VHDL Verilog-HDL Mask Net List Bitstream Net List C Binary .s Binary .s Computer(B) CPU Mem I/O Computer(A) CPU Mem I/O ASIC ??? 本当に欲しい高位言語 はこれじゃないだろうか? ・ 私には具体的なイメージがわかない 共通点を抽象化して高位言語として昇華する必要 下層の事を知りすぎた私には共通点よりも相違点のほうが 目についてしまう
  • 17. 17 @ikwzm高位合成友の会(2016/11/22) 理想の高位言語 - 用途限定 VHDL Verilog-HDL Mask Net List Bitstream Net List C Binary .s Binary .s Computer(B) CPU Mem I/O Computer(A) CPU Mem I/O ASIC ??? 用途を絞れば出来るかも (例えば TensorFlow とか) FPGA
  • 18. 18 @ikwzm高位合成友の会(2016/11/22) 理想の高位言語 - C よりも高位なプログラミング言語をベース VHDL Verilog-HDL Mask Net List Bitstream Net List Binary Binary Computer(B) CPU Mem I/O Computer(A) CPU Mem I/O ASIC Java Go Python VM (Virtual Machine) VM (Virtual Machine) C よりも高位な言語から HDL へ Java(Synthesijer) Python(Polyphony) 高位言語すべての機能やライブラリ が HDL に変換できるわけではない ことに注意 FPGA
  • 19. 19 @ikwzm高位合成友の会(2016/11/22) 理想の高位言語 - 論理回路設計専用 VHDL Verilog-HDL Mask Net List Bitstream Net List C Binary .s Binary .s Computer(B) CPU Mem I/O Computer(A) CPU Mem I/O ASIC ???論理回路設計用の高位言語 (SystemVerilog SFL NSL 等) FPGA コンピュータで動かすことには拘 らない(検証に限定) 私が今欲し いのはコレ
  • 21. 21 @ikwzm高位合成友の会(2016/11/22) Iroha - FPGA エクストリーム・コンピューティング(2016/8/24)より抜粋 ・ Iroha: Intermediate Representation Of Hardware Abstraction ・ URL: https://github.com/nlsynth/iroha ・ Author: Yusuke TABATA ・ 高位合成の共通バックエンド(LLVM 的な物)を目指して ・ 現状 ・ Synthesijer と Neon Light が iroha 出力を実装 ・ Neon Light の最適化コードを流用 ・ そのうち ・ フロントエンドの開発が楽になる ・ 最適化を改善して遊べるようになる ・ 高位合成友の会が盛り上がる ・ 海外の大学かどっかが潤沢なリソースで同じようなものを開発する...
  • 22. 22 @ikwzm高位合成友の会(2016/11/22) Iroha の構造 (MODULE mod-id mod-name (PARAMS (PARAM name value) ...) (TABLE tab-id tab-name (REGISTERS (REGISTER reg-id reg-name {REGS/WIRE/CONST} type init-value) : ) (RESOURCES (RESOURCE res-id res-name input-types output-types params) : ) (STATE state-id (INSN inst-id res-name res-id res-op (state-id ...)(reg-id ...)(reg-id ...)) : ) : ) ) mod-id はファイル内でユニークな番号 mod-name は文字列 一つの MODULE に複数の TABLE tab-id はモジュール内でユニークな番号 tab-name は文字列 一つの TABLE に複数の REGISTER reg-id は TABLE 内でユニークな番号 reg-name は文字列 () でも可 type は現在 (INT width) か (UINT width) 一つの TABLE に複数の RESOURCE res-id は TABLE 内でユニークな番号 res-name はリソース名 input-types と output-types は入出力レジスタの type 一つの TABLE に複数の STATE state-id は TABLE 内でユニークな番号 一つの STATE に複数の INST(Instruction) inst-id は TABLE 内でユニークな番号 res-id は RESOURCE で宣言した番号 reg-id は REGISTER で宣言した番号
  • 23. 23 @ikwzm高位合成友の会(2016/11/22) Iroha の構造 ・ Lisp みたいな文法 ・ テーブル単位で レジスタ、 リソース、 ステートを管理 ・ (REGISTER ...)でテーブル内で使用するレジスタを宣言 ・ reg-id は TABLE 内でユニークな番号。 ・ reg-name は任意の文字列。 () も可。 ・ REGS/WIRE/CONST はクラス。 ・ type は今のところ (UINT width) か (INT width) のみ。 width はビット数。 ・ init-value は今のところ整数。
  • 24. 24 @ikwzm高位合成友の会(2016/11/22) Iroha の構造 ・ (RESOURCE ...) でテーブル内で使用するリソースを宣言 ・ res-id は TABLE 内でユニークな番号。 ・ res-name はリソース名。 ・ 現時点で用意されているリソース ・ set などのレジスタ間データ転送 ・ add, sub, mul などの数値演算 ・ eq, gt, gte などの比較演算 ・ bit-and,bit-or,bit-inv,bit-xor,bit-sel,bit-concat,shift などのビット演算 ・ ext-input, ext-output などの外部入出力ポート ・ channel-read, channel-write などのチャネル入出力 ・ shared-reg, shared-reg-reader などの共有レジスタ ・ submodule-task, submodule-task-call, sibling-task, sibling-task- call などのタスク制御 ・ その他、 いろいろ追加予定?
  • 25. 25 @ikwzm高位合成友の会(2016/11/22) Iroha の構造 ・ (STATE ...) でステート(状態)を定義して、 そのステートで実行す る命令を宣言 ・ (INST ...) でステートで実行する命令を宣言 ・ 命令は次のようなものを指定する ・ 使用するリソースを res-id(リソース番号)で指定 ・ リソースにデータを入力するレジスタを reg-id(レジスタ番号)で指定 ・ リソースからの出力を保持するレジスタを reg-id(レジスタ番号)で指定 ・ 次にどのステートに移行するかを state-id(ステート番号)で指定
  • 26. 26 @ikwzm高位合成友の会(2016/11/22) iroha-ruby - Iroha を Ruby で扱うライブラリ ・ Iroha を(私が)理解するためのトライアル的な位置づけ ・ URL: https://github.com/ikwzm/iroha-ruby ・ Iroha の各種構造を Ruby のクラスとして定義 ・ MODULE → ./iroha-ruby/lib/iroha/iroha/i_module.rb ・ REGISTER → ./iroha-ruby/lib/iroha/iroha/i_register.rb ・ TABLE → ./iroha-ruby/lib/iroha/iroha/i_table.rb ・ 等々 ・ Parser (Iroha 形式を Ruby のクラスとして入力) ・ treetop(https://github.com/nathansobo/treetop) を使用。 ・ Grammer → ./iroha-ruby/lib/iroha/builder/exp_parser.tt ・ Writer (Ruby のクラスから Iroha 形式に出力) ・ 各クラス に_to_exp メソッドを定義
  • 27. 27 @ikwzm高位合成友の会(2016/11/22) iroha-ruby - Iroha を Ruby で扱うライブラリ ・ Simple Builder ・ 簡易的な Iroha 形式の構築ツール ・ Iroha からどんな HDL が生成されるかを見るために、 Iroha を直接記述してみたい。 しかし、 Iroha ではリソースやレジスタをユニークな番号で管理しているので直接記述す るのは面倒。 そのため、 簡易的な構築ツールを作ってみた。 ・ 当初は本当に簡易的なものだったが、 なんだか知らないうちに色々と拡張してしまった。 ・ Ruby の内部 DSL ・ ./iroha-ruby/lib/iroha/builder/simple.rb ・ サンプル ・ ./iroha-ruby/examples/*.rb
  • 28. 28 @ikwzm高位合成友の会(2016/11/22) Simple Builder の記述例 require_relative '../lib/iroha/builder/simple' include Iroha::Builder::Simple design = IDesign :design do IModule :mod do ITable :tab do Wire :req => Unsigned(1) Register :counter => Unsigned(32) <= 0 Constant :one => Unsigned(32) <= 1 Constant :done => Unsigned(1) <= 1 ExtInput :data_in => Unsigned(1) ExtOutput :flow_out => Unsigned(1) <= 0 DataFlowIn :flow_in => Unsigned(1) IState :state1 IState :state2 IState :state3 state1.on { req <= data_in flow_in <= req Goto state2 } state2.on { counter <= counter + one Goto state3 } state3.on { flow_out <= done } end end end (MODULE 1 mod (TABLE 1 tab (REGISTERS (REGISTER 1 req WIRE (UINT 1) ()) (REGISTER 2 counter REG (UINT 32) 0 ) (REGISTER 3 one CONST (UINT 32) 1 ) (REGISTER 4 done CONST (UINT 1) 1 ) ) (RESOURCES (RESOURCE 1 ext-input () () (PARAMS .. (RESOURCE 2 ext-output () () (PARAMS .. (RESOURCE 3 dataflow-in ((UINT 1)) () .. (RESOURCE 4 tr () () (PARAMS)) (RESOURCE 5 add ((UINT 32) (UINT 32)).. ) (INITIAL 1) (STATE 1 (INSN 1 ext-input 1 () () () (1)) (INSN 2 dataflow-in 3 () () (1) ()) (INSN 3 tr 4 () (2) () ()) ) (STATE 2 (INSN 4 add 5 () () (2 3) (2)) (INSN 5 tr 4 () (3) () ()) ) (STATE 3 (INSN 6 ext-output 2 () () (4) ()) ) ) )
  • 29. 29 @ikwzm高位合成友の会(2016/11/22) Simple Builder の サンプル ・ 作ったら使ってみたい ・ というわけで、 いくつか簡単な回路を書いてみた 将来の Iroha への布石(Iroha で必要になるかもしれない演算) ・ div.rb - 整数除算器 ・ fadd.rb - 浮動小数点加減算器 ・ fmul.rb - 浮動小数点乗算器 ・ fdiv.rb - 浮動小数点除算器
  • 30. 30 @ikwzm高位合成友の会(2016/11/22) fadd.rb - 浮動小数点加減算器 ・ ./iroha-ruby/examples/fadd.rb (さすがにスライドじゃ入りきらない) ・ Simple Builder 用に記述したソースを Ruby で Iroha に変換 shell$ ruby ./examples/fadd.rb > ./examples/fadd.iroha ・ Iroha を iroha で Verilog-HDL に変換 shell$ iroha -v ./examples/fadd.iroha > ./test/fadd/src/fadd.v ・ Vivado でシミュレーション ./test/fadd/Readme.md 参照
  • 31. 31 @ikwzm高位合成友の会(2016/11/22) fmul.rb - 浮動小数点乗算器 ・ ./iroha-ruby/examples/fmul.rb (さすがにスライドじゃ入りきらない) ・ Simple Builder 用に記述したソースを Ruby で Iroha に変換 shell$ ruby ./examples/fmul.rb > ./examples/fmul.iroha ・ Iroha を iroha で Verilog-HDL に変換 shell$ iroha -v ./examples/fmul.iroha > ./test/fmul/src/fmul.v ・ Vivado でシミュレーション ./test/fmul/Readme.md 参照
  • 32. 32 @ikwzm高位合成友の会(2016/11/22) fdiv.rb - 浮動小数点除算器 ・ ./iroha-ruby/examples/fdiv.rb (さすがにスライドじゃ入りきらない) ・ Simple Builder 用に記述したソースを Ruby で Iroha に変換 shell$ ruby ./examples/fdiv.rb > ./examples/fdiv.iroha ・ Iroha を iroha で Verilog-HDL に変換 shell$ iroha -v ./examples/fdiv.iroha > ./test/fdiv/src/fdiv.v ・ Vivado でシミュレーション ./test/fdiv/Readme.md 参照
  • 33. 33 @ikwzm高位合成友の会(2016/11/22) で、 結局 Iroha って? ・ どうやら ステート(状態)とリソースを色々と良きに計らってくれるらしい ・ Scheduling + Allocation ・ ステートの結合と分割 ・ リソースの共通化(逐次処理)か分散化(並列処理)を選択 ・ 抽象的なステート(状態)をデバイスに合わせて最適なクロック単 位のステートに変換してくれる...ことはやってくれるのかな? 現時点では不明、 出来ればしてほしい(希望)
  • 34. 34 @ikwzm高位合成友の会(2016/11/22) Iroha こうなってほしいな~(3か月しか触っていないのにおこがましいけど) ・ 現状、 最適化と HDL 出力は Tabata さん頼み ・ みんなで弄れるようになれば高位合成友の会で盛り上がるかも ??? Iroha FrontEnd Compiler Iroha Verilog-HDL 現状 Iroha Pass Iroha Iroha Pass Iroha HDL Writer Verilog-HDL こうなったらいいな この部分をみんな で作って持ち寄る みんなで作る際の 共通フォーマットと しての Iroha Pass