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