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?