Hls friends 20161122.key

24
Go VHDL VerilogHDL @miyox 2016.11.22 -

Transcript of Hls friends 20161122.key

Page 1: Hls friends 20161122.key

Go VHDL VerilogHDL

@miyox

2016.11.22 -

Page 2: Hls friends 20161122.key

C/C++…Java Fortran

Page 3: Hls friends 20161122.key

2

Synthesijer とは

✔ JavaプログラムをFPGA上のハードウェアに変換

✔ 複雑なアルゴリズムのハードウェア実装を楽に

✔ オブクジェクト指向設計による再利用性の向上

✔ 特殊な記法,追加構文はない

✔ ソフトウェアとして実行可能.動作の確認、検証が容易

✔ 書けるプログラムに制限は加える

(動的なnew,再帰は制限付きで可など)

Javaコンパイラフロントエンド

Synthesijerエンジン

Javaコンパイラバックエンド

合成配置配線

while(){if(...){ … }else{ … … }….}

複雑な状態遷移も,Javaの制御構文を使って楽に設計できる

同じJavaプログラムをソフトウェアとしても

FPGA上のハードウェアとしても実行可能

Open-source

Page 4: Hls friends 20161122.key
Page 5: Hls friends 20161122.key

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++

Page 6: Hls friends 20161122.key

… a,b = b,a …

func swap(a, b int) (int, int){ return b, a }

Go

Page 7: Hls friends 20161122.key

func sum(s []int, c chan int){ sum := 0 for _,v := range s{ sum += v } c <- sum}

Go

Page 8: Hls friends 20161122.key

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

Page 9: Hls friends 20161122.key

HDL

Page 10: Hls friends 20161122.key
Page 11: Hls friends 20161122.key

range

Page 12: Hls friends 20161122.key

range

Page 13: Hls friends 20161122.key

range

FIFO

Page 14: Hls friends 20161122.key

goroutine

Page 15: Hls friends 20161122.key

goroutine

f g

Page 16: Hls friends 20161122.key

goroutine

f g

Page 17: Hls friends 20161122.key

Synthesijer IR

Page 18: Hls friends 20161122.key

Synthesijer IR

Page 19: Hls friends 20161122.key

49

Synthesijerオーバービュー

JavaコードJavaプログラムの解析

スケジューリング表を作成

最適化

HDL構文の組み立てVHDL/

Verilog HDL

コード

Javaコード

VHDL/

Verilog HDL

コード

VHDL/

Verilog HDL

コード

中間表現

(S式)

フロントエンド

ミドルエンド

バックエンド

Page 20: Hls friends 20161122.key

50

Synthesijer as a Compiler-Infrastructure

Javaコード

スケジューリング表を作成

最適化

Y構文の組み立てVHDL/

Verilog HDL

コード

X言語

VHDL/

Verilog HDL

コード

中間表現

(S式)

フロントエンド

ミドルエンド

バックエンド

X言語パーザー 最適化器

Y言語

Page 21: Hls friends 20161122.key

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!!

Page 22: Hls friends 20161122.key

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!!

Page 23: Hls friends 20161122.key

• Java … • …

• Python Python (ry

• • LISP

• Google … • IROHA

• ( )

Page 24: Hls friends 20161122.key

• Go

• Go HW

• IROHA VivadoHLS CWB OpenCLNSL