Каков смысл не сбрасывать регистр в сбросе в сознании блока Always_ff?
Каковы последствия не сброса флопа внутри блока alaways_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 с небольшим опытом в sylthesis. Итак, я пытаюсь понять, почему пример 2 выше - плохая практика.
Одна очевидная проблема - сразу после сброса reg_b будет X в примере 2. Так что, если reg_b используется в любой логике управления, это может привести к ошибке в дизайне. Кроме этого, какие еще проблемы это может создать?
1 ответ
Я не думаю, что это приведет к какой-либо ошибке во время синтеза или PnR.
На огромных проектах я столкнулся с некоторыми ff, которые не были сброшены. Это может избежать некоторых ненужных ограничений на инструменты PnR.
Однако, как вы сказали, вы должны быть осторожны, чтобы не вводить ошибки, используя их до того, как они будут написаны, поскольку до этого момента это будет "X".