关于仿真ZYNQ时无法模拟PS端对PL端控制信号的问题

1.ZYNQ工程

我有一个ZYNQ的工程,外部输入ADC数据,在PL端进行处理后发送到PS端,我的BD文件如下图,对外只有ADC的时钟和数据接口,其它都是内部走线。其中需要由PS端通过AXIS-LITE总线给PL端发送控制参数,PL端才能正常工作。关于仿真ZYNQ时无法模拟PS端对PL端控制信号的问题_第1张图片

2.问题

我在编写testbench的时候,不知道怎么模拟PS端发送给PL端的数据。我想的几个办法好像都不行。

  1. 把PS端的AXIS-LITE总线引出到顶层文件,然后在testbench里面发送控制数据。
    这样会导致PL端的输入信号同时接了PS端和testbench两个输入,发生冲突。
  2. 单独对内部每个模块进行仿真。
    这样操作非常麻烦,而且很难验证正常工作的情况。
  3. 直接模拟PS端的发送数据。
    不知道能不能这样操作?没查到资料,难道需要把ZYNQ的IP核去掉,改成端口进行模拟?这个改动也太大了。
  4. 把顶层文件和内部控制模块同时例化在testbench里面。
    发现这只是我一厢情愿,实际仿真的时候单独例化的控制模块输入变化了,但是不影响顶层文件里面的控制模块的输入。

3.解决办法

3.1 想了一个初步的解决办法,主要是利用了 `ifdef命令:

  1. 将PS端对PL端进行控制的信号线引出来,通过 `ifdef命令进行设置,在正常工作时由PS端控制,仿真时通过引出的端口进行控制。如下图,slv_reg0是PS端发出来的控制信号,ctrl_reg_sim是引出的端口。
    关于仿真ZYNQ时无法模拟PS端对PL端控制信号的问题_第2张图片

  2. 在工程的TOP文件里面,定义端口时也添加`ifdef命令,这样在正常编译时不会有ctrl_reg_sim_0的端口,也就不需要在XDC文件里面定义这个引脚,因为实际上不存在。
    关于仿真ZYNQ时无法模拟PS端对PL端控制信号的问题_第3张图片

  3. 在仿真时,tb文件里面使用`define命令,这样在仿真时ctrl_reg_sim_0端口有就效了,可以模拟PS端对PL端进行控制。

关于仿真ZYNQ时无法模拟PS端对PL端控制信号的问题_第4张图片
这样还是有问题,因为 `ifdef不是全局变量,只对当前文件有效,所以必须在每个文件里面都使用define命令,才能正常仿真。这样就需要不仿真的时候又把每个文件的define命令给屏蔽掉,还是比较麻烦

3.2 改进了一下这个方法:

  1. 定义一个头文件,头文件里面define SIM_MODE
    关于仿真ZYNQ时无法模拟PS端对PL端控制信号的问题_第5张图片

  2. 在每一个需要定义模拟接口的文件里面引用头文件 `include " SIM_HEADER.vh",我有两个文件需要引用,一个是头文件,一个是内部的控制模块
    关于仿真ZYNQ时无法模拟PS端对PL端控制信号的问题_第6张图片

  3. 控制模块仿真时使用模拟信号进行控制,正常工作时使用PS端信号进行控制

关于仿真ZYNQ时无法模拟PS端对PL端控制信号的问题_第7张图片
4. 这样不仿真的时候只需要把SIM_HEADER.vh文件里面的宏定义取屏蔽就好了,相对来说改动最少。

3 最新发现(AXI Verification IP)

我发现了一个叫做AXI Verification IP的官方核,他的前身是BFM,大概就是官方提供的模拟PS端的AXI总线的IP核,具体情况我研究完了告诉大家。

在这里插入图片描述
2023.11.10
最新研究成果出来了,结论如下:
1.可以用官方的VIP 核完美模拟PS端,并且这个VIP核在编译的时候会自动识别成线,也就是只对仿真有效果,不影响布局布线。
2.官方一共提供了三种工作模式,主端口/从端口/中间传输,每种模式都提供有对应的官方例程,可以在此基础上直接进行更改。
3.我的工程是用的ZYNQ 核,为了模拟ZYNQ的PS端给PL端发送控制信号,使用的中间传输模式,最后仿真结果如下:(整个工程说起来很麻烦,我有空再慢慢写吧)
关于仿真ZYNQ时无法模拟PS端对PL端控制信号的问题_第8张图片

你可能感兴趣的:(笔记,问题,fpga开发)