RTL デザインでクロック ゲーティングがどのように機能するかを理解しようとしています。
ここに波の例があります:
説明:
1st signal is gated_clock
2nd signal is clock_enable
3rd signal is ungated_clock
したがって、この波には 3 つのサイクルがあります (サイクル 0、1、2 としましょう)。サイクル 0 では、clock_enable がローで、gated_clock がオフになりました。サイクル 1 で clock_enable が High になり、次のサイクル (サイクル 2) で gated_clock がオンになります。
ここで、シミュレーション中に、サイクル 1 で受信された入力データが、クロックによって (gated_clock を使用して) ゲートされるモジュールに正しく登録されている場合がいくつか見られます。私にはちょっと奇妙で、どうしてそれが可能なのかよくわかりません。
ロジックは次のようになります。
always_ff @(posedge gated_clock, negedge reset) begin
if (~reset) begin
some_val <= 1'b0;
end else begin
if (in_valid==1'b1 && in_ready==1'b1) begin
some_val <= in_val;
end else begin
some_val <= 1'b0;
end
end
end
したがって、 ifin_valid
とin_ready
was high in cycle 1
thensome_val
が着信in_val
データを登録し、 で利用できるようになることがわかりましたcycle 2
。しかし、cycle 1
ではgated_clock
ゼロでした。では、in_val はどのようにここでサンプリングされたのでしょうか? 私の理解では、gated_clock
フロップin_val
でcycle 1
.
コア回路レベルのデジタル設計コンセプトが欠けている可能性があります。どんな助けでも本当に感謝します。
1st signal is gated_clock
2nd signal is clock_enable
3rd signal is ungated_clock
4th signal is in_valid
5th signal is in_ready
6th signal is in_val
7th signal is some_val
ここではcycle 0
、gated_clock
がオフですがin_val
、in_ready
が高いことがわかります。入力データin_val
も高いです。次のサイクルsome_val
でハイになります。in_val
だから、オフなのに取り込まれたcycle 0
ように見えgated_clock
ます。