QuartusIIで最適化によるレジスタの削除を抑止
元ネタはFPGAの部屋さんから
この手の最適化が一番困るのが、やはりメモリのI/O周りです。128bitのイネーブルを1つのFFでやろうとすると、すぐに同じ問題にぶちあたります。
Xilinxの場合は、コメントの通りEquivalent Register RemovalのチェックをはずすでOK。
当然Alteraでも当然同じ事はできるわけで。昔のQuartusはそんなのわかんねーよって所に設定があったのですが、今はそれなりに分かりやすいところで設定できます。
これくらいの簡単なVerilogで試してみます。
module er(inp, outp, clk);
input inp;
output [7:0] outp;
input clk;
reg [7:0] r;
reg [7:0] outp;
always @ (posedge clk)begin
r <= {inp, inp, inp, inp, inp, inp, inp, inp};
outp <= r;
end
endmodule
まず普通に合成してみると、このようなメッセージが出て等価なレジスタは削除された事がわかります。
Info: Duplicate registers merged to single register
Info: Duplicate register "r[7]" merged to single register "r[0]"
Info: Duplicate register "r[6]" merged to single register "r[0]"
Info: Duplicate register "r[5]" merged to single register "r[0]"
Info: Duplicate register "r[4]" merged to single register "r[0]"
Info: Duplicate register "r[3]" merged to single register "r[0]"
Info: Duplicate register "r[2]" merged to single register "r[0]"
Info: Duplicate register "r[1]" merged to single register "r[0]"
Info: Duplicate register "outp[7]~reg0" merged to single register "outp[0]~reg0"
Info: Duplicate register "outp[6]~reg0" merged to single register "outp[0]~reg0"
Info: Duplicate register "outp[5]~reg0" merged to single register "outp[0]~reg0"
Info: Duplicate register "outp[4]~reg0" merged to single register "outp[0]~reg0"
Info: Duplicate register "outp[3]~reg0" merged to single register "outp[0]~reg0"
Info: Duplicate register "outp[2]~reg0" merged to single register "outp[0]~reg0"
Info: Duplicate register "outp[1]~reg0" merged to single register "outp[0]~reg0"
Technology map Viewerで見ると、間違いなく最適化により8bitのレジスタが1つにまとめられています。
次に、設定を変えて最適化を抑止してみましょう。Quartusの設定で、Assignment→Setting→Analysis & Synthesis Setting とすすみ、More Settingでこの画面に行きます。
ここで、Remove Duplicate RegistersがデフォルトでONになっているはずですので、ここをOFFにします。
もう一度論理合成をかけると、さっきのメッセージは出なくなります。
Technology map Viewerで見ると、宣言した数だけFFが使われています。
めでたし、めでたし。
ちなみにQuartusのVersionは 7.1 Web Editionです。
The comments to this entry are closed.
Comments