ひでみのアイデア帳 2020-07-14T06:31:50+09:00 urn:uuid:32c34578-c4da-8d90-5f18-1740239359ee 同期/非同期リセットでの生成回路の違い(5) urn:uuid:e7c4db5d-1ddd-4c63-8939-e257cc7a4e9a 同期/非同期リセットでの生成回路の違い(5)

結局、STAで問題なければよいのでどの記述でもいいわけなんだけど、他にいくつか試してみた。

信号名をRSTでないケース

ケース2と同じ記述でRST_NからRSTを削除したものです。

`default_nettype none
`timescale 1ns/1ps

module fftest5
(
    input wire DINX,
    input wire CLK,

    input wire DIN0,
    input wire DIN1,
    input wire DIN2,
    input wire DIN3,
    input wire DIN4,
    input wire DIN5,
    input wire DIN6,

    output reg DOUT
);

reg CLK_DINX;

always @(posedge CLK) begin
    CLK_DINX <= DINX;
end

always @(posedge CLK) begin
    if(!CLK_DINX) begin
        DOUT <= 0;
    end else begin
        DOUT <= DIN0 | (DIN1 & DIN2 & DIN3 & DIN4 & DIN5 & DIN6);
    end
end

endmodule

`default_nettype wire

結果はケース2と同じになりました。

0への初期化はリセットと認識されるんですかね?

三項演算子にしたケース

RST名前もなしに三項演算子で0に初期化するケースです。

`default_nettype none
`timescale 1ns/1ps

module fftest7
(
    input wire DINX,
    input wire CLK,

    input wire DIN0,
    input wire DIN1,
    input wire DIN2,
    input wire DIN3,
    input wire DIN4,
    input wire DIN5,
    input wire DIN6,

    output reg DOUT
);

reg CLK_DINX;

always @(posedge CLK) begin
    CLK_DINX <= DINX;
end

always @(posedge CLK) begin
    DOUT <= (!CLK_DINX)?0:(DIN0 | (DIN1 & DIN2 & DIN3 & DIN4 & DIN5 & DIN6));
end

endmodule

`default_nettype wire

この場合もケース2と同じ結果になった。

0への初期化はRSTとして認識するんですね。

論理に組み込んだケース

初期化するというよりかいネーブル信号に近い形にしたケースです。

`default_nettype none
`timescale 1ns/1ps

module fftest6
(
    input wire DINX,
    input wire CLK,

    input wire DIN0,
    input wire DIN1,
    input wire DIN2,
    input wire DIN3,
    input wire DIN4,
    input wire DIN5,
    input wire DIN6,

    output reg DOUT
);

reg CLK_DINX;

always @(posedge CLK) begin
    CLK_DINX <= DINX;
end

always @(posedge CLK) begin
    DOUT <= CLK_DINX & (DIN0 | (DIN1 & DIN2 & DIN3 & DIN4 & DIN5 & DIN6));
end

endmodule

