Я пытаюсь понять, как работает стробирование часов в дизайне RTL.Как работает синхронизация часов в 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 идет высоко, а в следующем цикле (цикл 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
Так что я вижу, что если in_valid
и in_ready
был высоким в cycle 1
тогда some_val
будет регистрировать входящие in_val
данные, и он будет доступен в cycle 2
. Однако в cycle 1
, gated_clock
был равен нулю. Итак, как здесь был получен выборку in_val? Из того, что я понимаю, posedge gated_clock
должно быть 1, если мы хотим на флопе 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
отключен.
Можете ли вы поделиться фрагментом кода для поколения 'gated_clock'? –
будут полезны осциллограммы 'in_val',' in_valid', 'in_ready' и' some_val' с часами 'gated_clock' (вместе с тем, что вы ожидаете увидеть). – dave