(以下是我在做IPCORE重构时遇到的问题,学识有限,可能有不对的地方)
最近在做自定义IPCore的重构,硬件平台XUPVIIP,软件环境9.1.02+EAPR+Planahead。
系统要求重构的IPCore有总线接口和BRAM接口,开始时想将IPcore挂在PLB总线上,但是发现PLB接口需要太多的总线宏,担心板子资源不 够,就改在挂到OPB上。官方提供了OPB的总线宏socket,看了一下IPcore的地址是和Socket绑定,这个和我们系统要求不符,我们希望地 址和自定义IPcore绑定,所以决定自己写opb的总线宏socket。我将opb接口的总线宏和BRAM接口的总线宏做到了一个IPCore中,名 opb_bm。做的时候遇到一些状况,记录如下:
1、 自定义IPCore重构时,与系统连接的引脚状态在变化,可能会影响到系统其他部分的工作,所以由IPcore到系统的总线宏要有使能端,在IPCore重构时,将使能关掉,防止重构时混乱的信号影响系统。
2、 官方提供的有使能的总线宏,使能端在左侧,使能端要由系统控制,所以使能部分必须在静态区域,这样就决定总线宏要在重构IPCore的左侧
3、 以上两条得出,IPCore的输出要带使能端的总线宏,且这个总线宏要在重构区域的左侧。所以IPCORE的输出使用的总线宏是*_r2l_enable_*。
4、 我开始做时将重构IPCore的所有输入输出引脚都通过总线宏和外部相连(包括时钟)。其实我知道时钟最好通过时钟树到FF,做的时候可能脑筋短路了。下 到板子后的结果是,IPCORE好像根本没工作,我之前做重构时有时也会将时钟通过总线宏,因为都是简单逻辑,工作的还比较正常,没遇到过根本不工作的情 况,所以应该不是时钟的原因。之后就用LED、逻辑分析仪各种调试,奇怪的是如果调试时IPCore的调试引脚是直接引到外边都能正常工作,如果将调试引 脚去掉或通过总线宏连到外边,IPCORE又不工作了。我猜如果没有引脚直接和外部相连,内部逻辑就又被无情的优化了,所以必须有直接和外部相连的引脚。 但是重构IPCore的IO不可能直接和外部相连,除了时钟。我将调试引脚去掉,将IPCore回复到初始连接,将时钟直接和外部相连,IPCore工作 正常了。所以要重构的IPCore必须有至少一个引脚直接和外部相连,并且这种引脚只能是时钟(在我的工程中是这样的,不绝对)
5、 opb_bm的输入输出引脚对称,用总线宏做输入输出的直通。引脚很多,比如opb_data、opb_addr是32位,我使用generate的生成 多个总线宏的连接,位数变化采用i*8+0/1/2…6/7,map时报错Pack:1195:说addr的output没有连接,语言是确实写了连接, 后来看官方的opb socket发现大部分generate的位数变化和我写的一样,只是我报错的addr官方是这样写的i*2+0/1/8/9/16/17/24/25, 按照官方的方法改之后正确了。不知道为什么。
6、 做opb_bm的bram_din接口时,又遇到了5中说的错误提示,还以为改改位数变化就可以,i*2+… i*4+… i*8+…各种改都同样的报错。后来又想到了“优化”,在做重构时,经常有些什么被优化掉。我做的自定义IPCore为了统一接口,每个IPCore都有 系统需要的所有接口,但是在逻辑中并不是所有接口都用到,报错的接口就是没有用到的。我将本应不用的接口,写了些无关紧要的逻辑,再生成 bitstream,正确了。所以在做重构时,无用的接口一定要写些无关紧要的逻辑,使综合工具以为它是有用的。
7、 用planahead做重构时,官方给的例子中重构区域在左上和右上,我根据例子的约束在自己的工程中画区域,且我重构区域的利用率小于官方例子的,所用 资源只有slice,但是merge时overlap了。不知道为什么,我总线宏每个区域用了37根,可能是总线宏太多了吧。之后不停的变换区域的位置、 大小,各种试。发现在左上和左下时布线成功了,但是重构后软件不再运行了(在网上遇到N个人,都说有这样的问题)。我最后做成功的重构区域位置是在左上和右下,且右下要比左上大一点。