当前位置: 首页 > news >正文

【转载】System Verilog 上下文context的含义以及设置导入函数的作用域

放丢失,转载一下,原文:

https://blog.csdn.net/qq_31348733/article/details/101054625

1. 上下文(context)的含义

导入函数的上下文是该函数定义所在的位置,比如$unit 、模块、program或者package作用域(scope),这一点跟普通的sv方法是一样的。如果你把一个函数导入到两个不用的作用域,对应的C代码会依据import语句所在位置的上下文执行。这类似于在SV的两个不同模块中分别定义一个run()任务,每个任务都会明确地访问自己所在模块的内部变量。

下面是C方法根据导入和导出语句的上下文来调用不同SV方法的一个实例:

//top.sv

module top;

import "DPI-C" context

endmodule:top

2. 设置导入函数的作用域

如同SV代码可以在局部作用域调用方法,导入的C方法也可以在它默认的上下文之外调用方法。使用svGetScope方法可以获得当前作用域的句柄,然后就可以对svGetScope的调用中使用该句柄,使得C代码认为它处在另外一个上下文中。

下面是一个实例:

第一个方法save_my_scope()保存它在SV中调用处的作用域

第二个方法c_display()将其作用域设置为已保存的作用域,并打印信息

//c_display.c

#include <stdio.h>

#include <svdpi.h>

extern void sv_display();

svScope my_scope;

void save_my_scope(){

my_scope = svGetScope();

}

void c_display(){

//打印当前作用域

io_printf("C:c_display called from scope %s\n", svGetNameFromScope(svGetScope()));

//设置新的作用域

//io_prinf("scope: %s", svGetNameFromScope(svGetScope()));

svSetScope(my_scope);

io_printf("C:calling %s.sv_display\n", svGetNameFromScope(svGetScope()));

sv_display();

}

上面的C代码调用了svGetNameFromScope(),该函数返回表征当前作用域的一个字符串。返回的作用域被打印了两次,一次是C代码首次被调用时的作用域,另一次是先前保存过的作用域。

下面SV代码代码中,第一个模块block调用了一个C方法来保存上下文信息。当top模块调用c_display()方法时,该方法将作用域设置回block,这样它调用的便是block模块中的sv_display(),而非top模块中的同名方法

//top.sv

`timescale1ns/1ns

moduletop;

//=====================================================================\

// ********** Define Parameter and Internal Signals *************

//=====================================================================/

//======================================================================

// *************** Main Code ****************

//======================================================================

import "DPI-C" context function void c_display();

export "DPI-C" function sv_display;

function void sv_display();

$display("SV:top %m");

endfunction

block b1();

initial begin

#1 c_display();

end

endmodule:top

module block;

import "DPI-C" context function void c_display();

import "DPI-C" context function void save_my_scope();

export "DPI-C" function sv_display;

function void sv_display();

$display("SV:block %m");

endfunction

initial begin

save_my_scope();

c_display();

end

endmodule:block

下面是程序运行结果

# C:c_display called from scope top.b1

# C:calling top.b1.sv_display

# SV:block top.b1.sv_display

# C:c_display called from scope top

# C:calling top.b1.sv_display

# SV:block top.b1.sv_display

————————————————

版权声明:本文为CSDN博主「强迫症高级患者」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_31348733/article/details/101054625

http://www.lryc.cn/news/32447.html

相关文章:

  • redis数据类型
  • 【独家】华为OD机试 - 最多获得的短信条数(C 语言解题)
  • 【剧前爆米花--爪哇岛寻宝】包装类的装拆箱和泛型的擦除机制
  • BufferQueue研究
  • 【计组笔记08】计算机组成与原理之IO设备系统(输入、输出设备、外存储器)
  • 使用Vue实现数据可视化大屏功能(一)
  • 华为OD机试真题Python实现【整数对最小和】真题+解题思路+代码(20222023)
  • 2023年绿色建筑国际会议(ICoGB 2023)
  • 【力扣1653】使字符串平衡的最少删除次数
  • 链表的中间结点与链表的倒数第k个结点(精美图示详解哦)
  • 防静电监控仪可以检测现场设备是否和实际大地接触
  • 计算机网络第八版——第二章课后题答案(超详细)
  • 2023年3月全国DAMA-CDGA/CDGP数据管理认证火热报名中...
  • 查询与进程调度(CFS)相关信息
  • 07对MVC的理解
  • WebSocket与Socket、TCP、HTTP的关系
  • 音频基础知识简述 esp-sr 上手指南
  • Flex弹性布局一文通【最全Flex教学】
  • Navicat使用教程
  • 35岁测试人该何去何从?10年工作经验的我,只不过是一年的工作经验用了10年......
  • SpringBoot 项目中集成 Prometheus 和 Grafana
  • 红队APT——反朔源流量加密CSMSF证书指纹C2项目CDN域前置
  • Linux环境下实现并详细分析c/cpp线程池(附源码)
  • 移动web(三)
  • macbook怎么运行exe文件 mac打开exe文件的三大方法
  • GoldenGate(OGG)高可用XAG部署
  • 如何使用Docker容器部署O2OA(翱途)开发平台与OnlyOffice的集成版本?
  • springboot复习(黑马)(持续更新)
  • K_A16_001 基于STM32等单片机驱动HX711称重模块 串口与OLED0.96双显示
  • 单例模式之饿汉式