官网的文档说明
Library Reference — cocotb 1.1 documentation,主要是说明了输入的数据,会和背压函数,idle,形成多个测试例。测试例的数量是上述三者的排列组合。
前提
我的测试代码中,rst会拉高2个时钟周期,然后代码还会阻塞执行一个时钟周期(await),才会进行别的逻辑
总的测试函数调用如下
波形
单讲idle_inserter
例子1
首先是idle_inserter,举例下面的代码
factory.add_option("idle_inserter_spkt", [None])
表示,以axis形式输入的数据,会在rst之后的一个时钟周期,一直拉高,直到数据全部给到DUT(Device Under Test)为止。然后就会拉低。
例子2
再举一个例子,这个函数,意思是,rst
def cycle_pause():
return itertools.cycle([1, 1, 1, 0])
factory.add_option("idle_inserter_spkt", [cycle_pause])
如下图,会插入3拍的idle,也就是s_tvalid不拉高。然后最后一个0意思是不插入idle,所以tvalid会拉高一个时钟周期。然后进行一个循环。第二个“3个clk”之后,时钟周期拉高一个时钟周期之后,为什么没有拉低呢?这就是AXIS总线,下一级没有把数据接收走之前,tvalid和数据必须做保持,直到DUT的ready拉高,数据被接收。
当发送的数据都被接收之后,tvalid也就不会再拉高了。
单讲backpressure_inserter
例子1
表明不插入背压,rst+一个时钟周期之后,测试环境给DUT的一直会是ready为1。
factory.add_option("backpressure_inserter", [None])
对应的波形图如下
例子2
这个函数表明,rst+一个周期之后,会先插入3个背压,然后给一个ready。
def cycle_pause():
return itertools.cycle([1, 1, 1, 0])
factory.add_option("backpressure_inserter", [cycle_pause])
波形如下