VCS/Questa SIM 使用流程及Makefile

目录

VCS

Analysis

Elaboration

Simulation

VCS生成波形文件(debug模式)

DVE所用的.VPD文件

Verdi所用的.fsdb文件(打开-kdb和-fsdb选项)

Questa SIM

Compile

Optimization(可选非必要)

Simulation

Questa生成波形文件

Makefile及tcl文件

Testbench:tb_top.sv

RTL:Saturate_top .vhd

VCS,QuestaSim均是FPGA常用仿真软件,下文将分别介绍这两款软件的使用流程及相关命令。

VCS
仿真流程包括Analysis,Elaboration和Simulation。

Analysis
作用:

编译文件(vhdl,verilog,system verilog等),检查语法错误,生成中间文件;

命令:

           vhdlan [vhdlan_options] file1.vhd file2.vhd                            % vhdl files

           vlogan [vlogan_options] file1.v file2.v                                    % verilog files

           vlogan -sverilog [vlogan_options] file1.sv file2.sv file3.v       % system verilog files

常用编译选项:

       -full64:64bit模式去做编译;

       -work library:将所用的library映射到WORK库,如altera ip的library;

       -l compile.log:指定编译所产生的log文件路径;

       -f filelist:指定某一类型文件的filelist;

       -timescale=time_unit/time_precision:指定仿真时间单位和精度,仅限于vlogan;

       -vhdl08:指定vhdl语言版本,仅限于vhdlan;

      -optimize:减少部分vhdl的检查来改善仿真性能(如下),缩减仿真时间,仅限vhdlan;

                            缺省算数溢出见检查(Arithmetic overflow)

                            缺省约束检查(Constraint checks)

                            缺省数组赋值大小兼容性检查(Array size compatibility at assignment)

                            缺省下标越界检查(Subscripts out of bounds)

                            缺省整数负指数检查(Negative exponents to integer)

     -no_opt:不采用优化(optimize)选项,全检查;

     -kdb:生成Verdi KDB数据库;

     -smart_order:自动识别文件的依赖关系,filelist的文件顺序可以任意放置,仅限vhdlan;

Elaboration
作用:

构建实例层级,生成二进制可执行文件;

命令:

vcs [elab_options] [libname.]design_unit     

                     libname:module/entity所在的库名,可省略;

                     design_unit:top module/entity/configuration name;

常用选项:

       -licqueue:如果license不可用则保持等待状态,直至license可用;

       -full64:使用64bit mode;

       -file filename:指定包含elaboration选项的文件;

       -gui:使用GUI的方式仿真;

       -l elab.log:指定elaboration所产生的log文件路径;

       +notimingcheck:忽略设计时序检查;

       -override_timescale=time_unit/time_precision:指定仿真时间单位和精度;

       -kdb:生成Verdi KDB数据库;

       -notice:显示详尽的诊断信息;

       -debug_acess+option:指定调试模式,常用:-debug_acess+pp,-debug_acess+all           +vcs+dumpvars:指定VCD文件,相当于$dumpvars函数;

       +vcs+vcdpluson:相当于$vcdpluson函数;

       -suppresses message_ID:屏蔽一些告警信息的显示;

       -error message_ID:屏蔽一些错误信息的显示;

       -lca:使用“VCS限制用户使用功能”

Simulation
作用:

运行二进制可执行文件,启动仿真,支持interactive模式和batch模式;

       interactive模式支持两种使用方式:1)GUI上启动仿真:simv -gui

                                                               2)DVE打开波形文件:dve -vpd vpdfile_name

命令:

executable [runtime_options]    %executable为可执行文件,一般默认为simv

常用选项:

       -gui=dve:打开DVE GUI界面,启动仿真;

       -gui=verdi:打开Verdi GUI界面,启动仿真;

       +vpdfile+filename:指定VPD文件的名字;

       +ntb_random_seed=value:设置随机变量的种子;

       -reportstats:捕获CPU的运行数据;

       -ucli:启用ucli命令行模式如:simv -ucli -do dump_vpd.tcl,dump_vpd.tcl如下;           

dump_vpd.tcl
 
dump -file tb_top.vpd -type VPD
dump -add tb_top -aggregates -fid VPD0
run
       -debug_pp:推荐生成VCD/VPD 文件的最佳配置,综合考虑debug性能和时间;

       -debug:debug能力好于debug_pp,花费时间长;

       -debug_all:最好的debug性能,花费时间最长;

                           (类似于+debug_access+options)

VCS生成波形文件(debug模式)
DVE所用的.VPD文件
1) 使用Verilog System Tasks生成

       在testbench加入如下代码

