IOブロックへのレジスタパッキング

[] [] []


FPGAIOブロック(IO Tile,IOE)には入力レジスタIFF、出力レジスタOFF、出力イネーブルレジスタTFFが備わっている。これらはIOバッファの近くに配置されており、入出力のタイミング(tCO,tSU,tH)一定値にそろう。

レジスタをIOブロック内のレジスタにパッキングする操作は論理合成ではなく配置配線で行われるので、この制約はRTLにかかずに制約ファイルに書く。Quartusの場合はポート名で指定できるみたいだが、Xilinxの場合はネットリストのFFのインスタンス名を指定しなければならないようなので、ツール上で合成後のネットリストから検索する必要がありめんどうである。

// QuartusIIの場合(.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 (ポート名)

// XSTの場合(.ucfファイル)

INST "(FFのインスタンス名)" IOB=TRUE;

// Vivadoの場合(.xdcファイル)

set_property IOB TRUE [get_ports {ポート名}]       // 入出力FFはポート名を指定すればよい

set_property IOB TRUE [get_cells {FFのインスタンス名}]   // 出力イネーブル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_reg1ビット

 

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_reg16ビット

    end

endgenerate


[] [] []