Jump to content
    

Как в симуляторе проверить тишину на линии?

Допустим, ко входу модуля, который играет роль внешнего (по отношению к ПЛИС) окружения в тестбенче, подключена линия. И после прихода фронта по этой линии модуль должен определить, что в течение N наносекунд логическое состояние на этой линии больше не изменялось. Технически, наверное, можно сделать цикл внутри always с паузами в 1нс и проверкой "что там с состоянием?". Но это выглядит весьма костылеподобно. Раз уж в SystemVerilog есть отдельные циклы foreach и repeat, то и тут, кажется, должно быть элегантное, надёжное и простое решение. Оно есть?

Share this post


Link to post
Share on other sites

On 8/18/2022 at 4:12 PM, flammmable said:

Допустим, ко входу модуля, который играет роль внешнего (по отношению к ПЛИС) окружения в тестбенче, подключена линия. И после прихода фронта по этой линии модуль должен определить, что в течение N наносекунд логическое состояние на этой линии больше не изменялось. Технически, наверное, можно сделать цикл внутри always с паузами в 1нс и проверкой "что там с состоянием?". Но это выглядит весьма костылеподобно. Раз уж в SystemVerilog есть отдельные циклы foreach и repeat, то и тут, кажется, должно быть элегантное, надёжное и простое решение. Оно есть?

Люди посоветовали использовать fork/join_any. Пойду пробовать.

<через некоторое время>


Нет, fork/join_any - это те же яйца, только в профиль. Оно не отреагирует на бесконечно малый импульс.

 

Есть мысль насчёт чего-то вроде такого:

...
input x_in
...
parameter DETECTION_WAIT = 1000;
reg x_in_fix;

always @(x_in) begin
  x_in_fix <= x_in;
  #(DETECTION_WAIT) 
  x_in_fix <= x_in; //на этом месте - любая пустышка, только чтобы данный always подержать на время DETECTION_WAIT
end
  
always @(x_in ^ x_in_fix) begin
  $display("catched!!");
end

То есть заXORить вход с копией самого себя, причём копию "замораживать" после фронта на заданное время. Но как-то уж больно много слов. Неужели в симуляции SystemVerilog нет более изящного способа выразить относительно простую мысль: "следи за фронтом N времени, а потом - не следи"?

Share this post


Link to post
Share on other sites

для таких проверок в SV есть assertions 

целая глава в стандарте и отдельные книжки про это

Share this post


Link to post
Share on other sites

16.9.3 Sampled value functions  $stable/$changed и т.д. но не в любом симуляторе сработает. 

14 hours ago, flammmable said:

Есть мысль насчёт чего-то вроде такого:

То есть заXORить вход с копией самого себя, причём копию "замораживать" после фронта на заданное время. Но как-то уж больно много слов. Неужели в симуляции SystemVerilog нет более изящного способа выразить относительно простую мысль: "следи за фронтом N времени, а потом - не следи"?

а обычное ожидание  @(x_in) или wait(x_in) не подходит? в том же fork/join_xxx? 

Share this post


Link to post
Share on other sites

19 hours ago, flammmable said:

Нет, fork/join_any - это те же яйца, только в профиль. Оно не отреагирует на бесконечно малый импульс.

скорее яйца тут  другому мешают ... 
сим это не аналоговая система, оператор @... реагирует на изменения сигнала  не на  длительность этого изменения. 
А конструкция с fork join в примере к ловле событий отношения прямого не имеет, она лишь избавляет вас от "ручного" контроля времени, так как ожидание изменения сигнала и контроль времени этого ожидания работают параллельно в разных потоках.     

P.S.  Пример вполне рабочий и делает то что вы и просили  "следи за фронтом N времени, а потом - не следи"

Share this post


Link to post
Share on other sites

On 8/19/2022 at 8:10 AM, des00 said:

16.9.3 Sampled value functions  $stable/$changed и т.д. но не в любом симуляторе сработает. 

а обычное ожидание  @(x_in) или wait(x_in) не подходит? в том же fork/join_xxx? 

Смотрю сейчас как сделано у Микрона в его модели SDRAM. Там сначала в переменной фиксируется время, а потом дельта между текущим и зафиксированным временем сравнивается с временным параметром. Типа того:

RFC_chk = $time;
...
if($time - RFC_chk < tRFC) begin
  $display("не соблюдён временной параметр tRFC (но только по-английски)!!111");
end

Но это как-то наколеночно всё.

 

Я почитал про утверждения в SystemVerilog. Там в property всегда фигурирует тактовый сигнал.

property delay_in_clocks
  @(posedge clk) a ##100500 b
endproperty
  
delay_chk: assert property(delay_in_clocks);

То есть всё равно получается квантование по времени, а внутри квантов - что угодно. В VHDL вроде бы есть "wait for (...) until (...)". Но в SVA, как я понимаю, решили провести четкую грань с надписью "здесь тебе не анализ времянок, у нас всё синхронно, пшол прочь". Если так, то это несколько печально. 

 

<через некоторое время>

 

Вот здесь приводят пару любопытных примеров.

 

 

Share this post


Link to post
Share on other sites

2 hours ago, flammmable said:

Но это как-то наколеночно всё.

это как раз нормально, посмотрите модели qdr памяти, там аще жестко, но верно прописаны времянки) 

2 hours ago, flammmable said:

Я почитал про утверждения в SystemVerilog. Там в property всегда фигурирует тактовый сигнал.

да, как-то забыл про это. Вам тогда в асинхронные проверки из почти забытой писателями секции верилога, для моделирования проводной логики и нетлистов, те самые $skew $timeskew $fullskew $period $width $nochange и т.д.

 

Share this post


Link to post
Share on other sites

On 8/18/2022 at 5:57 PM, flammmable said:

 


Нет, fork/join_any - это те же яйца, только в профиль. Оно не отреагирует на бесконечно малый импульс.

 

Ээ.. А что это за бесконечно малый импульс?.. 
В Verilolog есть директива шага времени timescale
..и меньше 1fs там никогда не будет

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...