文章目录
如何用VCS+Verdi仿真Xilinx IP
1. VCS以及Vivado的版本问题
工欲善其事必先利其器,我们第一步要做的事情就是安装相关的工具,关于具体怎么安装vivado以及vcs、verdi的,请自行google解决。
笔者在此使用的是vivado2019.2+vcs_mx 2018.09版本。关于某一vivado版本所能支持的第三方的仿真工具,需要查阅xilinx官方文档ug973。笔者在此附上相关截图:
可以看到该版本的vivado只支持vcs以及vcs_mx 2018.09版本的。在这里千万要注意版本要匹配,要不然在第二步编译IP库的时候会一直报错的。
2. 使用VCS编译Vivado的IP库
在安装完vivado、vcs、verdi以后,就需要预先将xilinx的ip用vcs编译好。打开vivado,选择tools,再选择compile simulation library,会出现如下界面:
- simulator:选择vcs仿真器
- compiled library location:选择一个路径存储编译后的库
- simulator executable path:选择vcs的bin目录
随后点击compile即可,耐心等待编译完成会花费几分钟到几十分钟不等,具体看电脑的配置。
编译完成以后会生成一个synopsys_sim.setup文件,这个文件比较重要,我们稍后再谈。
3. 使用Vivado工具调用VCS进行仿真
1.新建带有IP的工程
首先我们需要新建一个带有IP的vivado工程,在这里我已xbip_multadd 这个IP为例进行说明。
首先配置IP的相关参数,在这里我们只需要注意以下几个信号即可:
- A:输入信号,位宽为4
- B:输入信号,位宽为4
- C:输入信号,位宽为4
- P:输出信号,位宽为16
- SUBTRACT:当为0时,首先P=A*B + C;当为1时,首先P=A*B - C
配置好了以后我们需要新建一个testbench对其进行例化并仿真,testbench如下所示:
`timescale 1ns / 1ps
module multadd_tb(
);
reg CLK;
reg [3:0]A;
reg [3:0]B;
reg [3:0]C;
wire [15:0]P;
initial begin
CLK = 1'b0;
#50
A = 4'h3;
B = 4'h5;
C = 4'b1;
#50
$finish;
end
always #5 CLK = ~CLK;
xbip_multadd_1 u_xbip_multadd_1(
.CLK(CLK),
.CE(1'b1),
.SCLR(1'b0),
.A(A),
.B(B),
.C(C),
.SUBTRACT(1'b0),
.P(P),
.PCOUT()
);
initial begin
$fsdbDumpfile("top.fsdb");
$fsdbDumpvars;
$display("********************wave dump start**********************");
end
endmodule
2.从vivado工具中调用VCS进行仿真
新建完工程以后我们就可以调用VCS进行仿真了。首先我们需要对simulation进行设置:
- 点击project manage下的settings:
- 点击simulation选项进行设置:
设置好方框中的三个选项即可。然后点击run simulation即可。运行完成后会直接调起DVE
上面展示的就是VCS的仿真结果。
4. 从Vivado中导出VCS的仿真脚本
当然,除了调用图形界面调出VCS仿真以外,还可以通过脚本的方式来进行VCS仿真。当然,这里的脚本指的是vivado工具自动导出的脚本。
点击File选项卡,选择export——>export simulation:
方框中的两个选项建议都勾选上,然后点击ok即可。打开生成的仿真脚本,文件结构如下:
其中,multadd_tb.sh就是仿真脚本,直接运行即可开始仿真。
5. 编写Makefile脚本仿真
鉴于笔者之前一直使用的都是makefile脚本去进行vcs仿真的,所以笔者在此根据vivado导出的shell脚本改写了一版makefile脚本。
NOVAS_HOME=$(VERDI_HOME)
DEBUSSY_PLI=-P $(NOVAS_HOME)/share/PLI/VCS/linux64/novas.tab $(NOVAS_HOME)/share/PLI/VCS/linux64/pli.a
SIM_PATH = /home/lcy/projects/vcs_projects/multadd
VLOGAN_OPTS = -work xil_defaultlib -full64 +v2k -l $(SIM_PATH)/com.log +define+SIMULATION_EN
VHDLAN_OPTS = -work xil_defaultlib -full64
.PHONY:analysis elabroate simulate verdi
all:analysis elaborate simulate verdi
analysis:
vlogan $(VLOGAN_OPTS) -f top_verilog.F
elaborate:
vcs \
-full64 \
-debug_pp \
-t ps \
-licqueue \
-l elaborate.log \
xil_defaultlib.multadd_tb \
xil_defaultlib.glbl \
$(DEBUSSY_PLI) \
-o $(SIM_PATH)/simv
simulate:
$(SIM_PATH)/simv -l $(SIM_PATH)/sim.log +notimingcheck +nospecify
verdi:
verdi \
-f top_verilog.F \
-ssf top.fsdb
clean:
rm -rf ./64 ./csrc ./verdiLog ./*.log ./top.fsdb ./ucli.key ./inter.vpd ./novas* ./DVEfiles ./simv ./simv.daidir
在笔者之前碰到的VCS仿真脚本中,整个仿真的过程是分为两步的,分别是编译和仿真:
- 编译:使用vcs命令编译源文件
- 仿真:运行编译阐述的可执行文件
但是请注意,两步走只适用于verilog和system verilog,含有vhdl源文件的只能采用下面的三步走仿真流程,而xilinx的大部分IP都是采用vhdl编写的,因此在这采用三步走的仿真流程。
- analysis: 用vlogan工具编译含有verilog或者system verilog源文件,用vhdlan分析带有vhdl源文件
- elaborate: 使用vcs命令,指定top module就可以生成仿真需要的可执行文件啦
- simulate: 运行编译阐述的可执行文件
最后有一点比较重要,我们来重点关注以下-work选项以及synopsys_sim_setup文件:
VCS参考手册对synopsys_sim_setup文件的功能做出了如下解释:
VCS编译工具在运行时会依照先后顺序从以下三个路径查找synopsys_sim_setup文件:
- $VCS_HOME/bin目录
- Home目录
- 当前运行目录
我们先来看下synopsys_sim_setup文件的格式:
在上面的例子中,xil_defaultlib是我们指定的逻辑库(名字可以随便取),它被映射到了vcs_lib/xil_defaultlib/路径下的物理库,语法如下:
Logical_library: Physical_library
当然,我们也可以在这个setup(A)文件中引用另外的setup(B)文件。在上面,我们用vivado编译库文件时生成了一个setup(B)文件,我们需要在仿真的时候引用B这个文件,通过以下语法:
OTHERS = [filename]
所以,我们在运行目录下的synopsys_sim.setup文件中指定了xil_defaultlib这个逻辑库,所以我们在makefile脚本中通过-work xil_defaultlib 这个编译选项指定我们的源文件编译到哪个逻辑库(在这里就是xil_defaultlib )。同时,我们也引用了另一个synopsys_sim.setup文件,也就是我们编译IP库的时候生成的,里面指定了各种IP核的逻辑库和物理库。
到此,我们就可以愉快的用VCS仿真xilinx的IP了。
reference:
使用VCS+Verdi对Xilinx IP仿真
基于makefile脚本的VCS仿真平台
VCS仿真流程
VCS - 三步仿真
写在最后:如果大家对于上面的博客有何疑问的话,欢迎在评论区批评指正!