SystemVerilog VPI应用如何在Re-Active区域中执行调度?
VPI在Re-Active区域调度任务的实现方法及Reactive PLI区域调度机制
1. VPI任务调度到Re-Active区域的方式
虽然IEEE 1800-2023第4.10节的表4-1未列出关联Re-Active区域的回调条目,但VPI规范的第38章明确提供了对应的调度手段:
- 使用
vpi_schedule_cb()函数,在构造vpiCbData结构体时,将reason字段指定为cbReactive。这个回调类型专门用于将VPI操作绑定到Re-Active区域集合中的Reactive PLI region。 - 极简示例:
vpiCbData cb_info = {0}; cb_info.reason = cbReactive; cb_info.cb_rtn = reactive_pli_callback; // 自定义的回调函数 cb_info.user_data = (void*)"user_context"; // 可选的用户数据 vpi_schedule_cb(&cb_info);
- 如果需要响应特定信号变化并在Re-Active区域执行逻辑,可先注册
cbValueChange回调监听信号更新,再在该回调内部调用vpi_schedule_cb()调度cbReactive类型的操作,确保逻辑在Re-Active阶段执行。
2. Reactive PLI区域的调度机制
依据IEEE 1800-2023第4章的调度器模型:
- Re-Active区域集合是Active区域执行完毕后的下一个调度阶段,触发条件为Active区域内产生了需要重新评估的信号更新(比如组合逻辑敏感信号的变化)。
- Re-Active区域集合的执行顺序固定:
- Reactive PLI region:所有通过
cbReactive调度的VPI回调优先执行,优先级高于SystemVerilog原生的Reactive区域代码。 - Reactive region:处理SystemVerilog代码中因Active区域更新触发的组合逻辑重评估等操作。
- Reactive PLI region:所有通过
- 该阶段会循环执行,直到没有新的信号更新产生,才会进入后续的Non-Blocking Assignment(NBA)区域等调度阶段。
补充:IEEE 1800-2023第38.4.1节明确定义了
cbReactive回调类型,这是Re-Active区域PLI调度的核心依据,只是未在第4.10节的表4-1中列出,容易被遗漏。
内容的提问来源于stack exchange,提问作者garethw
相关产品推荐
相关产品推荐

