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;

     +define+macro=value:定义testbench中的宏;

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限制用户使用功能”

       -gv generic_name=value:重写DUT中的GENERIC参数

       -gfile cmd.txt:重写DUT中多个generic or parameter

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");
    $vcdpluson();
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

vlib dut_lib_ws                       %建立一个物理库文件夹,一般编译前完成

vmap  dut_lib  dut_lib_ws      %将编译库链接到建立好的物理库文件夹(必须采用vlib建立)

常用选项

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

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

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

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

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

       -novopt:编译时不作优化;

        -norangecheck:仿真时不对变量范围进行检查,某些设计中会提高两倍的仿真速度;

        -noindexcheck:仿真时不对数组索引下标进行检查;

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

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

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

       +incdir+SOURCE_PATH当verilog或sv文件中出现`include "*.v/*.sv" 时,指定包含文

                                                  件的搜索路径,若缺省则会搜索当前路径;

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

       -cover:使能覆盖率检查;

       +define+macro=value:传递参数到testbench中的宏;

Optimization(可选非必要)

命令

vopt [options] testbench_name -o executable_name

常用选项

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

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

                     +acc+mod1:mod1模块可见;

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

       -incr:增量优化;

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

       -G generic_name=value:重写DUT内部的GENERIC or parameter

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_VERILOG_COMP_OPTS += +define+TEST=15

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_VERILOG_COMP_OPTS   +=+define+TEST=15

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;

`define TEST 1

logic clk;
logic reset;

logic [3:0] a;

logic [2:0] b;
logic [2:0] c;

int test = `TEST;

	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;

  • 20
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值