1. 环境配置与脚本编写:从零搭建你的混合仿真“脚手架”
如果你刚接触数模混合仿真,可能会觉得头大——数字的Verilog、模拟的网表、不同的仿真器,怎么让它们“说上话”?别担心,我刚开始做的时候也是一头雾水,踩了不少坑。今天,我就把自己从Makefile脚本编写到最终看到fsdb波形的全流程,掰开揉碎了讲给你听。咱们的目标很明确:让你能照着步骤,一步步搭建起一个可运行、可调试的混合仿真环境,而不是停留在理论层面。
混合仿真的核心,其实就是让数字仿真器(比如Cadence的ncverilog)和模拟仿真器(比如Synopsys的Finesim)协同工作。数字部分处理“0”和“1”的逻辑,模拟部分处理连续的电压电流。要让它们互通有无,就需要一个“翻译官”,这就是我们后面要讲的接口文件。而这一切的起点,是一个高效的Makefile。它就像项目的总指挥,一键搞定编译、链接和仿真。
1.1 Makefile:你的仿真“一键启动器”
很多新手喜欢在命令行里敲一长串命令,改个参数就得重新敲,效率低还容易错。用Makefile就省心多了。下面是我在一个实际项目中用的Makefile核心部分,你可以直接拿来改改就用。
# 定义仿真工具和关键选项
NCV_CMD = ncverilog +access+rwc +nc64bit
FINESIM_VPI = -loadvpi=./finesim.so:finesim_startup
FILE_LIST = -f run.f
LOG_FILE = simulation.log
# 定义目标
.PHONY: run clean debug
# 主要仿真目标
run:
@echo "Starting ncverilog + Finesim co-simulation..."
$(NCV_CMD) $(FINESIM_VPI) $(FILE_LIST) | tee $(LOG_FILE)
@echo "Simulation finished. Check $(LOG_FILE) and generated waveforms."
# 调试模式,增加更多输出信息
debug:
@echo "Starting simulation in debug mode..."
$(NCV_CMD) +debug +define+DEBUG $(FINESIM_VPI) $(FILE_LIST) | tee $(LOG_FILE)
# 清理生成的文件
clean:
rm -rf *.log *.fsdb *.key *.shm INCA_libs novas_dump.log *.vcd
@echo "All generated files cleaned up."
我来解释一下这几个关键参数是干嘛的:
+access+rwc:这个太重要了!它告诉ncverilog,在编译时要保留所有层次结构信号的读写访问权限。如果没有这个,你后面想用$fsdbDumpvars来dump波形时,很多内部信号可能根本抓不到,波形文件里就是空的。我早期就因为这个,对着空波形文件debug了半天。+nc64bit:使用64位版本的仿真器。现在电路规模都很大,用64位能寻址更大内存,避免仿真中途崩溃。-loadvpi=finesim.so:finesim_startup:这是混合仿真的灵魂所在。它动态加载了Finesim提供的共享库(finesim.so),并通过finesim_startup这个函数进行初始化。这相当于在ncverilog内部开了一个“后门”,让数字仿真引擎能调用模拟仿真引擎。你需要确保这个.so文件在你的系统路径或者当前目录下。-f run.f:这是一个文件列表文件。把需要编译的所有Verilog文件(包括testbench、设计代码、IP模型等)的路径都写进去,管理起来比在命令行里写一长串要清晰得多。
运行的时候,直接在终端敲 make run 就行了。所有日志会同时输出到屏幕和simulation.log文件里,方便事后排查问题。make clean 能一键清理所有仿真产生的中间文件和波形,保持目录清爽。
129



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



