Q:在UVM环境中,怎么判断RTL输出没问题的?
A:相同激励发送到RTL和参考模型两端,然后通过monitor观测RTL接口上的输出信号,传到UVM的Scoreboard中,和参考模型(C_model)的输出结果对比,如果对比一致,则判定RTL输出没有问题。
在UVM环境中,我们通常是检查RTL接口信号的正确性。在验证过程中,某些特殊配置情况下,最终的输出信号是对的,但该信号输出前的中间信号是错的。
所以,想要把部分RTL的中间信号也使用scoreboard做对比,这是验证要求,怎么实现呢?
有几个问题:
Q1)UVM平台和RTL是通过Interface接口连接的,中间信号没有在接口上,怎么拿到这些中间信号?
Q2)怎么把中间信号传到Scoreboard中?
Q3)可以通过打印文件来对比吗?
问题分析&回答
A1:不用接口的话,UVM平台怎么和接口连接?这是拿到这个需求的时候最疑惑的问题
因为在UVM学习过程中,有一个概念,想要把UVM平台和RTL连接起来的话,必须要定义Interface接口,然后通过config_db把Interface传到uvm_test_top,再传到env,然后实例化Interface后驱动/观测接口中的信号。
中间信号不在接口上,也不能为了验证,让设计在RTL上加接口,那怎么才能拿到这些中间信号,其实在《UVM实战》上引出Interface接口之前,也调用RTL输出信号,方法就是使用绝对路径,在top层会实例化RTL的hdl_top模块,直接在top层写绝对路径调用RTL中的信号就好了。
例如,hdl_top.i_ctrl.i_cal.test_out //通过绝对路径调用test_out信号
在top层定义一个信号a;
logic a;
assign a = hdl_top.i_ctrl.i_cal.test_out;
这样就把RTL中的中间信号传到了top层的a信号上。
其实是最原始的做法,但是因为学UVM过程中思路僵化了,觉得不用接口就不能连接平台和RTL了。
回头想想最开始为什么要引入Interface?因为在top层是实例化了RTL的顶层hdl_top和验证平台的顶层hvl_top,两个顶层是相同层级,是为了防止接口信息变化,RTL绝对路径变化时导致需要重复修改的情况,引入了Interface接口,有修改的话只要改接口文件就好,增强了可移植性。
在该需求中,是额外的验证需要,且不能把中间信号放到RTL接口上,就只能通过绝对路径拿到需要检查的中间信号。
A2:拿到中间信号后,怎么把中间信号传导scoreboard对比呢?
对于接口上的输出信号,我们是通过config_db把Interface传到平台中
那我们可以通过config_dbb把信号传到平台中吗?
可以的,config_db是啥,configration database,配置数据库啊,他干的就是传送数据的工作。
具体用法可以参考我的另一篇文章《UVM验证架构——1)TOP》
那我们要一个个的把中间信号传到平台中吗?
可以,但是麻烦了,我们还是把所有信号都定义到一个Interface文件中,然后传输这个包含中间信号的接口文件更简洁一点,在内部需要观测中间信号的时候,通过Interface调用具体的信号就可以了。
Interface传到env层后,要写一个monitor类来采集有效期间的中间信号,采集到的有效信号通过ap.write写到fifo中,然后在env层 mon.ap.connect(scoareboard.mon_fifo.analysis_export),至此中间信号就连接到scoareboard了。
A3:可以通过打印文件来对比吗?
可以 ,但是我领导不让。。
直接在top层拿到RTL的中间信号后,按照在有效期间打印中间信号到文件中,参考模型中也按照相同格式打印中间信号到文件中,这个最简单的。
但是。
需要手动对比打印文件,(也可以仿真结束后自动执行脚本来自动对比)
而且要仿真结束后打印文件生成了才能对比。
对比不过的话,定位也比较麻烦,
而且如果都这么对比的话,那还要scoareboard干啥。