`default_nettype wire

この場合は次のようになりました。

ケース2に比べてLUTが1個減り、つぎの構成になりました。

  • DINXのFF
  • DOUTのFF
  • (DIN1 & DIN2 & DIN3 & DIN4 & DIN5 & DIN6)のLUT
  • CLK_DINX & (DIN0 | 上記の信号)のLUT

だから、なんなのさぁと言われても何もないんですけどね。

]]>
2020-07-03T00:00:00+09:00 ひでみ hidemi@sweetcafe/jp <h1>同期/非同期リセットでの生成回路の違い(5)</h1> <p>結局、STAで問題なければよいのでどの記述でもいいわけなんだけど、他にいくつか試してみた。</p> <h2>信号名をRSTでないケース</h2> <p>ケース2と同じ記述で<code>RST_N</code>から<code>RST</code>を削除したものです。</p> <pre><code class="txt">`default_nettype none `timescale 1ns/1ps module fftest5 ( input wire DINX, input wire CLK, input wire DIN0, input wire DIN1, input wire DIN2, input wire DIN3, input wire DIN4, input wire DIN5, input wire DIN6, output reg DOUT ); reg CLK_DINX; always @(posedge CLK) begin CLK_DINX &lt;= DINX; end always @(posedge CLK) begin if(!CLK_DINX) begin DOUT &lt;= 0; end else begin DOUT &lt;= DIN0 | (DIN1 &amp; DIN2 &amp; DIN3 &amp; DIN4 &amp; DIN5 &amp; DIN6); end end endmodule `default_nettype wire</code></pre> <p>結果はケース2と同じになりました。</p> <p><code>0</code>への初期化はリセットと認識されるんですかね?</p> <h2>三項演算子にしたケース</h2> <p><code>RST</code>名前もなしに三項演算子で<code>0</code>に初期化するケースです。</p> <pre><code class="txt">`default_nettype none `timescale 1ns/1ps module fftest7 ( input wire DINX, input wire CLK, input wire DIN0, input wire DIN1, input wire DIN2, input wire DIN3, input wire DIN4, input wire DIN5, input wire DIN6, output reg DOUT ); reg CLK_DINX; always @(posedge CLK) begin CLK_DINX &lt;= DINX; end always @(posedge CLK) begin DOUT &lt;= (!CLK_DINX)?0:(DIN0 | (DIN1 &amp; DIN2 &amp; DIN3 &amp; DIN4 &amp; DIN5 &amp; DIN6)); end endmodule `default_nettype wire</code></pre> <p>この場合もケース2と同じ結果になった。</p> <p><code>0</code>への初期化は<code>RST</code>として認識するんですね。</p> <h2>論理に組み込んだケース</h2> <p>初期化するというよりかいネーブル信号に近い形にしたケースです。</p> <pre><code class="txt">`default_nettype none `timescale 1ns/1ps module fftest6 ( input wire DINX, input wire CLK, input wire DIN0, input wire DIN1, input wire DIN2, input wire DIN3, input wire DIN4, input wire DIN5, input wire DIN6, output reg DOUT ); reg CLK_DINX; always @(posedge CLK) begin CLK_DINX &lt;= DINX; end always @(posedge CLK) begin DOUT &lt;= CLK_DINX &amp; (DIN0 | (DIN1 &amp; DIN2 &amp; DIN3 &amp; DIN4 &amp; DIN5 &amp; DIN6)); end endmodule `default_nettype wire</code></pre> <p>この場合は次のようになりました。</p> <p><img src="./files/20200628_fftest07-01.png" alt="" /></p> <p>ケース2に比べてLUTが1個減り、つぎの構成になりました。</p> <ul> <li>DINXのFF</li> <li>DOUTのFF</li> <li>(DIN1 &amp; DIN2 &amp; DIN3 &amp; DIN4 &amp; DIN5 &amp; DIN6)のLUT</li> <li>CLK_DINX &amp; (DIN0 | 上記の信号)のLUT</li> </ul> <p>だから、なんなのさぁと言われても何もないんですけどね。</p>
同期/非同期リセットでの生成回路の違い(4) urn:uuid:7430c433-c1cb-c41b-af6d-eae2af0e2dd4 同期/非同期リセットでの生成回路の違い(4)

「同期/非同期リセットでの生成回路の違い(1)」の合成結果でつぎのようにでていました。

ケース0 ケース1 ケース2 ケース3 ケース4
同期/非同期 なし 非同期 同期 同期 非同期
LUT 2 3 3 3 3
FF 1 1 2 1 2
IO 9 10 10 10 10
BUFG 1 1 1 1 1

ケース3は同期リセット、ケース4は非同期リセットを想定して記述したものでしたが上記の結果からもケース3にはリセットのFFはなく、ケース4は明示的にFFを置いているのでリセットのFFが存在します。

ケース3は次のように構成されてほしかったのです。

ケース3の場合、記述は同期リセットのつもりなのに非同期リセットなのでRecovery TimeとRemoval Timeを考慮する必要があります。

同期リセットで表現したつもりが合成するとRecovery TimeとRemoval Timeが考慮され、動作周波数が低い合成結果か、または、できないかが発生するかもしれません。

