VCS 仿真配置
环境变量
您应该确保提前定义了以下几个环境变量:
VCS_HOME
:VCS 安装的主路径。VERDI_HOME
:Verdi安装的主路径。将
$VCS_HOME/bin
和$VERDI_HOME/bin
添加到你的PATH
中。
将以下路径添加到 LD_LIBRARY_PATH
变量的前部以启用 PLI 功能。
export LD_LIBRARY_PATH=$VERDI_HOME/share/PLI/VCS/LINUX64:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$VERDI_HOME/share/PLI/IUS/LINUX64:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$VERDI_HOME/share/PLI/lib/LINUX64:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$VERDI_HOME/share/PLI/Ius/LINUX64:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$VERDI_HOME/share/PLI/MODELSIM/LINUX64:$LD_LIBRARY_PATH
如果您遇到 Compilation of SharedMemIface.cpp failed
错误,请确保您已正确安装 C++ boost 库。头文件和库文件路径应分别添加到 CPLUS_INCLUDE_PATH
、 LIBRARY_PATH
和 LD_LIBRARY_PATH
中。
用户定义的环境设置
有时需要 VCS 环境设置文件 synopsys_sim.setup 来运行 VCS 仿真。此外,您可能希望在 VCS 开始编译之前运行一些脚本或代码来设置环境。您可以通过 withVCSSimSetup 来完成此操作。
val simConfig = SimConfig
.withVCS
.withVCSSimSetup(
setupFile = "~/work/myproj/sim/synopsys_sim.setup",
beforeAnalysis = () => { // this code block will be run before VCS analysis step.
"pwd".!
println("Hello, VCS")
}
)
此方法将您自己的 synopsys_sim.setup 文件复制到 workspacePath (默认为 simWorkspace )目录下的VCS工作目录,并运行脚本。
VCS 标志
VCS 后台遵循三步编译流程:
分析步骤:使用
vlogan
和 ``vhdlan``分析HDL模型。实例细化步骤:使用
vcs
细化模型并生成可执行的硬件模型。仿真步骤:运行仿真。
在每个步骤中,用户可以通过 VCSFlags
传递一些特定的标志,以启用一些功能,例如 SDF 反注释或多线程。
VCSFlags
采用三个参数,
名称 |
类型 |
描述 |
---|---|---|
|
|
传递标志到 |
|
|
传递标志到 |
|
|
传递标志给可执行硬件模型。 |
例如,您将 -kdb
标志传递给编译步骤和细化步骤,以进行 Verdi 调试,
val flags = VCSFlags(
compileFlags = List("-kdb"),
elaborateFlags = List("-kdb")
)
val config =
SimConfig
.withVCS(flags)
.withFSDBWave
.workspacePath("tb")
.compile(UIntAdder(8))
...
波形生成
VCS 后端可以生成三种波形格式:VCD
、VPD
和 ``FSDB``(需要 Verdi)。
您可以通过 SpinalSimConfig
的以下方法启用它们,
方法 |
描述 |
---|---|
|
生成 |
|
生成 |
|
生成 |
此外,您可以使用 withWaveDepth(depth: Int)
来控制波形文件记录的深度。
Blackbox
仿真
Sometimes, IP vendors will provide you with some design entities in Verilog/VHDL format and you want to integrate them into your SpinalHDL design. The integration can done by following two ways:
在
Blackbox
定义中,使用addRTLPath(path: String)
将外部 Verilog/VHDL 文件分配给该黑盒。使用
SpinalReport
的mergeRTLSource(fileName: String=null)
方法。