VCS编译器:
- 先执行vlogan(compile):对设计文件进行编译,也即testbench.f,testbench.f 包含:
- “+incdir+”选项来告诉编译器include的头文件的路径;用“+”字符分隔每个路径名
- “-libext+”用于指定文件后缀名
- “-y”用于指定目录路径
- filelist文件
- 再执行vcs(elaborate):对库文件、第三方的链接软件进行编译处理
- 生成仿真的可执行文件.o,在simv.daidir下
- 若dump波形,还需要在编译中通过-P指定verdi的$fsdbDump函数的库
- 最后执行simv(simulate):
- Source launch.csh:launch.csh里包含了仿真选项
仿真执行流程:
- 由tb_top中initial…begin块的run_test()开始:
-
run_test在uvm_root中定义, 在uvm_globals.svh中被封装成任务,uvm_globals通过uvm_base.svh里被include,uvm_base.svh这个文件又是在uvm_pkg.svh里被include的,实现全局可见
-
可通过 run_test("my_case")或‘vcs ... +UVM_TEST_NAME=my_case’ 传入case名
-
run_test() 的作用:
1.自动实例化case,名字固定为uvm_test_top,为UVM树根
2.自动执行case中的build_phase,自顶向下,形成完整的UVM树结构;
3.自动执行其他uvm树结构中的其他phase,完毕后,结束仿真;
-
- uvm_top调用方法run_test(test_name),uvm_top做了如下的初始化:
- 报告总结和结束仿真
- 等待所有phase执行结束,关闭phase控制进程(通过objection机制来控制验证平台的关闭);
- 调用phase控制方法,安排所有组件的phase方法执行顺序;
- 创建uvm_test_top实例;
- 初始化objection机制;
- 得到正确的test_name;
- run_test()启动后,整个执行流程如下:
仿真结束方式:
- 调用系统函数$finish
- raising&drop_objection机制:
- objection机制用在:component的phase中、sequence的pre/post_body中;不能用在uvm_objection里
- objection机制用法:raise_objection/drop_objection成对使用
- 由于run_phase与run-time phase是并行运行的,如果12个动态运行的phase有objection被提起,那么run_phase 不需要raise_objection就可以自动执行:如果run-time phase中有objection的raise, run_phase没有,run-time phase和run_phase中内容都会执行;如果run-time phase中没有objection的raise,run_phase有,run-time phase不会执行,而run_phase会得到执行
- 当所有phase都执行完毕后,会调用$finish将整个验证平台关掉
- phase_ready_to_end(uvm_phase phase)
- 功能:是component类中的回调(callback)方法
- 用法:在基类中实现,并注册到UVM_component类中,在仿真阶段准备结束时或延迟一个phase到下个phase的过渡,调用该函数
- set_drain_time
- 功能:用于设置phase里面进程执行完成后延时drain_time时间后再结束该phase
- 用法:在phase中使用
objection.set_drain_time(this,100ns);
- 注意:一个phase对应一个drain_time,并不是所有phase共享一个drain_time