ケース4は同期リセットのつもりだけど記述が非同期リセットっぽくなっているが同期リセットで合成されたのはある意味、棚から牡丹餅なのかもしれません。

太古の昔の言い伝えは今、どうなっているか確認するつもりでしたがもう言い伝えは今の時代には通用しなく、新しい問題が発生しているということがわかりました。

XilinxのツールはRSTの名称がついているとリセット信号として通常の信号とは違う扱いにするようです。

ただ、配置配線もリセットにFFがあるので同期リセットっぽい、FFが無いので非同期リセットっぽいのはCellの設定を見ても判断を付けにくい。

ただ、これらの状況から言えるのはケース2やケース4のようにリセットはFFで叩いてから使うのが良いだろう。

そして、ツールを信用するしかない・・・

BUFGが余っているなら次のようにRSTを2段FFでメタス回避してBUFGを使用して各FFをリセットするのが良いだろう。

]]>
2020-07-02T00:00:00+09:00 ひでみ hidemi@sweetcafe/jp <h1>同期/非同期リセットでの生成回路の違い(4)</h1> <p>「同期/非同期リセットでの生成回路の違い(1)」の合成結果でつぎのようにでていました。</p> <table> <thead> <tr> <th></th> <th style="text-align: right;">ケース0</th> <th style="text-align: right;">ケース1</th> <th style="text-align: right;">ケース2</th> <th style="text-align: right;">ケース3</th> <th style="text-align: right;">ケース4</th> </tr> </thead> <tbody> <tr> <td>同期/非同期</td> <td style="text-align: right;">なし</td> <td style="text-align: right;">非同期</td> <td style="text-align: right;">同期</td> <td style="text-align: right;">同期</td> <td style="text-align: right;">非同期</td> </tr> <tr> <td>LUT</td> <td style="text-align: right;">2</td> <td style="text-align: right;">3</td> <td style="text-align: right;">3</td> <td style="text-align: right;">3</td> <td style="text-align: right;">3</td> </tr> <tr> <td>FF</td> <td style="text-align: right;">1</td> <td style="text-align: right;">1</td> <td style="text-align: right;">2</td> <td style="text-align: right;">1</td> <td style="text-align: right;">2</td> </tr> <tr> <td>IO</td> <td style="text-align: right;">9</td> <td style="text-align: right;">10</td> <td style="text-align: right;">10</td> <td style="text-align: right;">10</td> <td style="text-align: right;">10</td> </tr> <tr> <td>BUFG</td> <td style="text-align: right;">1</td> <td style="text-align: right;">1</td> <td style="text-align: right;">1</td> <td style="text-align: right;">1</td> <td style="text-align: right;">1</td> </tr> </tbody> </table> <p>ケース3は同期リセット、ケース4は非同期リセットを想定して記述したものでしたが上記の結果からもケース3にはリセットのFFはなく、ケース4は明示的にFFを置いているのでリセットのFFが存在します。</p> <p>ケース3は次のように構成されてほしかったのです。</p> <p><img src="./files/20200627-DFF2.png" alt="" /></p> <p>ケース3の場合、記述は同期リセットのつもりなのに非同期リセットなのでRecovery TimeとRemoval Timeを考慮する必要があります。</p> <p>同期リセットで表現したつもりが合成するとRecovery TimeとRemoval Timeが考慮され、動作周波数が低い合成結果か、または、できないかが発生するかもしれません。</p> <p>ケース4は同期リセットのつもりだけど記述が非同期リセットっぽくなっているが同期リセットで合成されたのはある意味、棚から牡丹餅なのかもしれません。</p> <p>太古の昔の言い伝えは今、どうなっているか確認するつもりでしたがもう言い伝えは今の時代には通用しなく、新しい問題が発生しているということがわかりました。</p> <p>Xilinxのツールは<code>RST</code>の名称がついているとリセット信号として通常の信号とは違う扱いにするようです。</p> <p>ただ、配置配線もリセットにFFがあるので同期リセットっぽい、FFが無いので非同期リセットっぽいのはCellの設定を見ても判断を付けにくい。</p> <p>ただ、これらの状況から言えるのはケース2やケース4のようにリセットはFFで叩いてから使うのが良いだろう。</p> <p>そして、ツールを信用するしかない・・・</p> <p>BUFGが余っているなら次のように<code>RST</code>を2段FFでメタス回避してBUFGを使用して各FFをリセットするのが良いだろう。</p> <p><img src="./files/20200627-DFF3.png" alt="" /></p>
同期/非同期リセットでの生成回路の違い(3) urn:uuid:8d8382a2-d6bd-084f-266d-b592188ce0cb 同期/非同期リセットでの生成回路の違い(3)

