Systemverilog、C、Verilog与SystemC之间的相互调用方法

这些不同变成语言之间的调用主要包括以下几种方式:
1、verilog和c之间的相互调用;
2、systemverilog和c之间的相互调用;
3、systemverilog中调用systmc;
4、通过CPU执行c代码,从而实现Verilog和c的交互

第一种,verilog中调用c函数
verilog通过PLI(Program Language Interface)调用c函数。这些用户定义的系统任务和函数的名称必须以美元符号" " 开 头 。 大 家 用 得 比 较 多 的 P L I 函 数 有 " 开头。大家用得比较多的PLI函数有 "PLIdisplay, $finish等。
例如:
c函数如下:

#include 
void hello () {
	printf("\nHello, world\n");
}

调用c函数的verilog代码如下:

module hello_verilog ();
	initial begin
		$hello;
		#100 $finish;
	end
endmodule

第二种,c中调用verilog函数
在实际的验证中,会有在c/c++代码中对DUT中的寄存器进行读写的需求。verilog提供VPI接口,可以将DUT的层次结构开放给外部c/c++代码;
常用的VPI接口主要有两个:
vpi_get_value(obj, p_value);
用于从RTL中得到一个寄存器的值。
vpi_put_value(obj, p_value, p_time, flags);
用于将RTL中的寄存器设置为某个值。

第三种,systemverilog中调用c函数
systemverilog 引入了DPI(Direct Programming Interface)。只要使用import声明和使用,导入一个C子程序,就可以像调用System Verilog中的子程序一样来调用它。
c函数如下:

#include 
void hello () {
	printf("\nHello, world\n");
}

调用c函数的systemverilog代码如下:

module hello_sv ();
	import "DPI-C" function void hello();
	initial begin
		hello();
		#100 $finish();
	end
endmodule

第四种,c中调用systemverilog函数
systemverilog代码如下:

module hello_sv ();
	export "DPI-C" function adder;
	function int adder(int a, int b);
		return a + b;
	endfunction
endmodule

调用systemverilog函数的c代码如下:

#include 
extern int adder(int a, int b);
void hello() {
	int c;
	c = adder(1, 2);
}

第五种,systemverilog中调用systmc代码
systemc代码

#include 
using namespace uvmc;
#include 
int sc_main(int argc,  char * argv[]) {
	cnn cnn_inst("cnn_inst");
	uvmc_connect(cnn_inst.in, "cnn_inst");
	sc_start(-1);
	return 0;
}

调用systemc的systemverilog代码如下:

import uvm_pkg::;
import uvmc_pkg::;
module sim_top();
	cpu_top cpu_inst = new("cpu_inst");
	initial begin
		uvmc_tlm#()::connect(cpu_inst.out, "cnn_inst");
	end
endmodule

第六种,通过CPU执行c代码,从而实现Verilog和c的交互
C代码通过工具链编译成CPU可以执行的汇编指令,再将汇编指令转成对应的指令代码,然后通过CPU读取指令代码产生激励,实现C代码所描述的功能。

---------------------
作者:Alfred.HOO
来源:CSDN
原文:https://blog.csdn.net/Michael177/article/details/120896169?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164689401016780271949811%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164689401016780271949811&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-2-120896169.pc_search_result_cache&utm_term=SystemVerilog%E5%92%8CC%E8%AF%AD%E8%A8%80%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E6%98%A0%E5%B0%84&spm=1018.2226.3001.4187
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值