リセット対応 always_ff ブロック内でフロップをリセットしないとどうなりますか?
例 1:
always_ff @(posedge clk, negedge rst) begin
if (~rst) begin
reg_a <='0;
reg_b <='0;
end else begin
if (condition_1) begin
reg_a <= some_signal;
end else if (condition_2) begin
reg_b <= some signal;
end
end
end
例 2:
always_ff @(posedge clk, negedge rst) begin
if (~rst) begin
reg_a <='0;
end else begin
if (condition_1) begin
reg_a <= some_signal;
end else if (condition_2) begin
reg_b <= some signal;
end
end
end
例 1 と 2 の唯一の違いは、例 2 では reg_b にリセット条件がないことです。バックエンド/合成におけるこの間違いの結果はどうなりますか? 私は、シンセシスの経験がほとんどないフロントエンド RTL 設計のバックグラウンドを持っています。したがって、上記の例 2 が悪い習慣である理由を理解しようとしています。
明らかな問題の 1 つは、リセット直後に例 2 の reg_b が X になることです。したがって、reg_b が制御ロジックで使用されている場合、設計にバグが発生する可能性があります。これ以外に、これによってどのような問題が発生する可能性がありますか?