推荐一款好用的跑仿真的开源python脚本

YASA

YASA - Yet Another Simulation Architecture

YASA是一款跑IC软件仿真的开源框架。它支持synopsys vcs和cadence irun。支持synopsys 2-step或者3-step的仿真flow。它支持SV/UVM或者纯verilog的testbench,支持lsf作业调度系统。
它提供了一系列灵活的配置选项。用户可配置的文件有三个:userCli.cfg,build.cfg,group.cfg。

userCli.cfg

userCli.cfg提供用户自定义命令行选项。

[userCli]

    [[vh]] #set verbosity to UVM_HIGH
    sim_option = +UVM_VERBOSITY=UVM_HIGH

    [[prof]]
    compile_option = -simprofile0
    sim_option = -simprofile time

    [[$wave_name]] #set fsdb waveform name
    sim_option = "+WAVE_NAME=$wave_name"

    #general CLI,user should not edit it
    [[$pre_comp_option]]     #previous compile option

    [[$comp_option]]         #compile option
    compile_option = $comp_option

    [[$post_comp_option]]    #post compile option

    [[$pre_sim_option]]      #previous sim option

    [[$sim_option]]          #sim_option
    sim_option = $sim_option

    [[$post_sim_option]]     #post sim option

两个中括号扩住的文字就是一个命令行选项。例如 [[vh]] ,可以这么用
YASAsim -t sanity1 -vh -vh 后面不可以在更配置信息
如果想,可以参考 [[$wave_name]] 这么用:

YASAsim -t sanity1 -wave_name test1 wave_name 后可以跟一些文字

[[xxx]], xxx关键字区分大小写

build.cfg

build.cfg提供关于整个testbench的设置信息,例如要读取的filelist,一些通用的编译时选项和仿真时选项等。

#user defined build option(keyword can't be deleted)
[build]
default_build = jvs_memory
compile_option = -sverilog -ntb_opts uvm
compile_option = -full64 -notice -assert svaext
compile_option = -lca 
#compile_option = -debug_access+pp
compile_option = -P $NOVAS_TAB $NOVAS_PLI 
compile_option = +vcs+lic+wait
compile_option = -f $PRJ_HOME/etc/jvs.f
pre_compile_option = $PRJ_HOME/bin/pre_compile.csh
post_compile_option = $PRJ_HOME/bin/post_compile.csh
pre_sim_option = $PRJ_HOME/bin/pre_sim.csh
post_sim_option = $PRJ_HOME/bin/post_sim.csh

    [[jvs_memory]]
    testdir = $PRJ_HOME/testcases/jvs_memory    
    compile_option = -timescale=1ns/10ps 
    compile_option = $PRJ_HOME/tb/jvs_memory_tb.sv -top jvs_memory_tb

    [[jvs_irq]]
    testdir = $PRJ_HOME/testcases/jvs_irq
    compile_option = -timescale=1ns/10ps 
    compile_option = $PRJ_HOME/tb/jvs_irq_tb.sv -top jvs_irq_tb

    [[jvs_reg]]
    testdir = $PRJ_HOME/testcases/jvs_register_region
    compile_option = -timescale=1ns/10ps 
    compile_option = $PRJ_HOME/tb/jvs_register_region_tb.sv -top jvs_register_region_tb

    [[jvs_clk_rst]]
    testdir = $PRJ_HOME/testcases/jvs_clk_rst_group
    compile_option = -timescale=1ns/10ps 
    compile_option = $PRJ_HOME/tb/jvs_clk_rst_group_tb.sv -top jvs_clk_rst_group_tb

