2014年7月3日 星期四

System Verilog DPI Co-Simulation (1)

首次把玩 System Verilog 這個東西時,就想找機會整理這東東。
因為搭配著 DPI/VPI ,更可使用 C/CPP 來操作整個 Verilog Simulation Model,建立 Database。
以下用小編範例 Step by Step 說明 ...

本節目標: 利用 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




沒有留言:

張貼留言