在基于C的设计中,所有输入输出操作通过普通函数完成,一般来说,输入输出的时间很短,但是在Vivado RTL的设计中这些输入和输出必须通过热定的接口进行管理,高水平的Vivado综合支持了两种指定接口控制的方式:
1、接口综合
这种方式下,能够创建高效、安全的接口界面;
2、手动接口指定
这种方式下,接口通过源程序指定,这就满足任意I/O接口的创建。这种方式在SystemC设计中更加常见,此时,I/O接口的控制信号及属性被明确指定。
同时高水平综合分析同样支持指定的C及C++设计。
那么,如何理解接口综合呢?
当一个C程序在RTL中被使用时,C的参数就被合成到RTL的数据口,接口合成允许一个接口被加入到RTL的数据口,这样接口控制能够被简化为一个输出的有效信号表明当一个输出已经就绪能够通过一个块RAM包含所有的接口,从而使得数据能够被读出或者写入块RAM。
这种类型的接口能够依靠C参数通过接口综合创建,比如:一个输出有效信号能够通过接口综合,其C参数必须是一个指针,对C++来说应该是一个引用,这是因为输入的传递值必须是一个数量,具体如下图,在图中总结了接口的类型和支持的C函数的参数:
在SystemC设计中,所有的输入输出控制信号都要在接口定义中被申明,且它们的属性在代码中被完全指定。当然也有例外,那就是存储器接口。
有的人会问,如果没有接口类型被指定,那么会怎么办?
如果没有被指定的话,上图就变得更加重要了,因为,如果没有指定,那么接口就会就会按照上表中的方式被系统默认加载,同时在界面会弹出一个警告到信息。
上图可以进一步解释为:
1输入和输出的概念是不同的C函数和RTL之间的块。这里使用以下约定的解释。
•一个读,从不写函数参数,像一个RTL输入端口,被称为作为输入(I)。
•一个函数参数,读取和写入,像一个RTL inout口,被称为作为一个inout(I / O)
•一个函数参数写入但从未读过,像一个RTL输出端口, 称为一个输出(O)
2、一个标准的传值参数不能输出一个调用函数的值,其值只能通过函数返回语句返回。
任一传值函数的参数都能都被写入,但不能被读。
3、其ap_ovld接口类型只对输出接口有效。
4、接口类型ap_ctrl_none和ap_ctrl_hs被用于控制函数水平接口的综合,这些接口的类型通过函数自身指定。
理解了接口的类型非常重要,是一切接口定义的基础。