次に実際の合成結果を配置の観点から見てみます

ケース0

ケース0の場合、リセットがないので綺麗に1つのCLKで2つのLUTが使われました。

ケース1

ケース1の場合は次のように配置されました。

まずは全体は2つのCLBに別れました。

下側が6つのANDのLUT、上側がリセットとORのLUTです。

ケース2

ケース2も2つのCLBに配置されましたがケース1のように離れた場所ではなく近接のCLBで配置されました。

ケース3

ケース3はケース1と同じように配置されました。

ケース4

ケース4はケース2と同じように配置されました。

よくみると

配置結果を見てみると、ケース3は非同期リセットでケース4は同期リセットになっていました。

]]>
2020-07-01T00:00:00+09:00 ひでみ hidemi@sweetcafe/jp <h1>同期/非同期リセットでの生成回路の違い(3)</h1> <p>次に実際の合成結果を配置の観点から見てみます</p> <h2>ケース0</h2> <p>ケース0の場合、リセットがないので綺麗に1つのCLKで2つのLUTが使われました。</p> <p><img src="./files/fftest0-0.png" alt="" /></p> <h2>ケース1</h2> <p>ケース1の場合は次のように配置されました。</p> <p>まずは全体は2つのCLBに別れました。</p> <p>下側が6つのANDのLUT、上側がリセットとORのLUTです。</p> <p><img src="./files/fftest1-0.png" alt="" /> <img src="./files/fftest1-1.png" alt="" /> <img src="./files/fftest1-2.png" alt="" /></p> <h2>ケース2</h2> <p>ケース2も2つのCLBに配置されましたがケース1のように離れた場所ではなく近接のCLBで配置されました。</p> <p><img src="./files/fftest2-0.png" alt="" /> <img src="./files/fftest2-1.png" alt="" /> <img src="./files/fftest2-2.png" alt="" /></p> <h2>ケース3</h2> <p>ケース3はケース1と同じように配置されました。</p> <p><img src="./files/fftest3-0.png" alt="" /> <img src="./files/fftest3-1.png" alt="" /> <img src="./files/fftest3-2.png" alt="" /></p> <h2>ケース4</h2> <p>ケース4はケース2と同じように配置されました。</p> <p><img src="./files/fftest4-0.png" alt="" /> <img src="./files/fftest4-1.png" alt="" /> <img src="./files/fftest4-2.png" alt="" /></p> <h2>よくみると</h2> <p>配置結果を見てみると、ケース3は非同期リセットでケース4は同期リセットになっていました。</p>
同期/非同期リセットでの生成回路の違い(2) urn:uuid:8f7b46b3-bb94-02b7-bea7-bf9306de4675 同期/非同期リセットでの生成回路の違い(2)

同期/非同期を表現する上で次のようにD-FFを用いて解説することが一般的です。

非同期リセット

私自身は次の表現をされているものは全て非同期リセットという認識です。

非同期リセットとはCLKRSTが動悸していないことを指します。

上図の場合、CLKRSTが同期しているのは合成ツールしか知りえません。

つまり、CLKRSTの同期は保証されていません。

同期リセット

それでは同期リセットをどう表現するかというと、私の場合は下図が唯一、同期リセットを認識します。

これはRSTが組み合わせ回路に含まれ、この場合、RSTは必ずCLKに同期します。