initial
begin
    $vcdplusfile("tb_top.vpd");
    $vcdplusonend
end
       2)添加选项命令生成

                Elaboration:+vcs+vcdpluson

                Simulation:+vpdfile+sim.vpd(不指定名字,默认vcdplus.vpd)

      3)使用UCLI方式:仿真选项中加入-ucli -do dump_vpd.tcl

           dump_vpd.tcl:

dump -file tb_top.vpd -type VPD
dump -add tb_top -aggregates -fid VPD0
run
打开波形文件:dve -vpd tb_top.vpd

Verdi所用的.fsdb文件(打开-kdb和-fsdb选项)
1)使用使用Verilog System Tasks生成

      在testbench中加入如下代码:

initial
begin
    $fsdbDumpfile("tb_top.fsdb");
    $fsdbDumpvars(0,tb_top);
end
2)使用UCLI方式:仿真选项中加入-ucli -do dump_fsdb.tcl
dump -file tb_top.fsdb -type FSDB
dump -add tb_top -aggregates -fid FSDB0
run
打开波形文件:verdi -ssf tb_top.fsdb -nologo

Questa SIM
核心流程包括Compile,Optimization(可选),Simulation。

Compile
命令:

vlog [options] <filename> <filename>...     % verilog,system verilog files

vcom [options] <filename> <filename>...    % vhdl files

常用选项:

       -64:使用64bit模式编译;

       -2008:指定VHDL语言版本,仅限于vcom;

       -l:指定生成的log路径;

       -f:指定编译文件的filelist;

       -work library name:将编译目标编译到指定库中;

       -novopt:编译时不作优化;

       -lint:编译时作语义检查,如访问数组的范围越界等;

       -quiet:过滤一些加载库的信息,使得log信息更简洁;

       -incr:增量编译,只编译相对上次编译有改动的文件,仅限于vlog;

       -timescale=time_unit/time_pre:指定仿真时间单位和精度;

       -cover:使能覆盖率检查;

Optimization(可选非必要)
命令:

vopt [options] testbench_name -o executable_name

常用选项:

       +acc :保留仿真中某个模块的可见性;

                     +acc:所有的模块都可见;

                     +acc+mod1:mod1模块可见;

       -override_timescale=1ns/1ns:重覆盖仿真时间单位和精度;

       -incr:增量优化;

       -L library:指定提前编译好的库;

Simulation
命令:

vsim [options]  

常用选项:

       +notimingchecks:不进行时序检查;

       -lib libray_name:指定包含编译目标的库文件;

       -solvefaildebug=value:使能随机化失败调试,如果value省略,则使能基本调试功能;

       -do "<command_string>" | do_file_name:传入并执行tcl命令或者脚本文件;

       -f filename:传入带有仿真选项的文件,可在仿真过程中解析并采用这些仿真选项;

       -batch/-c/-gui/-i/:采用不同的工作模式;

              -batch:后台模式,-c:命令行模式,-gui:用户界面模式,-i:交互模式。

       -sv_seed <integer>| random:用于指定仿真时的随机种子

       -wlf <file_name>:指定保存的保存文件,默认输出vsim.wlf;

       -coverage:使能覆盖率收集,但要求编译时添加+cover选项;

Questa生成波形文件
QuestaSim使用的wlf文件

        Testbench中加入:

initial 
begin
    $wlfdumpvars();
end
打开波形文件: vsim vsim.wlf

Makefile及tcl文件
#Makefile
#!/bin/sh
 
.PHONY: default
default: all
 
SIM_TOOL=$(shell echo $(tool))
 
VCS_VHDL_COMP_OPTS  = -full64
VCS_VHDL_COMP_OPTS += -no_opt
VCS_VHDL_COMP_OPTS += -kdb
VCS_VHDL_COMP_OPTS += -vhdl08
VCS_VHDL_COMP_OPTS += -smart_order
 
VCS_VERILOG_COMP_OPTS  = -full64
VCS_VERILOG_COMP_OPTS += -timescale=1ns/1ps
VCS_VERILOG_COMP_OPTS += -kdb
 
VCS_ELAB_OPTS     = -full64
VCS_ELAB_OPTS    += -override_timescale=1ns/1ps
VCS_ELAB_OPTS    += +vcs+vcdpluson
VCS_ELAB_OPTS    += -debug_access+all
VCS_ELAB_OPTS    += +vcs+lic+wait
VCS_ELAB_OPTS    += -kdb
VCS_ELAB_OPTS    += -fsdb
VCS_ELAB_OPTS    += -lca
 
