Go VHDL VerilogHDL
@miyox
2016.11.22 -
C/C++…Java Fortran
2
Synthesijer とは
✔ JavaプログラムをFPGA上のハードウェアに変換
✔ 複雑なアルゴリズムのハードウェア実装を楽に
✔ オブクジェクト指向設計による再利用性の向上
✔ 特殊な記法,追加構文はない
✔ ソフトウェアとして実行可能.動作の確認、検証が容易
✔ 書けるプログラムに制限は加える
(動的なnew,再帰は制限付きで可など)
Javaコンパイラフロントエンド
Synthesijerエンジン
Javaコンパイラバックエンド
合成配置配線
while(){if(...){ … }else{ … … }….}
複雑な状態遷移も,Javaの制御構文を使って楽に設計できる
同じJavaプログラムをソフトウェアとしても
FPGA上のハードウェアとしても実行可能
Open-source
always @(posedge clk) begin a <= b; b <= a; end
process(clk) begin if rising_edge(clk) then a <= b; b <= a; end if; end process;
!!
… { pragma }
VHDL/VerilogHDL
C/C++
… a,b = b,a …
func swap(a, b int) (int, int){ return b, a }
Go
func sum(s []int, c chan int){ sum := 0 for _,v := range s{ sum += v } c <- sum}
Go
func main(){ s := []int{7,2,8,-9,4,0}
go sum(s[:len(s)/2], c) go sum(s[len(s)/2:], c)
x, y := <-c, <-c
fmt.Println(x, y, x + y)}
GoGo
HDL
range
range
range
FIFO
goroutine
goroutine
f g
goroutine
f g
Synthesijer IR
Synthesijer IR
49
Synthesijerオーバービュー
JavaコードJavaプログラムの解析
スケジューリング表を作成
最適化
HDL構文の組み立てVHDL/
Verilog HDL
コード
Javaコード
VHDL/
Verilog HDL
コード
VHDL/
Verilog HDL
コード
中間表現
(S式)
フロントエンド
ミドルエンド
バックエンド
50
Synthesijer as a Compiler-Infrastructure
Javaコード
スケジューリング表を作成
最適化
Y構文の組み立てVHDL/
Verilog HDL
コード
X言語
VHDL/
Verilog HDL
コード
中間表現
(S式)
フロントエンド
ミドルエンド
バックエンド
X言語パーザー 最適化器
Y言語
package main
import ("fmt""strings""go/parser""go/token""os""path/filepath""github.com/codegangsta/cli""github.com/miyo/go2ir/synthesijer"
)
func body(src string) {fset := token.NewFileSet()file, err := parser.ParseFile(fset, src, nil, 0)if err != nil {
panic(err)}
target_name := src[:strings.LastIndex(src, ".")]target := synthesijer.Module{Name: filepath.Base(target_name)}
synthesijer.Parse(file, &target)…
Go!!
for _, decl := range file.Decls {switch td := decl.(type) {case *ast.GenDecl:
switch td.Tok {case token.IMPORT: case token.TYPE: case token.CONST: case token.VAR:
for _, sp := range td.Specs {s := sp.(*ast.ValueSpec)
case *ast.FuncDecl:b := target.AddBoard(&Board{Name: td.Name.Name, Module: target})
if td.Recv != nil {
fmt.Println(td.Recv.List[0].Type)}if td.Type.Params != nil && td.Type.Params.NumFields() > 0 {
for _, p := range td.Type.Params.List {for _, n := range p.Names {
t := convTypeFromExpr(p.Type)b.AddVariable(&Variable{Name: n.Name, MethodParam: true,
OriginalName: n.Name, MethodName: td.Name.Name, Type: t})}
}}if td.Type.Results != nil && td.Type.Results.NumFields() > 0 {
Go!!
• Java … • …
• Python Python (ry
• • LISP
• Google … • IROHA
• ( )
• Go
• Go HW
•
•
• IROHA VivadoHLS CWB OpenCLNSL