MCDF SV lab3 介绍与总结

本文详细解析VHDL实验室第三部分,重点讨论chnl_pkg和tb文件的独立、chnl_trans类变化、随机数种子设置、generator与initiator的通信机制以及验证环境的构建。介绍了如何通过mailbox实现组件间通信,并探讨了验证结构如channel_monitor、mcdt_monitor和checker的角色与交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面:

1. 这篇文章仅仅是做完lab3后自己的一些想法,如果想找参考答案推荐:@Hardworking_IC_boy

2. 一定要多看代码,多写代码,写着写着就懂了。

lab3与lab2的区别:

将chnl_pkg与tb文件独立开,主要是chnl_trans类的变化。

lab2中chnl_trans由chnl_generator例化且每次只能发送一个数据。

lab3中chnl_trans由自己例化且发送数据变为动态数组[31:0] data [],可发送多个。

ch_id:发给哪个channel。

pkt_id:数据包编号,第几个chnl_trans。

data_nidles:数据间隔。

pkt_nidles:数据包间隔。

constraint:对上述各个变量作约束

function clone:新创建对象并把数值赋给它。

function sprint:把当前所有成员变量保存到字符串并打印。

chnl_pkg1.sv、tb1.sv

要求1.1 参考代码已写好了。

要求1.2 原本在chnl_root_test类中结束仿真,要迁移到generator中,由generator结束。

generator重复完ntrans次send_trans就结束,但initiator不会停(forever),不断地get到req,消化后握手。所以chnl_agent中用fork-join_any,agent的run()就可以结束,chnl_root_test的run()就可结束,退出仿真。

要求1.3 连续两次生成随机数据相同,因为种子相同,命令行加命令:vsim – novopt – solvefaildebug – sv – seed0 work.tb1

solvefaildebug功能:若随机化失败会给出原因。

为何generator有随机变量?

lab2机制:generator产生一个数据,被initiator的chnl_write调用,发送一个数据。repeat(n)次,具体发送多少由agent决定,发送数据和数量由generator和agent决定。

lab3希望控制更集中,交给generator决定,chnl_generator中的ntrans控制产生多少个随机数据和数据内容(send_trans),chnl_generator中的run:repeat了ntrans次send_trans。

send_trans:产生一个对象,作randomize,然后通过mailbox把数据发出去给initiator。也就是说generator控制产生数据的长度和内容。

chnl_pkg2.sv、tb2.sv

跳过agent,直接从chnl_root_test去控制generator。chnl_pkg 2:把generator从agent拿出来,可以方便控制(通过do_config)。

chnl_pkg2中的chnl_root_test:先让agent[0]——agent[2]工作起来,gen[0]——gen[2]要保证让数据都发送完毕后再finish。

chnl_generator中的send_trans通过randomize对chnl_generator对象gen作随机化,进而对该对象生成的req对象作随机化。

 在chnl_root_test中,randomize发生在do_config中,在gen.run()之前。

generator和initiator的通信:

 generator中的send_trans() req=new() 生成一个chnl_trans对象并randomize,然后用mailbox发送,每生成一个都要和initiator通信:

class chnl_generator;
……
	task send_trans();
		this.req_mb.put(req);
      	this.rsp_mb.get(rsp);

generator每产生一个req就放入req_mb,并立即rsp_mb.get(),req_mb被initiator拿到后/get()到,取出req_mb此时为空。

initiator拿到req_mb里边放的req会消化同时给出反馈,initiator调用clone函数创建一个新chnl_trans对象把成员变量rsp置为1再返给generator,generator拿到前后分别打印发送对象req和反馈对象rsp(.rsp值不一样),用断言assert判断,若拿回的.rsp为1表明initiator成功发送出去。

注:mailbox在generator中例化,initiator中未例化mailbox(仅是句柄,指向generator中例化的mailbox),在agent中把mailbox句柄连接。

 lab3整体结构:

 从结构图可以看到有generator、initiator、agen,还有channel monitor和mcdt monitor,监测数据送给checker,内有fifo用来缓存数据(用mailbox实现)。

monitor与checker之间通过mailbox通信和generator与initiator间的通信类似,在checker中例化mailbox和monitor中声明的mailbox句柄相连接。

monitor监测总线上的数据需要interface,initiator发送数据给下行也需要interface,所以都放入agent盒子里;且二者职责较为单一,二者构成了验证环境中的最小单元。

再看下边mcdt的monitor不需要放在一个agent里边,因为arbiter仅仅输出发送数据,不需要给激励。

 channel monitor和mcdt monitor会把数据分别给mcdt checker中的ch_fifo和arb_fifo,然后在data_comparator进行数据比对。

注:class chnl_checker中的do_compare()先从mcdt monitor拿数据再根据数据id来拿对应id的channel monitor数据进行比对。(lab3还未验到arbiter的仲裁功能,所以不知道发送顺序)。比较结果若不一样error_count就+1。

chnl_root_test的new()函数里边例化checker,对checker里的mailbox(ch_fifo)和chnl_monitor、checker里的mailbox(arb_fifo)和mcdt_monitor连接。

 lab3的整体介绍(面试会描述)

channel_generator产生数据通过mailbox(req_mb)发送给channel_initiator,channel_initiator成功把数据发送给下行slave_fifo后,返回.rsp(通过rsp_mb)给channel_generator;req_mb和rsp_mb在generator里例化,在chnl_root_test里连接。

MCDT作为DUT内部如何运作不考虑,只看从arbiter出来的数据。

channel_initiator通过接口ch_if把数据发送给下行slave_fifo,channel_monitor也用同一个接口把数据通过mailbox发送给checker(所以channel_initiator和channel_monitordou 放在agent里);mcdt_monitor用接口arb_if把从arbiter出来的数据通过mailbox发送给checker。

channel_monitor的mon_mb和checker的in_mbs指向同一个mailbox对象,只是用了两个不同的句柄名称(这里和channel_generator、channel_initiator的req_mb和rsp_mb不一样),在chnl_checker里例化,在chnl_root_test连接;mcdt_monitor的mon_mb和checker的out_mbs指向同一个mailbox对象,在chnl_checker里例化,在chnl_root_test连接。

checker拿到两边的数据后用task do_compare()进行比较并给出结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值