CコードとRTL記述の対応
合成可能なCコードをざっくり把握するために、合成後のRTL記述との対応を示す。
(1) トップ階層はCの関数がRTLのmoduleになる。
(2) クロックとリセットは自動的に生成される。
(3) IO信号はC関数の引数から生成される。
引数にハンドシェーク信号(vld,ack)を付けるにはpragmaで指定する。
入力の場合、vldを1にしてackも1になったら受け付けられたことになる。
Cコード |
合成後のRTL記述 |
void dut (ap_uint<8> din // (i) ,ap_uint<8> *dout // (o) ) { #pragma HLS INTERFACE ap_ctrl_none port=return #pragma HLS INTERFACE ap_hs port=din #pragma HLS INTERFACE ap_hs register port=dout *dout = din; } |
module dut (input ap_clk ,input ap_rst ,output din_ap_ack ,input din_ap_vld ,input[7:0] din ,input dout_ap_ack ,output reg dout_ap_vld ,output reg[7:0] dout ); ... endmodule |
◇
生成されるRTLのIO信号をまとめると次表のようになる。
IO信号 |
生成方法 |
クロック (i) ap_clk |
・自動的に生成される |
リセット (i) ap_rst (正論理) (i) ap_rst_n (負論理) |
・Solution Settings...のconfig_rtlコマンドで指定する -reset control(default) 制御信号を作るFFのみリセットあり またはnone リセットなし、またはall 全FFリセットあり -reset_async非同期リセット、指定しなければ同期リセット -reset_level high(default)正論理、またはlow負論理 |
クロックイネーブル (i) ap_ce |
・Solution Settings...のconfig_interfaceコマンドで指定する -clock_enable |
トップ階層の開始終了信号 (i) ap_start 開始 (o) ap_done 終了 (o) ap_ready 次を開始可 (o) ap_idle アイドル |
・#pragma HLS INTERFACEで指定する ap_ctrl_none port=return なし ap_ctrl_hs port=return あり 通常は「なし」、トップ階層をバスマスタにするとき「あり」にする |
引数のハンドシェーク信号 引数が入力の場合は (i) *_ap_vld 確定valid (o) *_ap_ack 受付 出力の場合は逆方向になる |
・#pragma HLS INTERFACEで指定する ap_none port=引数名 なし(処理中は入力一定に保つ) ap_hs port=引数名 ハンドシェーク信号(vld,ack)付き |
(注) GUIのSolution Settingsで指定したものはscript.tclに記述される。
◇◇
pragmaはGUIで設定してdirectives.tclに記述する方法もあるが、回路の意図がわかるようにCコード中に書いた方がよいと思う。どのみちS/W用のCコードはH/W向けに書き換えなければならないので。