VCS和Quartus联合仿真

VCS和Quartus联合仿真

使用VCS对Quartus工程进行编译仿真,仿真的内容主要是IP核,仿真过程分为单IP核和多IP核两种情况,以乘法器IP核和除法器IP核为例,进行说明

1. 单IP核仿真

1.1 新建工程,添加IP核文件

新建Quartus工程,随便命名,这里命名为mult_top,通过IP catalog添加IP核,这里面添加乘法器IP核,设置输入8位,输出16位,然后点击生成HDL文件,在弹出的生成界面,需要设置仿真选项,这里面使用的是VCS仿真器,所以需要选中VCS。

仿真中IP核设置的名字为MultiIP,这里面在工程目录中创建了名称IP的文件夹,用来放IP核文件,输入数据的位宽为8位,输出数据的位宽为16位。

在这里插入图片描述

1.2 添加顶层文件

新建顶层文件,其实可以直接添加testbench文件,在这还是添加一个顶层文件。

新建文件mult_top.v,内容如下:

module mult_top(
input       clk     ,
input       rst_n   ,
input  [7:0] a,
input  [7:0] b,
output [15:0] c,
output reg [3:0] cnt     );
 
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
        cnt <= 0;
    else if(cnt == 9)
        cnt <= 0;
    else
        cnt <= cnt + 1;
end
 
multIP u0 (
  .result  (c),  //  output,  width = 9,  result.result
  .dataa_0 (a), //   input,  width = 8, dataa_0.dataa_0
  .datab_0 (b)  //   input,  width = 8, datab_0.datab_0
);

endmodule

1.3 添加testbench文件

新建testbench文件,也可以利用生成的模板进行修改,在这里自己新建文件。Testbench文件为top_tb.sv,内容如下:

`timescale 1 ps/ 1 ps
module top_tb();
 
//----------------------------------------
reg             clk         ;
reg             rst_n       ;
reg [7:0] add_a;
reg [7:0] add_b;
wire [15:0] result_c;
wire  [3:0]          cnt         ;
//----------------------------------------
mult_top u_top
(
    .clk        (clk        ),
    .rst_n      (rst_n      ),
	 .a(add_a),
	 .b(add_b),
	 .c(result_c)
);

//----------------------------------------
initial clk = 1'b1;
 
always #10 clk = ~clk;
 
initial begin
    rst_n = 0; #11 rst_n = 1;
end
//----------------------------------------
`ifdef DUMP_VPD
    initial begin
        $vcdpluson;
        #1000;
        $vcdplusflush;
        $finish;
    end
`elsif DUMP_FSDB
    initial begin 
		  add_a = 8'd10;
		  add_b = 8'd10;
        #100;
		  add_a = 8'd5;
		  #100;
		  add_a = 8'd24;
		  #100;
		  add_b = 8'd17;
		  #800
        $finish;
    end
    
    initial begin 
        $fsdbDumpfile("tb_top.fsdb");
        $fsdbDumpvars("+all");
    end
`endif
                                               
endmodule

Assignments->Settings->EDA Tool Settings中设置仿真工具和Testbench

simulation选项中,选择VCS仿真工具,verilog语言,输出文件夹。

在这里插入图片描述

Testbench specification选项中点击Edit,添加创建好的Testbench文件,这里面是top_tb.sv文件
在这里插入图片描述

1.4 Dump波形

为了能够在verdi中仿真波形,需要保存波形文件,在testbench中已经添加以下代码:

