放丢失,转载一下,原文:
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
#include
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
上一篇:Qt广告机客户端(下位机)
下一篇:Jenkins自动化部署入门