scoreboard
参考模型(c等语言写的)的输出与DUT的输出进行比对
两条路:
- driver驱动monitor采样给reference model
- driver驱动dut,monitor采样传给scoreboard
uvm_tlm_amalysis_fifo
monitor port 传给scoreboard export,scoreboard是被动的
通过uvm_tlm_amalysis_fifo暂存,scoreboard变为主动
scoreboard的实现
实现内容
1.注册和new scoreboard
2.声明存放期待值的transaction型队列
3.声明用来与monitor相连接的uvm_tlm_analysis_fifo接口,并new该接口
4.声明期待与实际的transaction,并定义一个暂时存放先到来的期待transaction
5.打印期待值与实际值进行比较的信息
同时多个while死循环时,要用fork_join才能都执行:
实现scoreboard_imp的方式(更麻烦不常用)
//区分不同imp的write方法
uvm_analysis_imp_decl(_iagt)
uvm_analysis_imp_decl(_oagt)
……
virtual function void write_iagt(apb_trans data);
……
virtual function void write_oagt(apb_trans data);
……
不要让两个blocking在一个线程里面,blocking的问题debug很难
agent
确定好agent,框架清晰
只有active的agent中,才需要sequencer和driver
active时,driver工作
passive时,只有monitor工作
agent的实现
内容:
1.注册和new agent
2.声明sequencer、driver、monitor,并将其create
3.将UVM_ACTIVE的agent的driver与sequencer连接起来:
env & test
决定验证环境的结构和连接,使用哪一个测试序列
vsqr放在env中,vseq放在test(决定启动的sequence)中较好,有利于环境复用性
+UVM_TESTNAME=<testcase_string>选择test case
uvm_root::run_test(<testcase_string>)选择test case
top_tb中的 run_test(“test_name”); // test_name通过命令行UVM_TESTNAME参数传入重载了uvm_test
env的实现
内容:
1.注册和new environment
2.声明agent,并将其create
3.声明虚接口
4.声明agent的状态UVM_ACTIVE or UVM_PASSIVE:
base_test的实现
内容:
1.注册和new environment
2.声明env,virtual_sequencer,scoreboard,并将其create
3.将act_agt的sequencer句柄给到virtual_sequencer的sequencer句柄
4.连接monitor和scoreboard