日常记录(54)s加的svtb过程
https://gitee.com/bai-mengwei/sv_tb_router
1. 整体调用过程
top
top是一个module,它创建了clk,创建了router_io的interface,然后实例化了dut和test。
test_top
test是一个program,它导入了router_test_pkg的包,实例化包中的env,然后设定包中的全局变量,对env进行运行。
env
env以及后续的类型为class,env包括了其它所有,分别构建、重置、开始并发线程,等待结束(sb的事件)。
gen
并发过程为gen生成pkt,发送给drv。
drv
drv收到后驱动dut,发送数据给sb(说明:这里的数据不是线上数据)。
recv
另一端的recv从线上获取pkt,发送给sb。
sb接收数据和对比
https://gitee.com/bai-mengwei/sv_tb_router/blob/master/Scoreboard.sv#L36-40
sb接收数据,主要是接收recv的数据(邮箱方式),接收drv数据直到接收完毕,存储到队列中,对比目的端口相同的pkt内容,判定匹配,删除队列中的对应数据,然后采样到cov中。
当sb的接收数据达到发送量,或者cov收敛完毕,结束。
、
2. 架构与完整架构对比
左图的完整平台中,代理(节点)被驱动器替代,驱动器发送了pkt给sb。检验器被放入计分板中。监视器即recv。功能覆盖率由sb采集。
3. 通信过程说明
3.1 Generator的mbx
个数为16个。当生成一个pkt后,认定pkt的目的地址,然后发送到给定的drv。
https://gitee.com/bai-mengwei/sv_tb_router/blob/master/Environment.sv#L48-52
3.2 获取数组、信箱大小
https://gitee.com/bai-mengwei/sv_tb_router/blob/master/Scoreboard.sv#L37-NaN
mbx在sb中,使用num获取大小,而针对于队列和数组的大小,采用size
3.3 cb的延时修改默认值
从波形中可以看出最终驱动的时候具有延迟性质
https://gitee.com/bai-mengwei/sv_tb_router/blob/master/rtl/router_io.sv#L13-NaN
在cb的第一句中:
default input #1 output #1
3.4 virtual定义的函数和任务属于extern时
实现的过程去掉virtual关键字
3.5 interface的传递过程
如果报错说interface传递未连接,则注意:modport的cb定义是否正确。
更重要的是:确定好make过程的文件顺序:
DUT、PKG、TOP、TEST。最重要的是TOP在前,然后是TEST。先module,后program。
https://gitee.com/bai-mengwei/sv_tb_router/blob/master/Makefile#L2-14
至于传递过程的module中实例化的interface,到了program中成了router_io.tb,是可以的
https://gitee.com/bai-mengwei/sv_tb_router/blob/master/test_top.sv
https://gitee.com/bai-mengwei/sv_tb_router/blob/master/test.sv
4 sformatf与psprintf
psprintf函数是vcs的,同样的功能,返回字符串。
而sformat是将结果存入到定义的string里的。
5 数组定位方法
在sb中,需要查找到同样da的数据(从drv过来的数据临时存入到的队列中)。
查找使用如find_first_index() with (item == xx).
返回的值为队列,需要用标号进行取出。
还有其它函数
6. 队列和邮箱的区别
其实单个线程去看,将队列传入就可以说是一个邮箱了。
邮箱是用于并发过程的,实现过程在队列之上,具有线程安全的特点,原子操作等。
uvm的tlm在邮箱基础上实现。
7. 功能覆盖率文件和文本生成
使用urg命令
urg -dir simv.vdb urg -dir simv.vdb -format text
https://gitee.com/bai-mengwei/sv_tb_router/blob/master/Makefile#L17-18
8. 整体说明
在Packet中:
定义约束、定义信箱数据类型(后续组件使用)。顺便定义了比较函数。
packet需要randomsize,然后发送。
在Generator中:
实例化需要信箱、发送个数。
定义信箱,定义并实例化Packet,然后发送给Drv。
在Driver中:
实例化需要名称,自己的接收信箱,自己的发送信箱,信号量,端口。
定义了DriverBase用于底层驱动。
上层开辟线程等待数据到来,目的地址添加了信号量
然后数据包发送给scb
Receiver中:
实例化需要名称,目的地址,自己的发送信箱,端口。
定义了ReceiveBase用于底层监控
上层开辟线程等待接收,接收数据发送给scb。
ScoreBoard中:
实例化需要名称,两个接收信箱,端口。
定义功能覆盖率。
开辟线程进行信箱数据接收,以Receiver的数据作为检查目标,从Driver发来的数据中进行查找。二者相等,则记录功能覆盖率,否则终止。覆盖率达到100,则触发DONE事件。
Environment中:
定义发送包的量,定义组件之间的信箱,将其传入并实例化。
其中的drv共16个。接收器共16个。生成器1个,计分板一个。
每个drv配备对应同样旗语16个。drv之间通过旗语,确保发往输出端口的数据还未发完的时候不会被中断。
最终等待计分板中的DONE信号触发,结束程序执行。
Le vent se lève! . . . il faut tenter de vivre!
Le vent se lève! . . . il faut tenter de vivre!