flammmable 4 August 18, 2022 Posted August 18, 2022 · Report post Допустим, ко входу модуля, который играет роль внешнего (по отношению к ПЛИС) окружения в тестбенче, подключена линия. И после прихода фронта по этой линии модуль должен определить, что в течение N наносекунд логическое состояние на этой линии больше не изменялось. Технически, наверное, можно сделать цикл внутри always с паузами в 1нс и проверкой "что там с состоянием?". Но это выглядит весьма костылеподобно. Раз уж в SystemVerilog есть отдельные циклы foreach и repeat, то и тут, кажется, должно быть элегантное, надёжное и простое решение. Оно есть? Quote Share this post Link to post Share on other sites More sharing options...
flammmable 4 August 18, 2022 Posted August 18, 2022 · Report post 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 времени, а потом - не следи"? Quote Share this post Link to post Share on other sites More sharing options...
yes 23 August 18, 2022 Posted August 18, 2022 · Report post для таких проверок в SV есть assertions целая глава в стандарте и отдельные книжки про это Quote Share this post Link to post Share on other sites More sharing options...
des00 27 August 19, 2022 Posted August 19, 2022 · Report post 16.9.3 Sampled value functions $stable/$changed и т.д. но не в любом симуляторе сработает. 14 hours ago, flammmable said: Есть мысль насчёт чего-то вроде такого: То есть заXORить вход с копией самого себя, причём копию "замораживать" после фронта на заданное время. Но как-то уж больно много слов. Неужели в симуляции SystemVerilog нет более изящного способа выразить относительно простую мысль: "следи за фронтом N времени, а потом - не следи"? а обычное ожидание @(x_in) или wait(x_in) не подходит? в том же fork/join_xxx? Quote Share this post Link to post Share on other sites More sharing options...
RobFPGA 105 August 19, 2022 Posted August 19, 2022 · Report post 19 hours ago, flammmable said: Нет, fork/join_any - это те же яйца, только в профиль. Оно не отреагирует на бесконечно малый импульс. скорее яйца тут другому мешают ... сим это не аналоговая система, оператор @... реагирует на изменения сигнала не на длительность этого изменения. А конструкция с fork join в примере к ловле событий отношения прямого не имеет, она лишь избавляет вас от "ручного" контроля времени, так как ожидание изменения сигнала и контроль времени этого ожидания работают параллельно в разных потоках. P.S. Пример вполне рабочий и делает то что вы и просили "следи за фронтом N времени, а потом - не следи" Quote Share this post Link to post Share on other sites More sharing options...
flammmable 4 August 19, 2022 Posted August 19, 2022 · Report post 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, как я понимаю, решили провести четкую грань с надписью "здесь тебе не анализ времянок, у нас всё синхронно, пшол прочь". Если так, то это несколько печально. <через некоторое время> Вот здесь приводят пару любопытных примеров. Quote Share this post Link to post Share on other sites More sharing options...
des00 27 August 19, 2022 Posted August 19, 2022 · Report post 2 hours ago, flammmable said: Но это как-то наколеночно всё. это как раз нормально, посмотрите модели qdr памяти, там аще жестко, но верно прописаны времянки) 2 hours ago, flammmable said: Я почитал про утверждения в SystemVerilog. Там в property всегда фигурирует тактовый сигнал. да, как-то забыл про это. Вам тогда в асинхронные проверки из почти забытой писателями секции верилога, для моделирования проводной логики и нетлистов, те самые $skew $timeskew $fullskew $period $width $nochange и т.д. Quote Share this post Link to post Share on other sites More sharing options...
Джеймс 5 August 20, 2022 Posted August 20, 2022 · Report post On 8/18/2022 at 5:57 PM, flammmable said: Нет, fork/join_any - это те же яйца, только в профиль. Оно не отреагирует на бесконечно малый импульс. Ээ.. А что это за бесконечно малый импульс?.. В Verilolog есть директива шага времени timescale ..и меньше 1fs там никогда не будет Quote Share this post Link to post Share on other sites More sharing options...