问题描述:
我用SystemVerilog进行设计,并用同一种语言编写测试平台。我希望能够编译我的设计,并在模拟过程中测试不同的功能,就像您使用带有e的解释器一样。理想情况下,当模拟器遇到某行时,我会在模拟时弹出一个终端。
潜在想法:
我看过DPI-C,似乎我必须“导出”项目中的所有任务,以便从解释器运行它们。但是,我不确定如何自动完成此操作,或者是否有更好的方法。此外,我不知道如何让C为我打开第二个shell来输入SystemVerilog任务(我想运行的任务)。
这是我的同事们所提出的一个问题,如果在编译一个测试平台之间不需要等待10分钟,那么生活就会少很多痛苦。
3条答案
按热度按时间drkbr07n1#
你好,我提供我的两分钱与另一个例子。
示例SV-CODE
C-CODE
**Python脚本-TEST.py,**删除标签非常重要!!!!!!
最后,您必须使用供应商流程编译文件。例如:奎斯塔
1.你可以使用ccflags编译C代码,并引入你想要添加的定义。在我们的例子中,我们的C代码需要定义PYTHON_PATH
vlog $DUT_VLOG_ARGS ${TB_DIR}/your_C_code.c -ccflags“-I/usr/include/python2.6/ -D 'PYTHON_PATH="$PYTHON_DIR”“
1.在奎斯塔中,如果你有python,你必须调用vsim,包括**-ldflags '-lpython2.6'**类似于:
vsim -ldflags '-lpython2.6' -voptargs="+acc”-solvefaildebug -assertdebug -onfinish stop +UVM_TESTNAME=${TESTCASE_STRING} yourtop_tb_top \
新思VCS
1.你可以使用ccflags编译C代码,并引入你想要添加的定义。在我们的例子中,我们的C代码需要定义PYTHON_PATH
GCC在两个步骤中共享对象gcc -g -D 'PYTHON_PATH=“'$PYTHON_DIR'"' -fPIC -Wall -I${VCS_HOME}/include -I/usr/include/python2.6/ -lpython2.6 -c ${PROJECTDIR}/verification/PVE/keycontrol/tb/keycontrol_C_code_wrapper.c gcc -fPIC -shared -o keycontrol_C_code_wrapper. so keycontrol_C_code_wrapper.o
1.使用**-LDFLAGS '-lpython2.6'链接python库进行VCS细化
vcs -timescale=1ps/1ps -ntb_opts uvm -lca -kdb -full64 keycontrol_tb_top -debug_access+all+reverse -LDFLAGS '-lpython2.6'
1.运行创建的仿真文件。调用simvincluding-sv_lib keycontrol_C_code_wrapper**导入C共享对象。
运行C代码。/simv -gui -ucli +DVE +UVM_NO_RELNOTES -l simv.log +UVM_TESTNAME=keycontrol_basic_test -do ../../verification/PVE/keycontrol/tools/keycontrol_ucli_init.synopsys -sv_lib keycontrol_C_code_wrapper
另一个工具会有另一个流程。
在python脚本中嵌入python是一种比FILE IO更有效的解决方案。
如果你的python脚本从文件中读取输入和输出,那么从Systemverilog调用python最简单的方法就是执行系统调用。
当然,您必须在systemverilog中写入输入文件,并在systemverilog中读取输出文件以进行比较。
14ifxucb2#
如何去模拟器的交互式命令行终端。这不是一个典型的shell终端,比如unix。这是一个供应商指定的互动模式捆绑到模拟器。在大多数情况下,它由Verilog的
$stop
触发。它是特定于供应商的,所以你需要参考你的手册来了解所有的功能,有些功能允许调用Verilog/SystemVerilog中定义的任务和函数。听起来也不需要在一个模拟中运行所有条件。在您的情况下,一次编译多次运行策略应该是可行的。SystemVerilog系统函数
$test$plusargs
和$value$plusargs
可以检测用于启动仿真的参数。参见IEEE Std 1800-2012 § 21.6 * 命令行输入 *然后编译一次,并根据需要多次启动模拟。
hlswsv353#
最好的办法是使用DPI和某种脚本语言进行测试。例如,我看到这个工作很好:Python -> Boost.Python -> C++ -> DPI -> Verilog/SystemVerilog
它确实限制了你在测试中可以做的事情(将它作为两种语言之间的TLM接口,即只在它们之间来回传递事务),但实际上这通常会迫使你使用良好的抽象实践。阅读Python中的“yield”,了解如何在Python和模拟器之间来回传递控制。