锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

UVM笔记

时间:2022-08-22 20:30:00 p119举升传感器

记录了一些问题,笔记的内容基本上来自UVM实战,不得不说,这本书真香!

1. `uvm_fatal(参数1,参数2) ,打印第二个参数后,将直接调用Verilog的finish结束仿真的函数(P60)

2. 无论传递给run_test参数是什么?创建的例子的名称是uvm_test_top.

3. 在drive_one_pkt 中,先将tr所有数据压入队列data_q中,之后再将data_q所有数据弹出并驱动。tr数据压入队列data_q中间的过程相当于打包成一个byte流动过程。这个过程也可以使用SystemVerlog实现提供的流操作符。(P68)

4. driver,monitor为什么很多组件不在等等?top_tb中例化? 在top_tb中使用run_test实例化显然不好,因为run_test虽然函数很强大,但只能实例化一个例子(P70)。

5. phase执行顺序:build_phase执行遵循从根到叶的顺序,即先执行my_env的build_phase,再执行 my_driver的build_phase。当整棵树build_phase执行完毕后,再执行后面的phase(P73);与build_phase不同的是,connect_phase执行顺序不是从根到叶,而是从叶到根-先执行driver和monitor的connect_phase,再执行agent的connect_phase,最后执行env的connect_phase。(P95)

6. 发送数据的方式有很多,其中一种是使用uvm_analysis_port,write它是内建函数;数据接收的方有很多种,其中一种是使用uvm_blocking_get_port,在main_phase中,通过port.get任务从i_agt的monitor中发出的transaction;在my_monitor和my_model定义并实现各自的端口后,通信功能尚未实现,需要在my_env中使用fifo连接两个端口。为什么这里需要一个?fifo呢?为什么这里需要一个?fifo呢?不能直接把my_monitor中的analysis_port和my_model中的blocking_get_port相连吗?由于 analysis_port是非阻塞性质,ap.write函数调用完成后立即返回,不会等待数据接收。假如当write调用函数时,blocking_get_port当我忙于其他事情而没有准备好接收新数据时,这个时候我个时候write函数写入my_transaction需要一个临时存储位置,即fifo。(P95)

7. 每一个 sequence都有一个body任务,当一个sequence启动后,将自动执行body中的代码,body中间的代码可以自定义并添加`uvm_do,`uvm_do 它用于:①创建一个my_transaction的实例m_trans;②随机化;③最后送给它 sequencer。(P116)

8. driver如何向sequencer申请transaction呢?在uvm_driver有成员变量seq_item_port,而在uvm_sequencer有成员变量seq_item_export,两者之间可以建立一个通道,两者连接后,就可以在driver中通过get_next_item任务向sequencer申请新的transaction.(P117)

9. sequence启动方式:1)调用start任务。start任务的参数是一个sequencer指针,如果指针没有指明,sequence不知道会发生什么transaction交给哪个sequencer。例如:seq.start(i_agt.sqr) P119; 2)第一种启动方式,sequence是在my_env的main_phase在实际应用中,手动启动最常用default_sequence的方式启动sequence。使用default_sequence方法很简单,只需要在某个地方component(如my_env)的build_phase设置以下代码:(P122)

virtualfunctionvoidbuild_phase(uvm_phasephase); super.build_phase(phase); uvm_config_db#(uvm_object_wrapper)::set(this,"i_agt.sqr.main_phase","default_sequence",my_sequence::type_id::get());  endfunction  

9. 设置UVM_ERROR 模拟退出阈值有两种方法:1)测试用例build_phase添加一行代码 set_report_max_quit_count(5),表示当UVM_ERROR达到5后,模拟退出,除了build_phase外,在其他phase也可以设置;2)第二种方法是在模拟命令行中添加 UVM_MAX_QUIT_COUNT=6,NO 第一个参数6表示退出阈值,第二个参数NO这意味着该值不能被后面设置的句子重载,其值也可以是YES。(P198)

10. UVM支持内部建筑的断点功能,当执行到断点时,自动停止模拟,进入交互模式。(P203)

11. UVM例如,可以将特定信息输出到特定日志文件中UVM_INFO、UVM_WARNING、UVM_ERROR及UVM_FATAL分类输出到指定的不同文件中,也可以根据id进行分类。(P205)

12. cfg_db的set/get四个参数是什么意思?

uvm_config_db#(int)::set(this, "env.i_agt.drv", "pre_num", 100); 

set: 第一个和第二个参数结合形成目标路径,符合这条路径的目标可以接受。第一个参数必须是一个uvm_component实 例子指针,第二个参数是相对于这个例子的路径。第三个参数表示一个标记,以解释该值传递给目标中的哪个成员,第四个参数是要设置的值。

uvm_config_db#(int)::get(this, "", "pre_num", pre_num); 

get: get函数中的第一个参数与第二个参数组合形成路径。第一个参数也必须是一个uvm_component第二个参数是相对于这个例子的路径。一般来说,如果将第一个参数设置为this,第二个参数可以是空字符串。第三个参数是set函数中的第三个参数必须严格匹配,第四个参数是要设置的变量。(P215)

13. 当要在test添加内容,这种变化将涉及所有内容testcase此时可以从两个方面考虑,1)添加或修改的内容是否可以移植到base_test中间,因为用户自己写testcase都是继承于base_test,2)模拟命令行是否可以实现要添加的内容。

14. PORT和EXPORT它反映了控制流而不是数据流。因为在put在操作中,数据流是从PORT流向EXPORT的,而在get在操作中,数据EXPORT流向PORT的。但是无论是get还是put操作,其发起者拥有的都是PORT而不是端口EXPORT。作为一个EXPORT来说,只能被动地接收PORT的命令。(P249)

15. UVM将端口固定为只能执行某种操作,例如uvm_blocking_put_port#(T),它只能执行阻塞put操作,要执行非阻塞性操作put操作不好,想执行get操作也不好,更不用说执行了transport操作了。如果你想让它做另一个操作,最好的办法就是用另一个端口。

16. 对于blocking对于系列端口,函数或任务可以定义nonblocking对于系列端口,函数只能定义,因为它需要立即返回,而且没有时间。(P270)

17. UVM主要有中端口类型blocking/unblocking_get_port/export/imp,blocking/unblocking_put_port/export/imp,blocking/unblocking_transport_port/export/imp,除此之外,还有两个特殊的端口:analysis_port和analysis_export,特点是:1)一个analysis_port(analysis_export)多个可以连接IMP,2)没有阻塞和非阻塞的概念,3)只有一个操作:write,定义在analysis_imp所在的component中。(P291)

18. uvm_tlm_analysis_fifo如图所示,虽然名字中有许多端口export,但本质上都是IMP(P307)

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章