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错误,为了解决这个问题,有两个折中方案。
YASAsim -t sanity1 -sim_option " -UVM_RANDOM_SEED=12345"
‘-’加空格YASAsim -t sanity1 -sim_option="-UVM_RANDOM_SEED=12345"
加=
详细解决方案的参考Can’t get argparse to read quoted string with dashes in it?