整个build.cfg中有几个关键保留字段。testdir,compile_option,sim_option ,pre_compile_option ,post_compile_option ,pre_sim_option ,post_sim_option。这些保留字段分别配置不同的信息。testdir指定仿真testcase所在路(TODO是否只能设置一次)。compile_option指定仿真的编译选项,sim_option指定仿真时选项。这两个字段相关的信息会生成到最终的compile.csh中。
pre_compile_option 对应的配置信息最终会写到pre_compile.csh中。其他的类推。
[[build]]中的是一些通用选项。也就是说candy_lover和candy_lover_regr都会包含build下的配置。
如果你在仿真时,不输入你打算使用哪个build(哪个testbench),默认会使用default_build 设置的那个build。例如。
YASAsim -t sanity1 就会默认使用default_build设置的build配置的相关testbench的信息。
YASAsim -b jvs_reg -t sanity1 就会默认使用jvs_reg配置的相关testbench的信息。

group.cfg

group.cfg提供了对一组要进行仿真testcase的信息的描述。

#user defined testgroup option(keyword can't be deleted)
[testgroup]

    [[jvs_memory]]
    build = jvs_memory
    args = -vh
    tests = jvs_memory_showcase

    [[jvs_irq]]
    build = jvs_irq
    args = -vh
    tests = jvs_int_simple_test
    tests = jvs_msi_irq_test
    tests = jvs_soft_irq_test

    [[jvs_reg]]
    build = jvs_reg
    tests = jvs_register_region_test

    [[jvs_clk_rst]]
    build = jvs_clk_rst
    tests = jvs_clk_rst_group_basic_test

以jvs_irq group为例。build=jvs_irq 说明使用jvs_irq 这个build指定的testbench的配置信息。args =-vh,指定仿真时选项。build和args字段只能出现一次。build只能有一个,但是args字段对应的信息可以有多个。例如:
args = -vh -r 5 -seed 1 意思是 jvs_irq group中的所有三个case都要使用args指定的仿真时选项。-vh 是设置+UVM_VERBOSITY=UVM_HIGH。-r 5意思是每个case跑5遍。-seed 1意思是用sv seed为1。
但是有一点需要注意的是, tests字段指定的选项的优选级更高,会覆盖掉args中设置的通用配置。例如:
tests = jvs_soft_irq_test -seed 12345
这时,jvs_soft_irq_test 就会使用seed 12345而不是seed 1跑5遍。

典型的用法:

  • show help doc

    %> python3 yasaTop.py -h

  • show YASA doc file and copyright

    %> python3 yasaTop.py -doc

  • show YASA version

    %> python3 yasaTop.py -version

  • compile only, build candy_lover, unique_sim mode

    %> python3 yasaTop.py -b candy_lover -co -u

  • compile only, testcase sanity1

    %> python3 yasaTop.py -t sanity1 -co

  • running testcase sanity1, 5 times,each time with random seed

    %> python3 yasaTop.py -t sanity1 -r 5

  • running testcase sanity1 with seed 352938188

    %> python3 yasaTop.py -t sanity1 -seed 352938188

  • running testcase sanity1 with seed 352938188, sim only

    %> python3 yasaTop.py -t sanity1 -seed 352938188 -so

  • compile only, group top_smoke

    %> python3 yasaTop.py -g top_smoke -co

  • running group top_smoke, use 5 threads

    %> python3 yasaTop.py -g top_smoke -p 5

项目的github地址是YASA,
对应使用YASA作为仿真脚本的实例的github地址如下:
YasaUvk, uvm_candy_lover

Issue

YASAsim -t sanity1 -sim_option "-UVM_RANDOM_SEED=12345"时会语法问题,因为"-UVM_RANDOM_SEED=12345"中的‘-’也会被作为一个命令的分隔符,因而出现argparser错误,为了解决这个问题,有两个折中方案。

  1. YASAsim -t sanity1 -sim_option " -UVM_RANDOM_SEED=12345" ‘-’加空格
  2. YASAsim -t sanity1 -sim_option="-UVM_RANDOM_SEED=12345" 加=

详细解决方案的参考Can’t get argparse to read quoted string with dashes in it?

你可能感兴趣的:(Python,脚本语言,IC验证,YASA,python,simulation,script)