2008.02.03

QuartusIIで最適化によるレジスタの削除を抑止 その2

FPGAの部屋 DDR2 SDRAMコントローラのインプリメントテスト2(動作周波数の確保2)のコメント欄にお返事。

XSTなり、QuartusIIのオプションで制御すると全体にオプションが適用されてしまいます。marsee さんの言われるとおり、それは設計者の意図するところでは無かったりします。回路全体のFANOUTを1に設定するのは全く意味が無いのですが、レジスタを保存するならそれほど全体に影響しないという違いもあります。あらためて考えると面白い。

XSTでFANOUTの数を自力で制御するなら(* equivalent_register_removal = "no" *) でも行けますね。こちらこそ勉強になりました。ありがとうございます。

で、それアルテラでできるよ、という話。

reg [7:0] r ;
reg [7:0] outp /* synthesis preserve = 1 */;

always @ (posedge clk)begin
  r <= {inp, inp, inp, inp, inp, inp, inp, inp};
  outp <= r;
end

このように、/* synthesis preserve = 1 */をつけることで、レジスタを最適化から守ることができます。この状態で、Remove Duplicate RegistersをONにすると、rは最適化され1つになりますが、outpは最適化が抑止されます。

大成功

| | Comments (2) | TrackBack (0)

2008.02.02

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です。

| | Comments (0) | TrackBack (0)

ISEのプロジェクトにxcoファイルを追加する

coregenで作成済みのxcoファイルが、プロジェクトに上手く足せない事がある。

プロジェクトから、右クリックNew Sourceだと普通にプロジェクトに電球のアイコンの.xcoが追加される。これは問題ない。昔のプロジェクトをコピーした時、同名の.vがプロジェクトに追加されていて、ダブルクリックしても、ソースが表示されるだけでCoregenで修正できない。

まずプロジェクトから右クリック→Add Sourceを使って、xcoファイルを追加しようとするとこのエラー

Core Generator cores can not be added using Add Source ... use Add Copy of Source ... instead.

言われるがままに、Add Copy of Sourceをするとこのエラー
Source file all ready in project directory. It wasn't necessary to copy the file.
Core Generator cores can not be added using Add Source ... use Add Copy of Source ... instead.

こんな時は、

(1)対象となる.xcoファイルをいったん別のフォルダーに移動
(2)Add Copy of Sourceで移動先のxcoファイルを追加

でプロジェクトに、xcoファイルが追加できる。あとはダブルクリックで、Coregenが立ち上がるはず。

ちなみにISEのバージョンは9.1.03i
そのうちバージョンアップで直りそう。典型的BK

| | Comments (0) | TrackBack (0)