1. get_type_name()是uvm_object类的一个内置函数,其解释如下:
This function returns the type name of the object, whichis typically the type identifier enclosed in quotes.
2. 带parameter的类需要用uvm_component_param_utils注册,注册时需要传递参数,如:
`uvm_component_param_utils(driver #(T));
`uvm_component_param_utils(comp #(T,WIDTH))
带参数的packet类用field_automation机制注册时用如下方式:
`uvm_object_param_utils_begin(packet #(T,WIDTH))
......
`uvm_object_utils_end
3.对于带parameter的packet如:
class packet #(parameter AW = 12, parameter DW = 32) extends uvm_sequence_item;
其在定义fifo指定fifo传递的packet类型时也必须指定该参数:
uvm_tlm_analysis_fifo #(packet #(.AW(12), .DW(16))) irom_ref_fifo;
并且发送端口ap和接收端口port也都必须带上参数。
即该packet带参数,任何使用它的地方也都得带参数。
4.fifo的函数 used ——Returns the number of entries put into the FIFO.
5.config_db的set函数没有返回值。
6.写monitor的思想与driver不一样,monitor的main_phase中一般会有循环一直进行,但是在collect_one_pkt中必须考虑清楚进行采样的条件。
7.写monitor时条件控制不好就特别容易进入死循环,右边的图如果没有第一行的等待时钟,则每次进入collect这个函数,下面两行的while循环条件就是上次sample的条件,仿真会一直停在这个时间点。
还有一种写法是:将前三行代码改为
正在上传…重新上传取消填写图片摘要(选填)
while(1) begin
@(posedge spi_bus_if.clk);
if(!spi_bus_if.mreq) break;
end
8.如果fifo定义在scoreboard内部,则不需要再定义用于get的port。
9. 只有seq设置为sqr的default_sequence,用uvm_do其pre_body和post_body才执行。即vseq设置为vsqr的default_sequence后,其内部的子seq的pre_body和post_body默认不执行,因为一般推荐在pre_body和post_body提起和关闭objection,并且只在最顶层的seq中提起和关闭。
10.packet中定义一个动态数组或队列,需要在约束中约束他们的size,q.size()==5,否则uvm_do不会去随机他们。
11. 当仿真器asserton assertoff的时候用assert就不能检查有没有随机成功,所以用`SV_RAND_CHECK
12.uvm_sequencer的方式写virtual sequencer。
13.agent的get_is_active()函数可以返回is_active的值。
14.在scb中添加report_phase其中检测fifo中是否还有包
15.用一个component来收集覆盖率,func_cov中定义imp用于接收mon的包,一般多个monitor向func_cov发包,这时候在func_cov中的写write函数之前要用`uvm_analysis_imp_decl()处理
16.testcase中用set_seq的方式设置sequence为sequencer的default_sequence
17.在UVM环境中不要使用$display
18.transport操作的函数定义接口一个是input,一个是output。
19.
a.monitor向scb put,port在monitor,export和imp在scb,scb中实现put方法。
b.scb从mon get,port在scb,export和imp在monitor,monitor中实现get方法。
c.scb从monitor transport,port在scb,export和imp在monitor,monitor中实现export方法。
20.讨论验证功力的帖子
https://www.mysmth.net/nForum/#!article/METech/332829
21.uvm_config_db是一个参数化的类,#()中的参数是要寄信的类型,set和get是其两个静态函数
22.uvm_fatal执行完打印之后会调用verilog的$finish
23.对象名称可以和实例化名称不一样
24.冗余度:UVM_DEBUG>UVM_FULL>UVM_HIGH>UVM_MEDIUM>UVM_LOW>UVM_NONE
25.用uvm_hdl_force或reg_model后门访问寄存器报错:you may have not sufficient plight/acc capabilities,原因:uvm_hdl_force这个DPI需要 vpi pli的实现支持,需要一些访问权限,解决方法:编译选项中加-debug_all,这样仿真可以获取设计编译后数据库的全部访问权限。弊端在于会使仿真速度变慢。