もはや、RSTというよりか機能を初期化するための信号になります。

Recovery TimeとRemoval Time

Recovery TimeとRemoval Timeはいわば、Setup TimeとHold Timeに近いものです。

リセットではこの2つのタイミングを考慮します。

このタイミングが全てのFFで同じでないとリセットタイミングのズレが発生します。

非同期リセットはこの2つのタイミングに注意しなければいけません。

]]>
2020-06-30T00:00:00+09:00 ひでみ hidemi@sweetcafe/jp <h1>同期/非同期リセットでの生成回路の違い(2)</h1> <p>同期/非同期を表現する上で次のようにD-FFを用いて解説することが一般的です。</p> <p><img src="./files/20200627-DFF0.png" alt="" /></p> <h2>非同期リセット</h2> <p>私自身は次の表現をされているものは全て非同期リセットという認識です。</p> <p><img src="./files/20200627-DFF1.png" alt="" /></p> <p>非同期リセットとは<code>CLK</code>と<code>RST</code>が動悸していないことを指します。</p> <p>上図の場合、<code>CLK</code>と<code>RST</code>が同期しているのは合成ツールしか知りえません。</p> <p>つまり、<code>CLK</code>と<code>RST</code>の同期は保証されていません。</p> <h2>同期リセット</h2> <p>それでは同期リセットをどう表現するかというと、私の場合は下図が唯一、同期リセットを認識します。</p> <p><img src="./files/20200627-DFF2.png" alt="" /></p> <p>これは<code>RST</code>が組み合わせ回路に含まれ、この場合、<code>RST</code>は必ず<code>CLK</code>に同期します。</p> <p>もはや、<code>RST</code>というよりか機能を初期化するための信号になります。</p> <h2>Recovery TimeとRemoval Time</h2> <p>Recovery TimeとRemoval Timeはいわば、Setup TimeとHold Timeに近いものです。</p> <p>リセットではこの2つのタイミングを考慮します。</p> <p>このタイミングが全てのFFで同じでないとリセットタイミングのズレが発生します。</p> <p>非同期リセットはこの2つのタイミングに注意しなければいけません。</p>
同期/非同期リセットでの生成回路の違い(1) urn:uuid:53ef2aa1-3bef-c239-a6c9-9ae3866f2833 同期/非同期リセットでの生成回路の違い(1)

同期リセット、非同期リセットについては太古の昔に次のように定義されていた。

  • Alteraは非同期リセット推奨
  • Xilinxは同期リセット推奨

とくにXilinxは同期リセットのほうが合成に都合がいいとされていた。

それで、今現状はどうなんだろう?と試してみることにした。

対象のRTL

対象のコードは次のように7入力で6つのANDと1つのORを1出力する回路です。

    DOUT <= DIN0 | (DIN1 & DIN2 & DIN3 & DIN4 & DIN5 & DIN6);

このコードで試しているのはXilinxのUltraScale+で合成をかけているからです。

UltraScale+は6入力LUTなので6つのANDで1つのLUTが使われますが他の1つのORとリセットがどうなるか?というところが確認ポイントです。

次の5つのケースを試してみました。

  • ケース0:リセットなし
  • ケース1:非同期リセット
  • ケース2:同期リセット
  • ケース3:同期リセット
  • ケース4:非同期リセット

ケース0のRTL

このケースはリセットされない回路です。

I/Oは直接ピンに接続します。

`default_nettype none
`timescale 1ns/1ps

module fftest0
(
    input wire RST_N,
    input wire CLK,

    input wire DIN0,
    input wire DIN1,
    input wire DIN2,
    input wire DIN3,
    input wire DIN4,
    input wire DIN5,
    input wire DIN6,

    output reg DOUT
);

always @(posedge CLK) begin
    DOUT <= DIN0 | (DIN1 & DIN2 & DIN3 & DIN4 & DIN5 & DIN6);
end

endmodule

