VCD是Verilog LRM中定义的, 本文介绍Iverilog 基于VPI机制的VCD的实现过程。在vpi目录下面, 定义了不同模块加载的实现。如下显示了Iverilog下面已经支持的实现:
void (*vlog_startup_routines[])(void) = {
sys_convert_register,
sys_countdrivers_register,
sys_darray_register,
sys_fileio_register,
sys_finish_register,
sys_deposit_register,
sys_display_register,
sys_plusargs_register,
sys_queue_register,
sys_random_register,
sys_random_mti_register,
sys_readmem_register,
sys_scanf_register,
sys_time_register,
sys_lxt_or_vcd_register,
sys_sdf_register,
sys_special_register,
table_model_register,
vams_simparam_register,
0
};
VCD 的实现在sys_lxt_or_vcd_register启动函数里面,然后调用到sys_vcd_register:
void sys_vcd_register(void)
{
s_vpi_systf_data tf_data;
vpiHandle res;
/* All the compiletf routines are located in vcd_priv.c. */
tf_data.type = vpiSysTask;
tf_data.tfname = "$dumpall";
tf_data.calltf = sys_dumpall_calltf;
tf_data.compiletf = sys_no_arg_compiletf;
tf_data.sizetf = 0;
tf_data.user_data = "$dumpall";
res = vpi_register_systf(&tf_data);
vpip_make_systf_system_defined(res);
tf_data.type = vpiSysTask;
tf_data.tfname = "$dumpfile";
tf_data.calltf = sys_dumpfile_calltf;
tf_data.compiletf = sys_one_string_arg_compiletf;
tf_data.sizetf = 0;
tf_data.user_data = "$dumpfile";
res = vpi_register_systf(&tf_data);
vpip_make_systf_system_defined(res);
tf_data.type = vpiSysTask;
tf_data.tfname = "$dumpflush";
tf_data.calltf = sys_dumpflush_calltf;
tf_data.compiletf = sys_no_arg_compiletf;
tf_data.sizetf = 0;
tf_data.user_data = "$dumpflush";
res = vpi_register_systf(&tf_data);
vpip_make_systf_system_defined(res);
tf_data.type = vpiSysTask;
tf_data.tfname = "$dumplimit";
tf_data.calltf = sys_dumplimit_calltf;
tf_data.compiletf = sys_one_numeric_arg_compiletf;
tf_data.sizetf = 0;
tf_data.user_data = "$dumplimit";
res = vpi_register_systf(&tf_data);
vpip_make_systf_system_defined(res);
tf_data.type = vpiSysTask;
tf_data.tfname = "$dumpoff";
tf_data.calltf = sys_dumpoff_calltf;
tf_data.compiletf = sys_no_arg_compiletf;
tf_data.sizetf = 0;
tf_data.user_data = "$dumpoff";
res = vpi_register_systf(&tf_data);
vpip_make_systf_system_defined(res);
tf_data.type = vpiSysTask;
tf_data.tfname = "$dumpon";
tf_data.calltf = sys_dumpon_calltf;
tf_data.compiletf = sys_no_arg_compiletf;
tf_data.sizetf = 0;
tf_data.user_data = "$dumpon";
res = vpi_register_systf(&tf_data);

本文详细介绍了Iverilog如何通过VPI接口实现VCD(Value Change Dump)文件的生成。VPI(Verilog Programming Interface)允许用户注册系统任务,如$dumpvars、$dumpoff等,用于在特定时间点输出仿真结果到VCD文件。$dumpfile任务定义了VCD文件路径并写入初始信息,而$dumpvars则遍历设计中的信号和模块,注册回调函数以在变化时记录值。$dumpoff和$dumpon分别用于在特定时间点记录所有变量的值,以便后续分析。整个流程涉及的函数如sys_dumpvars_calltf、sys_dumpoff_calltf等,实现了对仿真数据的捕捉和输出。
最低0.47元/天 解锁文章
2376

被折叠的 条评论
为什么被折叠?



