路科验证的个人空间 https://blog.eetop.cn/1561828 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

至今还没有把大象装进冰箱,但是学会SV只剩两步了

已有 1895 次阅读| 2018-1-28 14:25 |个人分类:验证前沿资讯|系统分类:芯片设计

在上一期的Lab4中,我们对数据信息等进行了封装。今天的Lab5的学习目标是:

1.创建一个Generator transactor的类。

2.创建一个Driver的类。

3.创建一个Reciever的类。

4.拓展这个测试平台,并将Driver和Monitor同时连接到所有输入端和输出端。


lab4中,你创建了一个封装好的数据包。但是,在一个时间内只能把数据包从一个输入端驱动到另一个输出端。

在这次的lab中,你会把generatordrivermonitorchecke等程序封装进Generator类,Driver类,Receiver类,Scoreboard类中。同时,你会创建一个testbench架构,从而将上面所有部分都容纳进来。

为了促进Packet对象从一个组件传到另一个组件,你将会使用Mailbox作为一个交流机制。


最终结构如下图所示:



任务一:发展Driver类

在之前的实验中,我们已经用一个Driverbase类封装了driver程序和program的全局变量。你将扩展这个基础类从而去产生一个新的Driver类。

1.用编辑器打开已经存在的DriverBaser.sv 文件。

2.检查Driverbase类。

 在这个基础类中,下面的属性需要被声明。

 

对于driver中的每一个方法,有一个if-$display()连接在子程序的开始处。在debug时,它可以帮助打印出子程序所执行的序列。TRACE_ON是一个program全局变量,你稍后将会在test.sv文件中声明它和控制它。

3.关闭DriverBaser.sv文件。

4.用编辑器打开Driver.sv文件。

这个Driver类源于DriverBase类。其中In_box将会用来从GeneratorDriver通过Packet对象。Out_box将用来从Driver向Scoreboard发送Packet对象。In_boxout_box都是pkt_mbox的类型。

下面是一个定义在router_test.h文件中的邮箱(mailbox)类型:

这个sem[ ]序列将会被当作一个防止多个输入端同时给同一个输出端发送数据包的仲裁机制。这个方法的结构体中在参数列表中有五个变量。name,sem[], in_box,  out_box, start()start()方法可以从in_box中获取Packet对象。


任务:将Driver类中的new()填写完整

1.在外部所声明的结构体new(),调用super.new()namertr_io argument

2.在调用super.new()后添加一个踪迹(tracing)语句.

3.assign 属性sa和port_id。

4通过assign属性sem[],in_box,out_box来完成new()结构体的拓展

 

任务:将Driver类中的方法start()填写完整

program中要例化的事务对象需要一个机制去开始,你将这个方法标准化为start()。

在这个Driver中,start()方法是在一个无限的循环中执行的。在这个循环的每一次执行中,都会从In_box中获取一个packet对象。这个数据包对象的内容将会通过send()发送经过DUT  一旦这个packet对象的发送过程完成后,这个packet对象会被发送到计分板

Driver的对象开始后,期望testbench中的所有其它组件可以同时运行。Start()方法中的trace语句都要在一个non-blockingfork-join结构中。

 1.在已存在的start()体内,添加一个trace语句。

 2.trace语句后,创建一个non-blockingfork-join模块。

 3.fork-join结构里面,创建一个单独的无限循环。

 4.每一个循环中将会做以下事情:

    a) in_box中获取packet对象。

    b)如果sa与获取的packet对象的this.sa中的不匹配,继续下一次循环。

    c)如果获取的packet sathis.sa匹配,用pkt2send中的内容更新dapayload类。

   d).为了到达正确的目的地址,使用sem[ ]序列去仲裁。

   e)一旦仲裁成功,调用send()去驱动数据包通过DUT

   f)send()完成后,发送数据包对象到out_box

   g)在循环的最后一步,将semaphorekey返回给它的bin

5.保存和关闭Driver.sv

 

任务四发展一个Receiver

1.用编辑器打开已经存在的Receiver.sv框架文件。

 

 

任务五填写Receiver类的方法new()

1.在外部声明的结构体new()中,调用super.new()中的namertr_io argument

2.在调用的super.new()后添加一个tracing语句。

3.将类的属性da的值通过port_id发出去。

4.将out_box 的属性通过参数列表传递出去。


任务六填写reciever类中的方法start()

start()方法中将会执行一个非阻塞的无限循环。每次循环中,都会从DUT中重新构建一个packet对象。一旦重新获取后,这个Packet对象将会通过发出邮箱(out mailbox)发送到scoreboard

1.在start()方法的体中,添加一个trace语句。

2.在这个trace语句之后,创建一个非阻塞(non-blocking)的并行的线程(processthread)。

3.在fork-Join结构内部,创建一个单独的无限循环的代码块。

4.每一次循环中都会做以下的事情:

     a) 调用recv()来从DUT中重新获取packet对象。

     b)将从DUT中获取的packet对象复制一份到out_box中去。

5.保存和关闭Receive.sv文件。

 


点赞

发表评论 评论 (2 个评论)

回复 momo08 2018-2-10 20:02
:loveliness: :loveliness: :loveliness: :loveliness: 0000

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 253

    粉丝
  • 25

    好友
  • 33

    获赞
  • 45

    评论
  • 访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-7 23:31 , Processed in 0.021507 second(s), 13 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部