`default_nettype wire

このケースはリセットがないので単純にLUTが2つ使われて構成されるはずです。

![]()

ケース1のRTL

ケース1は非同期リセットです。

`default_nettype none
`timescale 1ns/1ps

module fftest1
(
    input wire RST_N,
    input wire CLK,

    input wire DIN0,
    input wire DIN1,
    input wire DIN2,
    input wire DIN3,
    input wire DIN4,
    input wire DIN5,
    input wire DIN6,

    output reg DOUT
);

always @(posedge CLK or negedge RST_N) begin
    if(!RST_N) begin
        DOUT <= 0;
    end else begin
        DOUT <= DIN0 | (DIN1 & DIN2 & DIN3 & DIN4 & DIN5 & DIN6);
    end
end

endmodule

`default_nettype wire

記述上はCLKRST_Nの変化点で回路が動くように作ったものです。

![]()

ケース2のRTL

ケース2は同期リセットです。

`default_nettype none
`timescale 1ns/1ps

module fftest2
(
    input wire RST_N,
    input wire CLK,

    input wire DIN0,
    input wire DIN1,
    input wire DIN2,
    input wire DIN3,
    input wire DIN4,
    input wire DIN5,
    input wire DIN6,

    output reg DOUT
);

reg CLK_RST_N;

always @(posedge CLK) begin
    CLK_RST_N <= RST_N;
end

always @(posedge CLK) begin
    if(!CLK_RST_N) begin
        DOUT <= 0;
    end else begin
        DOUT <= DIN0 | (DIN1 & DIN2 & DIN3 & DIN4 & DIN5 & DIN6);
    end
end

endmodule

`default_nettype wire

入力したRST_Nを明示的にCLKで叩き直して回路に適用しています。

![]()

ケース3のRTL

ケース3も同期リセットです。

`default_nettype none
`timescale 1ns/1ps

module fftest3
(
    input wire RST_N,
    input wire CLK,

    input wire DIN0,
    input wire DIN1,
    input wire DIN2,
    input wire DIN3,
    input wire DIN4,
    input wire DIN5,
    input wire DIN6,

    output reg DOUT
);

always @(posedge CLK) begin
    if(!RST_N) begin
        DOUT <= 0;
    end else begin
        DOUT <= DIN0 | (DIN1 & DIN2 & DIN3 & DIN4 & DIN5 & DIN6);
    end
end

endmodule

`default_nettype wire

ケース2と違うところはRST_Nを明示的にCLKで叩いていないところです。

しかし、回路はCLKの変化点でのみ動作するので同期リセット回路を想定した記述です。

ケース4のRTL

ケース4は非同期リセットです。

`default_nettype none
`timescale 1ns/1ps

module fftest4
(
    input wire RST_N,
    input wire CLK,

    input wire DIN0,
    input wire DIN1,
    input wire DIN2,
    input wire DIN3,
    input wire DIN4,
    input wire DIN5,
    input wire DIN6,

    output reg DOUT
);

reg CLK_RST_N;
always @(posedge CLK) begin
    CLK_RST_N <= RST_N;
end

always @(posedge CLK or negedge CLK_RST_N) begin
    if(!CLK_RST_N) begin
        DOUT <= 0;
    end else begin
        DOUT <= DIN0 | (DIN1 & DIN2 & DIN3 & DIN4 & DIN5 & DIN6);
    end
end

endmodule

