首先,要知道什么是IP。Intellecture Property,相当于软件领域的API函数库,三方开源项目。要开发一个真正可用的电路设计,不管什么领域,总会使用到一些IP,不太可能从头开始。IP分为硬核和软核,我们今天讲的是软核IP。
IP 为了方便使用,业界对于IP 约定了封装的关键格式定义。IP - XACT ( eXchange ArchiteCTure),这是为了方便大家的IP能够互相通用。具体的内容,可参见:
IP-XACT 这是IP- XACT 的官方网站。
IP-XACT标准的User Guide为:
IP-XACT_User_Guide_2018-02-16.pdf
IPXACT-2014-issues-Dec-2019.pdf
name: IP 核名称
version:IP 核版本
vendor:供应商(开发商)
library:库名称(实际就是分类,可以多个层级的嵌套)
节点名称 |
节点说明 |
ipxact:name |
参数名称 |
ipxact:value |
参数默认值 |
属性名称 |
属性说明 |
parameterId |
参数ID |
resolve |
解析方式,user和generated,user为用户自己解析,generated为软件自定解析连接。 |
type |
参数类型,目前支持类型有:bit、byte、shortint、int、longint、shortreal、real、string |
属性名称 |
属性说明 |
parameterId |
Id号 |
minimum |
最小值 |
maximum |
最大值 |
resolve |
同上 |
type |
值定义,同上 |
choiceRef |
值枚举,参考choices节点 |
注意:上面的choice说明该项是枚举值。
节点名称 |
节点说明 |
ipxact:name |
枚举名称 |
ipxact:enumeration |
枚举值(N个) |
这是IP向外给出的接口,方向(进,出),是否出现(可以通过表达式来控制)
节点名称 |
子节点 |
子节点 |
节点说明 |
|
ipxact:name |
端口名称 |
|||
ipxact:isPresent |
是否有效,通过true或false,或者表达式进行动态控制 |
|||
ipxact:wire |
端口线属性 |
|||
ipxact:direction |
端口方向,in、out、 inout、phantom |
|||
ipxact:drivers |
端口驱动 |
|||
ipxact:driver |
端口驱动 |
|||
ipxact:defaultValue |
端口默认值 |
|||
ipxact:qualifier |
||||
ipxact:isClock |
是否是Clock |
|||
ipxact:isReset |
是否是Reset |
|||
ipxact:isAddress |
是否是Address |
|||
ipxact:isData |
是否是Data |
|||
vendorExtensions |
自定义的额外属性 |
|||
eagle:portInfo |
自有节点定义,定义端口信息 |
|||
eagle:type |
端口类型,暂定 |
主要约定了真实使用时,需要实例化的一些参数,比如:语言,涉及到哪些文件,涉及到的参数。
注意:参数并不一定是接口。
节点名称 |
节点说明 |
ipxact:name |
组件实例化的名称 |
ipxact:language |
实例化语言,包括Verilog、VHDL、System Verilog等 |
ipxact:moduleParameters |
定义了Verilog中的所有参数,以DLRAM为例,则为下图中所有的参数。 |
ipxact:fileSetRef |
定义了组件例化的所引用的文件名,参考fileSets节点 |
节点名称 |
子节点 |
节点说明 |
ipxact:name |
文件集名称 |
|
ipxact:file |
文件 |
|
ipxact:name |
文件名,绝对路径或相对路径 |
|
ipxact:fileType |
文件类型,如Verilog文件,VHDL文件等 |
|
ipxact:logicalName |
定义在本xml中所使用的逻辑名称 |
设计视图,验证视图,物理视图,封装视图等。
节点名称 |
节点说明 |
ipxact:name |
视图名称 |
ipxact:displayName |
视图显示名称 |
ipxact:envIdentifier |
当前视图的环境标识符,标识视图属于哪个环境,例如设计环境或验证环境等 |
ipxact:componentInstantiationRef |
组件例化的引用 |
供应商自行定义的属性和功能。
另外,非常关键的是,上述定义的值部分,是可以用表达式的。这样,可以通过用户的不同输入,控制很多属性。表达式支持 SystemVerilog。
好了,IP定义好了,那什么叫IP Catelog呢?如字面意思,它就是一个IP的集合,为了方便大家搜索,查找到需要的IP。所以,它可以按IP定义中的library和name来组成,没有任何难度,是很好实现的功能。
IP Package 就是一个工具,可以把自已的工程打包成一个标准的IP。它包括文件封装,打包,目录版本管理,元数据的定义和相关的文档。还可以导入到客户工程,或者分项给其它用户。
这个可以理解为对 IP-XACT协议中的细节进行定义的过程和辅助的工具。它并不是必须的,因为,如果你足够了解XACT,你完全可以手工完成整个过程。
对于model-views中的用户的参数设置界面,可以采用系统内置的列表式,也可以自定义界面,如果自定义界面,则需要自行解析相应的界面定义文件(需要自行实现若干输入UI组件)。一般情况,使用列表式界面即可。对于复杂的输入,则需要自定义界面。
如果我们要连接不同的IP,进行组合处理,block design是一个很好的图形工具,使设计工程师能通过拖放和连接IP核来实现的复杂的功能模块。当然,最极端的情况是只有一个IP。当完成连接后,要给到用户使用,一般采取wrapper的方式。
通过Wrapper,定义blockdesign的输入,输出,会最终形成一个wrapper,然后用户按黑盒的方式,只需要了解wrapper,来使用真实的IP。所以,wrapper并不是一个设计期的行为,而是一个运行期的动作。因为它的前置还有block design。
IP最终实例化使用有两种情况,一种是用于行为仿真,一种是正常综合使用。基本雷同。
在使用时,非常简单,直接调用wrapper,当然,这时会要求填写一些参数,这时会使用到定义的参数界面。
如果用户想保护自已的IP源码,还可以采用先综合,再封装的方式,将源码隐藏起来,当然,这种方式会强依赖于综合工具,如果不同的产品之间,不一定能通用。
IP实际上是和器件相关的,同一个IP可能在不同器件不一定兼容。这是可能发生的。
对于IP的使用,大概涉及的上述的内容,一开始接触时,容易把几个概念搞混淆。实际上,IP封装和使用的相关概念是比较简单的,自已要做一个IP Packager和 IP Generate,甚至产生IP 的 Repository 都是非常简单的,只需要严格按照 IP - XACT的最新协议来实现即可。
当然,要写好一个IP,那属于硬件电路设计编程的事情,不在这里讨论。我只是在考虑自已要实现IP封装相关的功能,需要做一些什么事情。