Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Hls friends 20161122.key

2,109 views

Published on

a test to implement a compiler from Go to VHDL/Verilog HDL

Published in: Engineering

Hls friends 20161122.key

  1. 1. Go VHDL VerilogHDL @miyox 2016.11.22 -
  2. 2. C/C++ …Java Fortran
  3. 3. 2 Synthesijer とは ✔ JavaプログラムをFPGA上のハードウェアに変換 ✔ 複雑なアルゴリズムのハードウェア実装を楽に ✔ オブクジェクト指向設計による再利用性の向上 ✔ 特殊な記法,追加構文はない ✔ ソフトウェアとして実行可能.動作の確認、検証が容易 ✔ 書けるプログラムに制限は加える (動的なnew,再帰は制限付きで可など) Javaコンパイラ フロントエンド Synthesijer エンジン Javaコンパイラ バックエンド 合成 配置配線 while(){ if(...){ … }else{ … … } …. } 複雑な状態遷移も,Javaの制御構文を使って楽に設計できる 同じJavaプログラムをソフトウェアとしても FPGA上のハードウェアとしても実行可能 Open-source
  4. 4. 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++
  5. 5. … a,b = b,a … func swap(a, b int) (int, int){ return b, a } Go
  6. 6. func sum(s []int, c chan int){ sum := 0 for _,v := range s{ sum += v } c <- sum } Go
  7. 7. 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) } Go Go
  8. 8. HDL
  9. 9. range
  10. 10. range
  11. 11. range FIFO
  12. 12. goroutine
  13. 13. goroutine f g
  14. 14. goroutine f g
  15. 15. Synthesijer IR
  16. 16. Synthesijer IR
  17. 17. 49 Synthesijerオーバービュー Javaコード Javaプログラムの解析 スケジューリング表を作成 最適化 HDL構文の組み立て VHDL/ Verilog HDL コード Javaコード VHDL/ Verilog HDL コード VHDL/ Verilog HDL コード 中間表現 (S式) フロントエンド ミドルエンド バックエンド
  18. 18. 50 Synthesijer as a Compiler-Infrastructure Javaコード スケジューリング表を作成 最適化 Y構文の組み立て VHDL/ Verilog HDL コード X言語 VHDL/ Verilog HDL コード 中間表現 (S式) フロントエンド ミドルエンド バックエンド X言語パーザー 最適化器 Y言語
  19. 19. 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 !!
  20. 20. 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 !!
  21. 21. • Java … • … • Python Python (ry • • LISP • Google … • IROHA • ( )
  22. 22. • Go • Go HW • • • IROHA VivadoHLS CWB OpenCL NSL

×