课程链接:https://www.bilibili.com/video/BV1k7411H7Jo?p=27
如何实现产生数据transcation激励的组件channel generator
以及将这些数据解析并且驱动到channel interface上的驱动组件channel initiator
首先,实现channel stimulator:
先定义类channel_transcation,表明一个抽象概念的数据包内容。可以看到它的数据成员有若干个用rand修饰的成员变量,表明这些变量都是随机的。包括一个用来容纳数据包所有数据的动态数组data,ch_id表示数据源,pkt_id表示数据所在数据包id,控制数据包内相邻数据间隔周期的data_nidles,控制相邻数据包间隔周期的pkt_nidles。rsp表示反馈,obj_id表示当前实例id,这两个是非随机的。
针对随机成员变量,还需要声明随机约束,用来约束单个或多个随机变量。
接下来是函数,先是类的构建函数new。第二个函数clone用来对当前实例做克隆,克隆包含两个动作,第一个动作是创建一个新的实例,第二个动作是将当前实例的数据成员拷贝到新实例对应的数据成员,最后将其句柄返回。拷贝过程中,obj_id是当前实例的创建需要,不需要拷贝。(obj_id创建的时候就被定义为静态全局变量)
再定义类chnl_initiator,它是驱动激励的组件,从chnl_generator获取transcation数据,并且将其中的数据驱动到接口channel_interface上面。chnl_initiator的成员变量包括name,虚拟接口interface以及用来与chnl_generator做数据通信的两个mailbox句柄req、rsp。在类initiator的new函数中,它将参数赋值给了成员变量。interface成员函数的作用是从外部获取接口指针,并赋值于自己的虚接口成员变量intf,在句柄or虚接口的赋值过程中,经常会做句柄or虚接口是否为空的判断以免发生空句柄赋值。
run任务表示该组件(initiator)在验证环境开始运行时的职责就是调用其driver任务,在接口上做数据驱动激动。在它的drive任务中它会等待系统复位信号释放以后利用forever循环语句不断地从req_mb中获取激励数据,将其通过chl_write的方法写出到接口上面,在发送完毕后还要用clone克隆req数据,再将rsp赋值为1。并且将反馈数据rsp句柄通过rsp_mb写回到generator。如此便完成了initiator和generator之间的事务数据过程。
需要注意的是,initiator获取和返回数据的两个句柄req_mb和rsp_mb并没有在initiator中例化而是在稍后的generator中完成例化的。
接下来的两个任务chnl_write和chnl_idle分别完成了数据驱动和数据复位。在write任务中数据会从trans对象中抽取动态数组data中的每一个数据成员,然后在时钟上升沿将其和vaild信号一同置为有效发送到接口intf上面,并且按照协议要求只在vaild信号为1时才认为此次数据发送完成,并且在相邻数据之间插入空闲周期。idle任务是用来在时钟上升沿将接口中的vaild和data同时置为0。
以上便是在定义了chnl_trans和chnl_initiator以后,验证结构中的部分组件得以实现。chnl_trans类之所以没有体现在结构图中,是因为它是作为chnl_initiator和chnl_generator之间通信的数据事务,并非验证结构中的成员。
再来看类chnl_generator,它的定义方式和chnl_trans很像。与chnl_trans不同的是,它的构建函数则将两个信箱req_mb和rsp_mb做了例化,它的run任务有两个作用,第一它调用了多次创建数据事务并且发送给chnl_initiator的任务send_trans;第二在发送完这些事务以后,他调用了用来控制仿真结束的旗语run_stop_flags的put函数,返回了一把钥匙。在send_trans中,chnl_initiator先创建了事务实例,并且调用了其randomize函数完成了随机化。接下来将随机后的实例req、rsp分别放到了req_mb、rsp_mb中,这个放入的句柄稍后将被chnl_initiator取出,同时chnl_generator中的rsp_mb将等待由chnl_initiator返回的rsp事务。利用这两个任务完成了chnl_initiator和chnl_generator之间的一次握手。
在定义了chnl_generator之后,就实现了产生激励和发送激励的两个组件。他们之间的通信依赖于在generator之中例化的两个mailbox,信箱之间的连接将在最后环境集成的部分进行讲解。