这个系列和大家一起学习一下VIP的编写。首先我们先啰嗦几句vip是个啥东西,他可不是咱们办的那个vip卡那个意思,而是verify ip。在IC验证里面是个十分重要的东西,主要的功能就是基于协议接口并将我们的激励打包成一组item与rtl进行交互。也分为master和slave,其中包含的组件有driver,monitor,item,inteface,sequence等等。它的功能很多啦,十分强大,在此不赘述了,我们直接来看看怎么写,写的时候应该有什么思路,里面涉及哪些知识点。
- Interface
首先我们先要根据协议定义一组接口,直接上段代码吧
插入代码片
interface tx_if(input clk)
logic data;
logic rdy;
clocking drv_cb @(posedge clk);
default input#1 output#1;
input data;
output vld;
endclocking
endinterface
好的,一段定义interface的简单而优美的代码接写完了。
不过,虽然简单,里面还是蕴含了不少细节需要我们注意。我们一行一行来看。
首先,第一行tx_if就是我们给这个interface块定义的名字,这个你想叫啥就叫啥,写成你自己名字也无所谓。
第二行与第三行就是我们定义的接口,logic类型,这个不管他是输入还是输出信号,都可以定义为logic。logic类型是啥呢,logic其实就是reg类型的改进,它既可被过程赋值也能被连续赋值,编译器可自动推断logic是reg还是wire。果然是改进版的,就是智能。
下面几行我们定义了一个clocking,就是时钟块。那么时钟块里面的第一行也是定义名字,然后@(posedge clk)的意思就是这个时钟块是和clk的上升沿对齐。
default input#1 output#1;这句话就是时钟块的核心作用了,对输入输出进行延迟,1就表示延迟一个时间单位。不过这里要注意了,这个input和output看着都是延迟1,意义可大不相同哦。
先想想,对于我们验证平台而言,input是不是就是rtl给我们的信号,而output才是我们发出的激励啊,这个没问题吧。
所以我们输出的信号,也就是output ,那我们延时1就是延时1。但input是rtl给我们的,他要经过d触发器打拍,所以他就不是我们写多少他就延迟多少,而是要以clk为周期进行延时。假如一个clk时间为3,我们写一个output#1,请问实际在波形上看,经过这个cb块的这个信号延迟多少,答案是3,如果写output#4呢,答案是6. 因为它的延迟是以clk周期为单位,并向上取整。
好了,今天先说到这里,这个系列涉及到一些很细节的知识点,难免有些学艺不精说的不对的地方,如果有朋友发现错误,希望及时指出,万分感谢!!!