VCS_RUN_OPTS     = +ntb_random_seed=1
VCS_RUN_OPTS    += +time_out=500
VCS_RUN_OPTS    += -reportstats
#VCS_RUN_OPTS    += -ucli -do dump_vpd.tcl
#VCS_RUN_OPTS    += -ucli -do dump_fsdb.tcl
VCS_RUN_OPTS    += +vpdfile+simulation.vpd
#VCS_RUN_OPTS    += +fsdbfile+sim.fsdb
 
 
 
QUESTA_VHDL_COMP_OPTS  = -64
QUESTA_VHDL_COMP_OPTS += -2008
QUESTA_VHDL_COMP_OPTS += -work work
QUESTA_VHDL_COMP_OPTS += +cover
#QUESTA_VHDL_COMP_OPTS += -novopt
#QUESTA_VHDL_COMP_OPTS += -lint
#QUESTA_VHDL_COMP_OPTS += -quiet
 
 
QUESTA_VERILOG_COMP_OPTS   = -incr
QUESTA_VERILOG_COMP_OPTS  += -work work
#QUESTA_VERILOG_COMP_OPTS  += -novopt
#QUESTA_VERILOG_COMP_OPTS  += -lint
#QUESTA_VERILOG_COMP_OPTS  += -quiet
#QUESTA_VERILOG_COMP_OPTS  += +cover
 
QUESTA_VOPT_OPTS    = -incr
QUESTA_VOPT_OPTS   += -L work
QUESTA_VOPT_OPTS   += -work work
QUESTA_VOPT_OPTS   += -override_timescale=1ns/1ns
QUESTA_VOPT_OPTS   += +acc
QUESTA_VOPT_OPTS   += -novopt
 
QUESTA_RUN_OPTS     = -lib work
QUESTA_RUN_OPTS    += -solvefaildebug
QUESTA_RUN_OPTS    += -sv_seed 1
QUESTA_RUN_OPTS    += -c
#QUESTA_RUN_OPTS    += -wlf sim.wlf
QUESTA_RUN_OPTS    += -do questa.tcl
QUESTA_RUN_OPTS    += +time_out=500
QUESTA_RUN_OPTS    += -coverage
 
 
COMP_LOG_DIR = comp_log
ELAB_LOG_DIR = elab_log
RUN_LOG_DIR = sim_log
 
 
 
ifeq ($(SIM_TOOL), vcs)
    COMP_VHDL_CMD = vhdlan
    COMP_SV_CMD = vlogan -sverilog
    COMP_VHDL_OPTS = $(VCS_VHDL_COMP_OPTS)
    COMP_VERILOG_OPTS = $(VCS_VERILOG_COMP_OPTS)
    ELAB_OPTS = $(VCS_ELAB_OPTS)
    ELAB_CMD = vcs
    RUN_OPTS = $(VCS_RUN_OPTS)
    RUN_CMD = simv
else
    COMP_VHDL_CMD = vcom
    COMP_SV_CMD = vlog
    COMP_VHDL_OPTS = $(QUESTA_VHDL_COMP_OPTS)
    COMP_VERILOG_OPTS = $(QUESTA_VERILOG_COMP_OPTS)
    ELAB_OPTS = $(QUESTA_VOPT_OPTS)
    ELAB_CMD = vopt
    RUN_OPTS = $(QUESTA_RUN_OPTS)
    RUN_CMD = vsim simv
endif
 
.PHONY: init
init:
    mkdir -p $(COMP_LOG_DIR)
    mkdir -p $(ELAB_LOG_DIR)
    mkdir -p $(RUN_LOG_DIR)
 
.PHONY: comp
comp:
    @$(COMP_VHDL_CMD) $(COMP_VHDL_OPTS) -f tb_dsp_vhd.f -l $(COMP_LOG_DIR)/comp_dut.log
    @$(COMP_SV_CMD) $(COMP_VERILOG_OPTS) -f tb_sv.f -l $(COMP_LOG_DIR)/comp_tb.log 
 
 
.PHONY: elab
elab:
    $(ELAB_CMD) $(ELAB_OPTS) tb_top -o simv -l $(ELAB_LOG_DIR)/elab.log
 
 
.PHONY: sim
sim:
    $(RUN_CMD) $(RUN_OPTS) -l $(RUN_LOG_DIR)/sim.log
 
 
.PHONY: all
all: clean init comp elab sim
 
 
.PHONY: clean
clean:
    -rm -r $(COMP_LOG_DIR) $(ELAB_LOG_DIR) $(RUN_LOG_DIR)
    -rm *.log *.rc *.conf *.sdb *.dump
    -rm *.wlf *.fsdb *.vpd 
    -rm simv
    -rm -r 64 AN.DB DVEfiles simv.daidir work work.lib++ vhdlanLog ucli.key
    -rm -r csrc verdiLog fontconfig