$fsdbDumpfile("tb_top.fsdb);
$fsdbDumpvars(0, tb_top); //0表示从0开始
//$fsdbDumpvars("+add"); //+add表示将所有变量都保存到波形文件中

1.5 编译仿真脚本创建

在生成的IP核保存的目录中,{project_dir}/ip/multIP/sim/synopsys/vcs下,有一个名为vcs_setup.sh的脚本,仿真主要是使用这个脚本,需要参照该脚本中的内容,创建一个.sh的仿真脚本,一个filelist.f文件。

  • vcs_sim.sh
    在这个仿真过程中,在工程目录中创建了名为vcs_sim.sh的脚本,在脚本中添加了仿真指令,具体指令如下:
source {project_dir}/ip/multIP/sim/synopsys/vcs/vcs_setup.sh \
TOP_LEVEL_NAME=top_tb \
SKIP_SIM=1 \
QSYS_SIMDIR="{project_dir}/ip/multIP/sim" \
USER_DEFINED_ELAB_OPTIONS="\"-f filelist.f\"" \
USER_DEFINED_SIM_OPTIONS=""
  • filelist.f
    创建flielist.f文件,在文件中添加需要仿真的文件,

因为在Testbench中Dump波形在verdi中使用,编译的时候,需要在编译选项中添加novas.tab文件和pli.a文件的路径,否则编译的时候会提示FSDB相关的错误。添加的具体编译指令如下:

-P ${VERDI_HOME}/share/PLI/VCS/LINUX64/novas.tab ${VERDI_HOME}/share/PLI/VCS/LINUX64/pli.a

最终filelist.f文件中的具体指令如下:

+systemverilogext+.sv
-top top_tb -full64 -l sim.txt -debug_access+r+w+nomemcbk +define+DUMP_FSDB -debug_pp -LDFLAGS -rdynamic -kdb -debug_region+cell+encrypt -line -timescale=1ps/1ps -sverilog +v2k +verilog2001ext+.v -P ${VERDI_HOME}/share/PLI/VCS/LINUX64/novas.tab ${VERDI_HOME}/share/PLI/VCS/LINUX64/pli.a {project_dir}/mult_top.v {project_dir}/top_tb.sv 

需要把其中的{project_dir}替换为实际的工程目录。

然后就可以在终端直接运行vcs_sim.sh脚本,会在文件夹中生成simv文件。

可以在vcs_sim.sh脚本中直接添加仿真命令,这里没有添加,需要再运行一下simv文件。

之后启动verdi加载工程和tb_top.fsdb文件,进行仿真。

可以得到如下的波形,乘法过程,说明整个编译仿真过程顺利完成。
在这里插入图片描述

2. 多IP核仿真

接下来增加一个除法器IP核,实现除法功能,实现多IP核仿真。

2.1 添加IP核

在这里除法器命名为dividIP,输入分子16位,输入分母8位,(主要是对应乘法器)添加过程和添加乘法器IP核的过程相同,最后生成IP核文件。

2.2 修改testbanch文件

为了测试方便,不对顶层文件进行更改,可以直接修改testbench文件,在里面例化除法器IP核,然后进行仿真。用乘法器的输出作为除法器的输入,需要增加除法器的输出,注意位宽大小匹配。

修改后具体内容如下:

`timescale 1 ps/ 1 ps
module top_tb();
 
//----------------------------------------
reg             clk         ;
reg             rst_n       ;
reg [7:0] add_a;
reg [7:0] add_b;
wire [15:0] result_c;
wire  [3:0]          cnt         ;
wire [15:0] da;
wire [7:0] db;
//----------------------------------------
mult_top u_top
(
    .clk        (clk        ),
    .rst_n      (rst_n      ),
	 .a(add_a),
	 .b(add_b),
	 .c(result_c)
);

dividIP divid_u0(
		.numer(result_c),    //  lpm_divide_input.numer,    Numerator of the fraction for the division, can be signed or unsigned
		.denom(add_a),    //                  .denom,    Denominator of the fraction for the division, can be signed or unsigned
		.quotient(da), // lpm_divide_output.quotient, Result of the division
		.remain(db)    //                  .remain,   Remain of the Divison
);
//----------------------------------------
initial clk = 1'b1;
 
always #10 clk = ~clk;
 
initial begin
    rst_n = 0; #11 rst_n = 1;
end
//----------------------------------------
`ifdef DUMP_VPD
    initial begin
        $vcdpluson;
        #1000;
        $vcdplusflush;
        $finish;
    end
`elsif DUMP_FSDB
    initial begin 
		  add_a = 8'd10;
		  add_b = 8'd10;
        #100;
		  add_a = 8'd5;
		  #100;
		  add_a = 8'd24;
		  #100;
		  add_b = 8'd17;
		  #800
        $finish;
    end
    
    initial begin 
        $fsdbDumpfile("tb_top.fsdb");
        $fsdbDumpvars("+all");
    end
`endif
                                              
endmodule

2.3 生成仿真脚本

需要在工程目录中利用如下指令生成多IP核仿真脚本,在生成的脚本中有解释,该指令会识别工程中的不同IP核,然后可以用生成的脚本进行仿真。

ip-setup-simulation --quartus-project=mult_top  //后面是工程名

可以用参数--output-directory=<directory>指定脚本输出目录,否则默认输出文件的位置为当前目录位置(最好是指定输出目录,或者在选定的目录中执行,输出文件不止一个)

该指令执行完毕之后,和单IP核一样,使用的是文件夹中synopsys/vcs/vcs_setup.sh文件。

2.4 创建脚本

利用synopsys/vcs/文件夹下的vcs_setup.sh文件来创建vcs_sim.sh文件和filelist.f文件,这文件夹是刚才运行ip-setup-simulation指令生成的目录。创建这两个文件的过程与上面单IP核一致,需要参考vcs_setup.sh文件。

其实也可以直接对单IP核中的使用过的两个文件直接进行更改,这里面需要更改的是vcs_sim.sh文件,

  • vcs_sim.sh

需要把其中的source后面的脚本更换为synopsys/vcs/文件夹下的vcs_setup.shQSYS_SIMDIR改为ip-setup-simulation指令输出的目录。

具体如下:(这里面是运行ip-setup-simulation指令是在工程目录运行的,没有指定输出目录,所以输出文件在当前目录下)

source {project_dir}/synopsys/vcs/vcs_setup.sh \
TOP_LEVEL_NAME=top_tb \
SKIP_SIM=1 \
QSYS_SIMDIR="{project_dir}" \
USER_DEFINED_ELAB_OPTIONS="\"-f filelist.f\"" \
USER_DEFINED_SIM_OPTIONS=""
  • filelist.f

filelist.f文件不需要更改。

2.5 仿真结果

运行vcs_sim.sh文件,利用生成的simv文件进行仿真,结果如下:

在verdi中可以看到增加除法器IP后的层次结构,已经正确识别
在这里插入图片描述

加载波形文件,对照乘法器输入输出,除法器输入输出,数值结果对照正确,说明用VCS仿真Quartus中多IP核的过程正确。
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一支绝命钩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值