IOブロックへのレジスタパッキング
FPGAのIOブロック(IO Tile,IOE)には入力レジスタIFF、出力レジスタOFF、出力イネーブルレジスタTFFが備わっている。これらはIOバッファの近くに配置されており、入出力のタイミング(tCO,tSU,tH)が一定値にそろう。
レジスタをIOブロック内のレジスタにパッキングする操作は論理合成ではなく配置配線で行われるので、この制約はRTLにかかずに制約ファイルに書く。Quartusの場合はポート名で指定できるみたいだが、Vivadoの場合はネットリストのFFのインスタンス名を指定しなければならないようなので、ツール上で合成後のネットリストから検索する必要がありめんどうである。
# Quartusの場合(.qsfファイル) set_instance_assignment -name FAST_INPUT_REGISTER ON -to (ポート名) set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to (ポート名) set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to (ポート名) |
# Vivadoの場合(.xdcファイル) # 入力FF,出力FFはポート名を指定すればよい set_property IOB TRUE [get_ports {ポート名}] # 出力イネーブルFFはインスタンス名を指定する(ただしUltrascaleにはTFFがない) set_property IOB TRUE [get_cells {FFのインスタンス名}] |
◇
出力イネーブルのレジスタは、出力ピン数分だけRTLで明示的に複製しておいた方がよい。
また多くのFPGAではTFF=0のときにイネーブル(負論理)になっているので、RTL記述も負論理にしておく。
× output[15:0] dout reg[15:0] dout_reg; reg oe_reg; assign dout = (~oe_reg)? dout_reg : 16'bz; // oe_regは1ビット |
○ output[15:0] dout reg[15:0] dout_reg; (* keep="true" *) reg[15:0] oe_reg; genvar i; generate for(i=0; i<15; i=i+1) begin: dout_hiz assign dout[i] = (~oe_reg[i])? dout_reg[i] : 1'bz; // oe_regは16ビット end endgenerate |