在搓一个IP核,用来实现AXI接口的路由。今天在测试Vivado中提供的AXI_Stream模版时,我简单的将主机和从机的AXIS模版在一个Testbench中连接起来,发现出现了时序错误,两个模版不能很好的衔接。
如图,在前8个时钟周期内,数据正常的读入了FIFO,但是,在第9个时钟周期,最后一个数据被覆盖到了第一个字节的位置。
按理说,由官方提供的模版是经过验证后有效的模版,但为什么会出现这样的问题呢?
在通过对两个模块单独仿真后发现,本应该传输8个的数据,在这样的连接中却传输了9个,这才导致了时序混乱。事实上,在官方提供的模版中,主机模版先在判断了从机信号READY有效后,才逐一将8个数据挂载在数据线上。这表明在从机没有发出READY信号时,主机挂载在数据线上的数据是无效信号。而从机模版在使用时,默认拉高自身的READY信号后,便会直接从主机读取数据。
在这种情况下,为了使从机对应主机的一个延迟,便要告诉从机延后一个时钟再读取数据。调整后的具体时序如图所示。
同样的,为了对齐两个模版的不同默认条件,我们也可以修改主机模版的默认条件,令第一个数据在VALID信号拉高时便挂载在主线上,而不是必须等待READY信号才进行数据变化。这里不再过多讨论。
这件事启示我们,在使用Xilinx提供的模版时,要着重注意隐含的默认条件,这些条件通常不会以注释的形式写在代码内。也正因此,需要我们多留意。