2016-08-23 4 views
0

Я пытаюсь понять, как работает стробирование часов в дизайне RTL.Как работает синхронизация часов в RTL-дизайне?

Я пример волны здесь:

enter image description here

Описание:

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.

Возможно, мне недостает принципиальной схемы цифрового дизайна уровня ядра. Я действительно буду помогать.

Обновлено волна: enter image description here

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 отключен.

+1

Можете ли вы поделиться фрагментом кода для поколения 'gated_clock'? –

+0

будут полезны осциллограммы 'in_val',' in_valid', 'in_ready' и' some_val' с часами 'gated_clock' (вместе с тем, что вы ожидаете увидеть). – dave

ответ

1

Возможно, произошел сбой на закрытых часах, которые не отображаются на форме волны. Вам нужно посмотреть руководство пользователя используемого инструмента, чтобы узнать, как записывать и отображать сбои. Это также может помочь увидеть логику синхронизации часов. Назначен ли clock_enable с использованием NBA (< =)?

+0

Да, clock_enable выходит с флопа. – newbie

1

Ваше понимание : не работает. in_val здесь не синхронизируется (на самом деле, из фрагмента, я не вижу, откуда он). Он может изменяться по желанию (опять же, с точки зрения этого фрагмента). В тот момент, когда gated_clock идет высоко, независимо от того, что значение in_val в это время теперь будет снято в some_val, и оно будет доступно до тех пор, пока gated_clock снова не достигнет высоты (в этот момент мы попробуем новое значение).

+0

Привет, Дейв, я добавил еще одну волну. Не могли бы вы взглянуть? – newbie

+0

@newbie: эти волны подтверждают то, что я ожидал, и мой ответ стоит. Если вы не понимаете этого, попросите разъяснений. Но сначала прочитайте его несколько раз. Я все еще не уверен, что вы ожидаете увидеть вместо этого. – dave

+0

Привет, Дейв, приложите свои отзывы. Я не был уверен, почему мы выкладываем значение сигнала some_val из цикла0 (новая волна), даже если по краю pos закрытых часов в цикле 0 равен нулю. Я думаю, что мне не хватает понимания того, как работает FF. Мое предположение состояло в том, чтобы пропустить some_val из цикла0, posedge of gated_clock также должен быть высоким в cycle0 (не в цикле 1). – newbie

0

Основываясь на новой форме волны some_val, генерируется правильно для опубликованного RTL.На самом первом краю gated_clock сигналы in_valid и in_ready оба являются высокими, таким образом, some_val тоже будет в этом цикле. На следующем краю он переключается обратно на низкий, потому что in_valid идет низко (и btw in_val тоже)

Смежные вопросы