dump_vpd.tcl:

dump -file tb_top.vpd -type VPD
dump -add tb_top -depth 0 -aggregates -fid VPD0
run
dump_fsdb.tcl:

dump -file tb_top.fsdb -type FSDB
dump -add tb_top -aggregates -fid FSDB0
run
执行命令:make all tool=vcs             %使用VCS

                  make all tool=questa        %使用Questa

Testbench:tb_top.sv
`timescale 1ns/1ps 
 
module tb_top;
 
logic clk;
logic reset;
 
logic [3:0] a;
 
logic [2:0] b;
logic [2:0] c;
 
 
    initial  begin
        clk = 0;
        reset = 1;
        
        #100;
        
        reset = 0;
        #50;
        
        @(posedge clk)
        a = 6;
        @(posedge clk);
 
        
    end
 
always #5 clk = ~clk;
 
 
//initial begin
//$vcdplusfile("sim.vpd");
//$vcdpluson;
//end
 
 
//initial begin
//    $wlfdumpvars();
//end
 
//initial begin
//    $fsdbDumpfile("tb_top.fsdb");
//    $fsdbDumpvars(0,tb_top);
//end
 
 
Saturate_top inst_Saturate_top(
    .clk            (clk),
    .reset            (reset),
    .dataIn            (a),
    .dataOut_f1        (b),
    .dataOut_f2        (c)
 
);
 
 
initial begin
    integer time_out;
      if(!$value$plusargs("time_out=%d",time_out)) begin
        time_out=200;
        $display("Info: Simulation timeout is %0d seconds", time_out);
      end else begin
        $display("Info: Simulation timeout is %0d seconds", time_out);
      end 
      repeat (time_out) @ (posedge clk);
      $display("Info: Simulation timeout");
      $display("*********************************************************************");      
      $display("**************************SIMULATION FINISH**************************");
      $display("*********************************************************************"); 
      $finish;
end    
 
 
endmodule;

RTL:Saturate_top .vhd
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
LIBRARY work;
--------------------------------------------------------------------------------
--
--  Entity        :  Saturate_top 
--
--------------------------------------------------------------------------------
ENTITY Saturate_top IS
    PORT (
        ------------------------------------------------------------------------
        -- Chip Inputs clock, reset
        ------------------------------------------------------------------------
        clk                           : IN     std_logic;
        reset                         : IN     std_logic;
        
        dataIn                          : IN            std_logic_vector(3 DOWNTO 0);                      
        dataOut_f1                      : BUFFER        std_logic_vector(2 DOWNTO 0);                      
        dataOut_f2                      : BUFFER        std_logic_vector(2 DOWNTO 0)                      
        
    );
END ENTITY Saturate_top;
--------------------------------------------------------------------------------
--
--  Architecture  :  rtl
--  of Entity     :  Saturate_top
--
--------------------------------------------------------------------------------
ARCHITECTURE rtl OF Saturate_top IS
CONSTANT Outwidth : natural := 3;
CONSTANT Inwidth  : natural := 4;
   
BEGIN
    ----------------------------------------------------------------------------
    -- Synchronous process
    ----------------------------------------------------------------------------
    clk_reg: PROCESS (clk) IS
    BEGIN
        ------------------------------------------------------------------------
        -- Clock section
        ------------------------------------------------------------------------
        clk_if: IF (clk'EVENT AND clk = '1') THEN
                IF ( dataIn(Inwidth - 1 downto Outwidth - 1) = "11"  ) or (dataIn(Inwidth - 1 downto Outwidth - 1) = "00") THEN
                    dataOut_f1 <= dataIn(Inwidth-1) & dataIn(Outwidth-2 downto 0);
                ELSE
                    dataOut_f1 <= dataIn(Inwidth-1) & not dataIn(Inwidth-1) & not dataIn(Inwidth-1);
                END IF;
          
            ------------------------------------------------------------------------
            -- Reset section
            ------------------------------------------------------------------------
            i_reset_if: IF (reset = '1') THEN
                -- Outputs are reset
             
                dataOut_f1 <= (OTHERS => '0');
                dataOut_f2 <= (OTHERS => '0');
            
            END IF i_reset_if;
            
        END IF clk_if;
        
    END PROCESS clk_reg;
    
END ARCHITECTURE rtl;

————————————————
版权声明:本文为CSDN博主「李大毛hh」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_25749155/article/details/126486151

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值