Upload
ryos36
View
98
Download
1
Embed Size (px)
Citation preview
Polyphony IO まとめシンビー社内資料
2017/3/31
ケース1Zynq から RPC
Testbench 主導開発Python 関数Python 関数
(testbench)
def sum(a, b, c): return a * b + c
@testbenchdef test(): r = sum(1, 2, 3) print(r)
test()
I/F
Polyphony が Python への道を開いてくれるPython 関数Python 関数
(testbench)
def sum(a, b, c): return a * b + c
@testbenchdef test(): r = sum(1, 2, 3) print(r)
test()
主に CPU からの RPC 的な使用法を想定している
Polyphony が生成したVerilog の I/F の意味
I/F
msgpack-RPC Server
最終形はこれ
Python 関数IO
AXI
AXI バス
CPU AXI
Linuxドライバ
msgpack-RPC Client
Python Msgpack RPC
Python アプリケーショ
ン
ケース2IO を扱う
Python
Polyphony IO
SPI
IO
I/F Python
Polyphony が SPI を IO ごとラップ
SPI
IO
主に SPI などの IO をラッピングしてくれる
I/FPython
反対側の IF はどうする?
SPI
IO?
Verilog
Python
処理の本質と IO をきれいに分離
SPI
IO? 本質
IO とのきれいな分離
I/FPython
Standalone タイプ
SPI
IO
Python のコードは橋渡し的になるPython が能動的にメモリをアクセス
IO
Memory
I/FPython
IoT タイプ
SPI
IO
Python のコードは橋渡し的になるCPU からは SPI や I2C に見える
IO
CPU
SPIorI2C
I/FPython
関数 (RPC) タイプ ( というのはない )
SPI
IO
Zynq などの ARM CPU から SPI をラッピングしているように見える
CPU
AXI バス
ケース 3フィルタ
フィルターアプリを Python でフィルターアプリ
@workerdef woker_func1(): …
@workerdef woker_func2(): …
Que
IO Q
ueue
IO Q
ueue
I/FVerilog
AXIS
他のモジュールと連携フィルターアプリ
@workerdef woker_func1(): …
@workerdef woker_func2(): …
Que
IO Q
ueue
IO Q
ueueVerilog
AXIS
ケース 4研究の人たちが使いたいパターン
I/F
msgpack-RPC Server
これに近い
Python 関数IO
AXI
AXI バス
CPU AXI
Linuxドライバ
msgpack-RPC Client
Python Msgpack RPC
Python アプリケーショ
ン
バースト的にメモリから情報をとる
I/F
msgpack-RPC Server
Python 関数IOIO
Queue
IO Q
ueue
Memory
@worker
AXI バスCPU
Memory
@worker
疑似コードreg_woker_to_kick_me = Reg()memory_IO_0 = IO_Queue()memory_IO_1 = IO_Queue()memory_IO_2 = IO_Queue()
def kick_me(para_a, para_b, para_c): kick_worker() # ワーカーを起動 wait_worker() # ワーカー終了待ち return reg_woker_to_kick_me
@workerdef multiple_worker(): flag = True n = 0 while ( flag ): (data_0, user_0, last_0) = memory_IO_0.pull() (data_1, user_1, last_1) = memory_IO_1.pull() n += 1 if ( last_0 == 1 ) : assert(last_1 == 1) flag = False data_result = data_0 * data_1 memory_IO_2.push((data_result, user_0, user1)) reg_worker_to_kick_me.value = n finish_worker()