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函數。這些用戶定義的系統任務和函數的名稱必須以美元符號"$" 開頭。大家用得比較多的PLI函數有$display, $finish等。
例如:
c函數如下:

#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
extern int adder(int a, int b);
void hello() {
	int c;
	c = adder(1, 2);
}

第五種,systemverilog中調用systmc代碼
systemc代碼

#include <uvmc.h>
using namespace uvmc;
#include <cnn.h>
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代碼所描述的功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM