推薦一款好用的跑仿真的開源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?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章