因為搭配著 DPI/VPI ,更可使用 C/CPP 來操作整個 Verilog Simulation Model,建立 Database。
以下用小編範例 Step by Step 說明 ...
本節目標: 利用 C Model 傳遞資料 ( Pass Data ) 操作 Verilog 。
本節目標: 利用 C Model 傳遞資料 ( Pass Data ) 操作 Verilog 。
(0) 準備檔案:
- C file : hello_world.c / test_main.c / stim_num.c / stim.h
- SV Header : svdpi.h
- Makefile : makefile
(1) 先簡述 C/CPP 設定環境。C Link Library
上篇文章已說明是將資料轉成 share library 形式
套用其方法先將所有 C function 作 link lib
CDS_INST_DIR= "/mnt/tools/cadence/IUS62_linux/tools/include/"
MAIN_C= "test_main.c"
MAIN_O= "test_main.o"
C_MODEL=`cat cmodlist.txt | egrep '^[^\/\/]' | grep "\.c"`
C_LIB= "libstim.a"
C_DPI= "libdpi.so"
## user only can use 32-bit to compile gcc (-m32)
obj:
echo "${C_MODEL}"
rm -rf *.o *.a
gcc -m32 \
-I ${CDS_INST_DIR} \
-c ${C_MODEL}
ar rcs ${C_LIB} *.o
rm -rf *.o
main:
gcc -m32 \
-c ./${MAIN_C} \
-I ${CDS_INST_DIR}
dpi:
gcc -WI -m32 -shared -o libdpi.so \
${MAIN_O} ${C_LIB} \
-lm
vlg:
ncverilog -sv hello_dpi.sv -sv_lib ${C_DPI}
obj /main - Compiler 主程式與 Function
dpi - 將 *.o 轉為 Share Lib. 使 System Verilog 認得到 *.so
vlg - C and System Verilog Co-Simulation
(2) System Verilog DPI CTRL
module hello_dpi ();
string exc_cmd_nam ;
int exc_cmd_num0 ;
int exc_cmd_num1 ;
int exc_cmd_num2 ;
int exc_cmd_num3 ;
string exc_cmd_str ;
reg [20*10-1:0] cmd_nam ;
reg [(8*50):0] cmd_str ;
reg [15:0] cmd_data ;
reg [15:0] cmd_dt1 ;
reg [15:0] cmd_dt2 ;
reg [15:0] cmd_dt3 ;
/* Linking Funtion : System Verilog To C */
import "DPI-C" context task test_main();
//import "DPI-C" context task hello_world();
//import "DPI-C" context task exc_execute();
/* Linking Funtion : C To System Verilog */
export "DPI-C" task exc_execute;
initial begin
test_main();
#100 $finish ;
end
task exc_execute(
input int arg_dly ,
input string arg_cmd_nam ,
input int arg_cmd_num0 ,
input int arg_cmd_num1 ,
input int arg_cmd_num2 ,
input int arg_cmd_num3 ,
input string arg_cmd_str
);
#(arg_dly);
exc_cmd_nam = arg_cmd_nam ;
exc_cmd_num0 = arg_cmd_num0 ;
exc_cmd_num1 = arg_cmd_num1 ;
exc_cmd_num2 = arg_cmd_num2 ;
exc_cmd_num3 = arg_cmd_num3 ;
exc_cmd_str = arg_cmd_str ;
cmd_data = arg_cmd_num0 ;
cmd_dt1 = arg_cmd_num1 ;
cmd_dt2 = arg_cmd_num2 ;
cmd_dt3 = arg_cmd_num3 ;
$swrite(cmd_nam, "%s", exc_cmd_nam); // convert string to reg
$swrite(cmd_str, "%s", exc_cmd_str); // convert string to reg
$display(" \n ");
$display("===========================================\n" );
$display("cmd_name = %s\tcmd_data = %d\tcmd_dt1 = %d\n",
exc_cmd_nam,cmd_data,cmd_dt1);
$display(" \n ");
endtask
endmodule
沒有留言:
張貼留言