Iverilog 原始碼分析 VPI的實現

2021-10-19 11:00:33 字數 1876 閱讀 7128

在iverilog中vvp可以通過-m或者-m制定需要載入的模組,本文介紹一下vpi的模組工作機制。

每個模組通過vpip_load_module來載入指定的動態鏈結庫, 然後在動態鏈結庫裡面找到「vpip_set_callback」函式來設定vpip_routines_s 結構內的函式指標,這些函式是veriloglrm預定義的37個函式, 參考verilog lrm 27章: vpi routines definition, 這些函式定義在vvp/vpi_private.cc裡面;

然後查詢vlog_startup_routines 內指定的啟動函式並且逐個執行;

vlog_startup_routines是乙個註冊函式列表, 每個自定義的模組要首先在該列表裡面註冊:

void vpip_load_module(const char*name) 

}void*table = ivl_dlsym(dll, lu "vlog_startup_routines" tu);

vpi_mode_flag = vpi_mode_register;

vlog_startup_routines_t*routines = (vlog_startup_routines_t*)table;

for (unsigned tmp = 0 ; routines[tmp] ; tmp += 1)

(routines[tmp])();

vpi_mode_flag = vpi_mode_none;

}

vpi 的模組啟動函式設定在vpi/sys_table.cc, 設定如下:

void (*vlog_startup_routines)(void) = ;
這裡定義了很多的自定義載入模組, 每個模組通過如下的方式來註冊函式進行模組與simulator之間的互動, 使得使用者模組可以訪問simulator的記憶體狀態資訊。

typedef struct t_vpi_systf_data  s_vpi_systf_data, *p_vpi_systf_data;

s_vpi_systf_data tf_data;

vpihandle res;

tf_data.type = vpisysfunc;

tf_data.tfname = "$time";

tf_data.sysfunctype = vpitimefunc;

tf_data.calltf = sys_time_calltf;

tf_data.compiletf = sys_no_arg_compiletf;

tf_data.sizetf = 0;

tf_data.user_data = "$time";

res = vpi_register_systf(&tf_data);

vpip_make_systf_system_defined(res);

每當在verilog裡面呼叫$time(), 系統自動呼叫compiletf指標指向的函式,來檢驗函式呼叫的引數檢查, 通過calltf函式指標來執行相關的操作。

在vvp目錄下面, 存在很多的vpi_***.cc文件, 他們實現了vvp呼叫vpi模組的框架函式。

檔案主要功能

vpi_modules.cc

實現了load_vpi_module, 其功能如上面分析

vpi_task.cc

記錄系統函式或者系統任務, 任務的呼叫等

vpi_scope.cc

定義了__vpiscope以及其字物件, 主要記錄了模組以及子模組,參考: vpi scope

vpi_signal.cc

定義了signal的屬性資訊, 以及不同型別的valuechange的類定義

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

思科VPP原始碼分析(dpo機制原始碼分析)

vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...

redux原始碼分析(三) 原始碼部分

下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...