`default_nettype wire

RST_NCLKで叩き直しているので同期リセットのように見えますが回路はCLK_RST_Nの変化点でリセットされるように記述しているので同期リセットに見せかけた非同期リセットが想定です。

配置配線結果

配置配線の結果は次のようになりました。

ケース0 ケース1 ケース2 ケース3 ケース4
同期/非同期 なし 非同期 同期 同期 非同期
LUT 2 3 3 3 3
FF 1 1 2 1 2
IO 9 10 10 10 10
BUFG 1 1 1 1 1

I/Oはリセットなし以外は10本なので間違いありません。

LUTはケース1〜ケース4で変わりません。

FFはケース1とケース3が1個でケース2とケース4が2個です。

FFが1個のときはDOUTのFFのみ構成されています。

FFが2個のときはDOUTRST_NのFFが構成されて2個になっています。

]]>
2020-06-29T00:00:00+09:00 ひでみ hidemi@sweetcafe/jp <h1>同期/非同期リセットでの生成回路の違い(1)</h1> <p>同期リセット、非同期リセットについては太古の昔に次のように定義されていた。</p> <ul> <li>Alteraは非同期リセット推奨</li> <li>Xilinxは同期リセット推奨</li> </ul> <p>とくにXilinxは同期リセットのほうが合成に都合がいいとされていた。</p> <p>それで、今現状はどうなんだろう?と試してみることにした。</p> <h2>対象のRTL</h2> <p>対象のコードは次のように7入力で6つのANDと1つのORを1出力する回路です。</p> <pre><code class="txt"> DOUT &lt;= DIN0 | (DIN1 &amp; DIN2 &amp; DIN3 &amp; DIN4 &amp; DIN5 &amp; DIN6);</code></pre> <p>このコードで試しているのはXilinxのUltraScale+で合成をかけているからです。</p> <p>UltraScale+は6入力LUTなので6つのANDで1つのLUTが使われますが他の1つのORとリセットがどうなるか?というところが確認ポイントです。</p> <p>次の5つのケースを試してみました。</p> <ul> <li>ケース0:リセットなし</li> <li>ケース1:非同期リセット</li> <li>ケース2:同期リセット</li> <li>ケース3:同期リセット</li> <li>ケース4:非同期リセット</li> </ul> <h3>ケース0のRTL</h3> <p>このケースはリセットされない回路です。</p> <p>I/Oは直接ピンに接続します。</p> <pre><code class="txt">`default_nettype none `timescale 1ns/1ps module fftest0 ( input wire RST_N, input wire CLK, input wire DIN0, input wire DIN1, input wire DIN2, input wire DIN3, input wire DIN4, input wire DIN5, input wire DIN6, output reg DOUT ); always @(posedge CLK) begin DOUT &lt;= DIN0 | (DIN1 &amp; DIN2 &amp; DIN3 &amp; DIN4 &amp; DIN5 &amp; DIN6); end endmodule `default_nettype wire</code></pre> <p>このケースはリセットがないので単純にLUTが2つ使われて構成されるはずです。</p> <p>![]()</p> <h3>ケース1のRTL</h3> <p>ケース1は非同期リセットです。</p> <pre><code class="txt">`default_nettype none `timescale 1ns/1ps module fftest1 ( input wire RST_N, input wire CLK, input wire DIN0, input wire DIN1, input wire DIN2, input wire DIN3, input wire DIN4, input wire DIN5, input wire DIN6, output reg DOUT ); always @(posedge CLK or negedge RST_N) begin if(!RST_N) begin DOUT &lt;= 0; end else begin DOUT &lt;= DIN0 | (DIN1 &amp; DIN2 &amp; DIN3 &amp; DIN4 &amp; DIN5 &amp; DIN6); end end endmodule `default_nettype wire</code></pre> <p>記述上は<code>CLK</code>と<code>RST_N</code>の変化点で回路が動くように作ったものです。</p> <p>![]()</p> <h3>ケース2のRTL</h3> <p>ケース2は同期リセットです。</p> <pre><code class="txt">`default_nettype none `timescale 1ns/1ps module fftest2 ( input wire RST_N, input wire CLK, input wire DIN0, input wire DIN1, input wire DIN2, input wire DIN3, input wire DIN4, input wire DIN5, input wire DIN6, output reg DOUT ); reg CLK_RST_N; always @(posedge CLK) begin CLK_RST_N &lt;= RST_N; end always @(posedge CLK) begin if(!CLK_RST_N) begin DOUT &lt;= 0; end else begin DOUT &lt;= DIN0 | (DIN1 &amp; DIN2 &amp; DIN3 &amp; DIN4 &amp; DIN5 &amp; DIN6); end end endmodule `default_nettype wire</code></pre> <p>入力した<code>RST_N</code>を明示的に<code>CLK</code>で叩き直して回路に適用しています。</p> <p>![]()</p> <h3>ケース3のRTL</h3> <p>ケース3も同期リセットです。</p> <pre><code class="txt">`default_nettype none `timescale 1ns/1ps module fftest3 ( input wire RST_N, input wire CLK, input wire DIN0, input wire DIN1, input wire DIN2, input wire DIN3, input wire DIN4, input wire DIN5, input wire DIN6, output reg DOUT ); always @(posedge CLK) begin if(!RST_N) begin DOUT &lt;= 0; end else begin DOUT &lt;= DIN0 | (DIN1 &amp; DIN2 &amp; DIN3 &amp; DIN4 &amp; DIN5 &amp; DIN6); end end endmodule `default_nettype wire</code></pre> <p>ケース2と違うところは<code>RST_N</code>を明示的に<code>CLK</code>で叩いていないところです。</p> <p>しかし、回路は<code>CLK</code>の変化点でのみ動作するので同期リセット回路を想定した記述です。</p> <h3>ケース4のRTL</h3> <p>ケース4は非同期リセットです。</p> <pre><code class="txt">`default_nettype none `timescale 1ns/1ps module fftest4 ( input wire RST_N, input wire CLK, input wire DIN0, input wire DIN1, input wire DIN2, input wire DIN3, input wire DIN4, input wire DIN5, input wire DIN6, output reg DOUT ); reg CLK_RST_N; always @(posedge CLK) begin CLK_RST_N &lt;= RST_N; end always @(posedge CLK or negedge CLK_RST_N) begin if(!CLK_RST_N) begin DOUT &lt;= 0; end else begin DOUT &lt;= DIN0 | (DIN1 &amp; DIN2 &amp; DIN3 &amp; DIN4 &amp; DIN5 &amp; DIN6); end end endmodule `default_nettype wire</code></pre> <p><code>RST_N</code>を<code>CLK</code>で叩き直しているので同期リセットのように見えますが回路は<code>CLK_RST_N</code>の変化点でリセットされるように記述しているので同期リセットに見せかけた非同期リセットが想定です。</p> <h2>配置配線結果</h2> <p>配置配線の結果は次のようになりました。</p> <table> <thead> <tr> <th></th> <th style="text-align: right;">ケース0</th> <th style="text-align: right;">ケース1</th> <th style="text-align: right;">ケース2</th> <th style="text-align: right;">ケース3</th> <th style="text-align: right;">ケース4</th> </tr> </thead> <tbody> <tr> <td>同期/非同期</td> <td style="text-align: right;">なし</td> <td style="text-align: right;">非同期</td> <td style="text-align: right;">同期</td> <td style="text-align: right;">同期</td> <td style="text-align: right;">非同期</td> </tr> <tr> <td>LUT</td> <td style="text-align: right;">2</td> <td style="text-align: right;">3</td> <td style="text-align: right;">3</td> <td style="text-align: right;">3</td> <td style="text-align: right;">3</td> </tr> <tr> <td>FF</td> <td style="text-align: right;">1</td> <td style="text-align: right;">1</td> <td style="text-align: right;">2</td> <td style="text-align: right;">1</td> <td style="text-align: right;">2</td> </tr> <tr> <td>IO</td> <td style="text-align: right;">9</td> <td style="text-align: right;">10</td> <td style="text-align: right;">10</td> <td style="text-align: right;">10</td> <td style="text-align: right;">10</td> </tr> <tr> <td>BUFG</td> <td style="text-align: right;">1</td> <td style="text-align: right;">1</td> <td style="text-align: right;">1</td> <td style="text-align: right;">1</td> <td style="text-align: right;">1</td> </tr> </tbody> </table> <p>I/Oはリセットなし以外は10本なので間違いありません。</p> <p>LUTはケース1〜ケース4で変わりません。</p> <p>FFはケース1とケース3が1個でケース2とケース4が2個です。</p> <p>FFが1個のときは<code>DOUT</code>のFFのみ構成されています。</p> <p>FFが2個のときは<code>DOUT</code>と<code>RST_N</code>のFFが構成されて2個になっています。</p>