细说systemverilog @event与wait(event.triggered)的区别

SystemVerilog事件机制解析
本文探讨了SystemVerilog中@event与wait(event.triggered)的区别。通过LRM原文解析了这两种事件处理方式的工作原理,重点讲解了它们在处理同一时间步内事件触发时的竞争条件及解决方法。

近日在工作中遇到了@event和wait(event.triggered)的细微差别。与周边同事讨论了一圈,发现大家都貌似懂他们的区别,但都无法特别严谨细致地进行解释。

针对这种语法上的细节,建议直接从LRM原文着手。下面是相关的原文

1. @会阻塞一个进程,直到@的事件被触发(->)后,该进程才会unblock。如果事件触发(->event)在@event先执行,则@event的进程会一直被阻塞住。如果->event和@event发生在同一个time step,就会造成竞争冒险,因为无法确认他们哪一个先执行。

2. event的triggered属性的持续时间是一个time step, 因此它解决了触发事件和等待事件在同一个time step时的竞争冒险问题。只要wait(event.triggered)在->event之前执行,或者在同一个time step执行,都能正确地等到事件。

补充:

如何理解time step呢?

systemverilog是为离散事件执行模型(discrete event execution)所定义的一种语言。怎么理解呢?离散指的是仿真时间(simulation time)上的离散性,仿真基于时间片进行,只对有效的时刻点进行仿真。而这个在仿真时间维度上的离散时间片,就称为time slot或者time step。

在layui中,使用`document.addEventListener`模拟点击`select`下拉框后,下拉框在特定代码执行完消失,这可能是由于事件冒泡、layui的事件机制以及原生`select`和layui渲染后的`select`之间的交互问题导致的。以下是一些解决办法: #### 阻止事件冒泡 事件冒泡可能会触发其他元素的点击事件,导致下拉框关闭。可以在模拟点击事件处理函数中阻止事件冒泡。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>layui select 模拟点击</title> <link rel="stylesheet" href="layui/css/layui.css"> </head> <body> <select id="testSelect" lay-filter="testFilter"> <option value="1">选项1</option> <option value="2">选项2</option> <option value="3">选项3</option> </select> <script src="layui/layui.js"></script> <script> layui.use(['form'], function(){ var form = layui.form; // 重新渲染表单 form.render('select'); // 模拟点击并阻止事件冒泡 document.addEventListener('click', function(e) { if (e.target.id === 'testSelect') { e.stopPropagation(); // 执行特定代码 console.log('执行特定代码'); } }); }); </script> </body> </html> ``` #### 手动控制下拉框显示 可以手动控制layui渲染后的`select`下拉框的显示状态。 ```javascript layui.use(['form'], function(){ var form = layui.form; form.render('select'); document.addEventListener('click', function(e) { if (e.target.id === 'testSelect') { // 执行特定代码 console.log('执行特定代码'); // 手动显示下拉框 var selectElem = $('#testSelect').next('.layui-form-select'); selectElem.addClass('layui-form-selected'); selectElem.find('.layui-select-dropdown').show(); } }); }); ``` #### 检查layui事件机制 确保模拟点击事件不会触发layui的关闭下拉框的事件。可以通过调试工具查看事件绑定情况,或者在模拟点击时避免触发不必要的事件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值