@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそ、すべては、SystemC v0.9公開から始まった
はじめに
XilinxのHLSがgithubにアップされたのを知ったのは、2月27日です。
Xilinx Vitis HLS LLVM 2020.2
— Vengineer@ (@Vengineer) 2021年2月27日
これは、いったい何なんでしょうか?https://t.co/z6RPH1rUDb
この時は、これはなんだかよくわからなかったんですが、その後、下記のような内容がTwitterでまわってきました。
これにより、github にアップされたのは、Vitis HLS の front-end 部のソースコードということが分かりました。
そして、昨日、EETimes にアップされた下記の記事を Linkedin で知りました。この記事には、Kick Ni さん (director of product marketing for AI and software, Xilinx)のコメントも載っています。
Xilinx/HLS の中身
github の Xilinx/HLS の中身を眺めてみました。
次の3つのディレクトリから構成されています。
- LLVM
- plugins
- vitis_hls_examples
上記の vitis_hls_examples のディレクトリを覗くと、次のような High level flow の図が出ています (説明のために、図を引用します)
今回公開されたのは、図の上の方の HLS C/C++ から LLVM IR (output.bc) を生成する部分のようです。C/C++ に HLS 用の pragma (HLS XXXXなど) から
- Preprocess : HLS Clang/Clang-tidy
- Syntax checker : HLS Clang-tidy
- Dataflow lawyer : HLS xilinx-dataflow-lawyer
- Compilation : HLS Clang
で処理して、LLVM IR (output.bc) として出力する。というものらしいです。
Clangの Parse に、ParseXlxPragma.cpp というファイルがありました。この部分が 対応する pragma のようです。
auto *Handle = StringSwitch<Handler>(str(MaybeName)) .CaseLower("dataflow", HandleXlxDataflowPragma) .CaseLower("pipeline", HandleXlxPipelinePragma) .CaseLower("unroll", HandleXlxUnrollPragma) .CaseLower("loop_flatten", HandleXlxFlattenPragma) .CaseLower("loop_merge", HandleXlxMergePragma) .CaseLower("loop_tripcount", HandleLoopTripCountPragma) .CaseLower("inline", HandleInlinePragma) .CaseLower("interface", HandleInterfacePragma) .CaseLower("resource", HandleResourcePragma) .CaseLower("stream", HandleStreamPragma) .CaseLower("reset", HandleResetPragma) .CaseLower("allocation", HandleAllocationPragma) .CaseLower("expression_balance", HandleExpressionBanlancePragma) .CaseLower("function_instantiate", HandleFunctionInstantiatePragma) .CaseLower("array_partition", HandleArrayPartitionPragma) .CaseLower("array_reshape", HandleArrayReshapePragma) .CaseLower("top", HandleTopFunctionPragma) .CaseLower("occurrence", HandleOccurrencePragma) .CaseLower("protocol", HandleProtocolPragma) .CaseLower("latency", HandleLatencyPragma) .CaseLower("dependence", HandleXlxDependencePragma) .CaseLower("stable", HandleXlxStablePragma) .CaseLower("stable_content", HandleXlxStableContentPragma) .CaseLower("shared", HandleXlxSharedPragma) .CaseLower("disaggregate", HandleXlxDisaggrPragma) .CaseLower("aggregate", HandleXlxAggregatePragma) .CaseLower("bind_op", HandleXlxBindOpPragma) .CaseLower("bind_storage", HandleXlxBindStoragePragma) .CaseLower("extract", UnsupportPragma) .CaseLower("REGION", UnsupportPragma) .CaseLower("array_map", UnsupportPragma) .CaseLower("clock", HandleClockPragma) .CaseLower("alias", HandleMAXIAliasPragma) .CaseLower("data_pack", HandleDataPackPragma) .Default(HandleUnkwonPragma);
Clang-tidy は、HLS/llvm/clang-tools/extra/clang-tidy のことのようです。このディレクトリの下に、xilinx があります。
この中で Preprocess および Syntax check をするようです。これらのドキュメントも ここ にあります。
xilinx-dataflow-lawyer は、HLS/llvm/clang-tools/extra/xilinx-dataflow-lawyer のことのようです。
xilinx-legacy-rewriter というものが HLS/llvm/clang-tools/extra/xilinx-legacy-rewriter にありますね。
LLVMのTarget は、ここ (FPGA) にありますね。
ドキュメントは、ここ にありましたが、Xilinx FPGA Intrinsics だけしかありませんね。
IRBuilder が
にありました。
Analysis にもありました。