Xilinx的FPGA同bank下能同时放2个Native Mode的IP吗?

2026-02-20

77
1

前言

最近闲时阅读Xilinx官方文档《ug571-ultrascale-selectio》,读到这段“if a bank has two different interfaces, both interfaces should be controlled by a single reset to ensure that calibration completes”,原因是Native Mode的IP在BITSLICE_CONTROL的校准阶段,是以bank为单位作为一个整体进行校准的。惊觉之前画的某个XCZU19EG的板子上把DDR4-MIG和MIPI-DPHY这两个Native Mode的IP放在了同一个BANK中,虽然跑起来相安无事,但是我还真没注意过二者的reset释放是否同步。这里的reset指BITSLICE_CONTROL的RESET引脚(如下图),一般block design中的IP把BITSLICE相关的底层原语都封装在内部无法看到,这里我干脆用vivado的ILA对两个IP的相关信号抓波形进行分析。

image-zgzk.png

引脚分析

DDR4-MIG引脚

整个PL端的逻辑是来自PS端的pl_resetn0信号来复位的,pl_resetn0复位信号同步到PL时钟域后直接连DDR4-MIG的sys_rst端口。DDR4-MIG在sys_rst复位信号释放后,作为Native Mode的IP,内部BITSLICE_CONTROL会开始校准,注意这个校准非c0_init_calib_complete引脚对应的DDR校准。如下图:

image-iTyy.png

MIPI-DPHY引脚

MIPI-DPHY为节约时钟资源,在同BANK下多个slave共享一个master时钟,如下图。这个reset信号很像直接取的axis的复位信号s_axis_aresetn,事实如何我们后面抓波形验证。

image-Jcza.png

ILA抓波形

首先在block desing中插入ILA把相关信号连上,把采样深度设置到最高(芯片是XCZU19EG资源充足),然后开始漫长的编译。

编译后发现时序违规了,由于是ILA导致的违规我直接忽略,把固件导入vitis编译好PS端程序后直接在FPGA芯片上运行,弹出ILA窗口设置好触发条件,这里我选择了pl_resetn0和MIPI-DPHY的system_rst_out这2个复位释放信号,如下图:

image-InEf.png

但是有个问题是当我们进入ILA界面的时候复位信号早就过了,我们的手速根本来不及去点trigger,这里我们采用Xilinx官方的办法Trigger-At-Startup办法,见:https://docs.amd.com/r/en-US/ug908-vivado-programming-debugging/Trigger-At-Startuphttps://docs.amd.com/r/en-US/ug908-vivado-programming-debugging/Trigger-At-Startup

按照官方教程很快就抓到了波形图,如下:

image-KEEN.png

第1个信号是来自PS端的pl_resetn0,可以看到在几百个时钟周期内进行了两次复位(ILA采样时钟为100MHz,一个时钟10ns)。至于为啥复位了2次,我推测是PS的固有机制,我们只需要关心最后一次复位即可。

第2个信号是pl_resetn0同步到PL时钟域的波形。

我们重点关注DDR4-MIG的ui_clk_sync_rst和MIPI-DPHY的system_rst_out这2个复位成功信号,可以看到前者在2000个时钟周期内复位成功,后者在1000个时钟周期内复位成功。此时两个IP底层的BITSLICE_CONTROL作为一个BANK整体早已完成了校准,而DDR4-MIG的c0_calib_complete训练因为太慢,在10000个时钟周期(100us)内都没有完成。

无论如何,只要2个IP初始化成功,那么BITSLICE_CONTROL校准肯定是成功的。

结论

上面的DDR4-MIG是通过sys_rst进行复位的,而MIG-DPHY是s_axis_aresetn复位的,二者都源自pl_resetn0,所以符合Xilinx官方文档中同BANK下2个Native Mode的IP需要同时复位的要求。如果我们把两个IP中的一个复位信号改成另一个delay了1s的复位信号,可以预见2个IP都会卡在BITSLICE_CONTROL的训练阶段,无法初始化成功。