日常记录(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信号触发,结束程序执行。

posted @ 2022-02-11 22:38  大浪淘沙、  阅读(283)  评论(0)    收藏  举报