因為搭配著 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
沒有留言:
張貼留言