• 【Vivado那些事儿】使用 Python 提取 ILA 数据


    ILA应该是调试AMD-Xilinx FPGA最常用的IP。

    9904b2a5409a4b20818f58ce656d85da.png

    在调试中,我们希望 ILA 中的波形可以提供有关设计问题的所有信息,但情况并非如此。对于复杂的调试,我们还需要将 ILA 捕获的真实数据存储到可以进一步处理的文件中。根据放置 ILA 的位置,我们可以通过不同的方式使用文件中包含的信息。

    • ILA 监视输出数据 – 可用于验证实例化的模型的正确性。

    • ILA 监视输入数据 – 可用于将数据输入到测试台模块中,尝试不同数据对测试平台的影响。当然,在这种情况下也可以复制硬件中观察到的信号时序。

    这两种方法在我们的开发、验证和验证中都非常强大。在使用 ILA 时,我们更熟悉波形视图,但是,我们可以使用以下命令轻松地将 ILA 信息保存为 CVS 文件。

    write_hw_ila_data ila_file.csv [upload_hw_ila_data hw_ila_1] -csv

    这将 CSV 文件保存到 Vivado 的当前工作目录中(如果不确定,请在 tcl 窗口中运行 pwd 命令来确定)。

    我们还可以使用“文件”->“导出”->“导出 ILA 数据”来保存 ILA 数据。将打开一个对话框,询问要导出哪个 ILA、导出数据的位置以及数据格式。

    255e6600088f9150cda2a6937902d3f0.png

    我们使用一个简单的 LFSR 实例进行演示,可以在 Vivado 中打开 ILA 并导出 CSV。

    5c0a009e743bae24e89a5b573f5518ee.png

    通过查看 ILA CSV 数据,第一列显示缓冲区中的样本,第二列显示窗口中的样本。

    无论是否在触发中配置窗口,样本缓冲区都会按顺序对缓冲区中的每个样本进行计数。窗口中的第二个样本计数将从 0 计数到窗口大小。

    例如,如果我们为 4 个窗口配置了 1024 个样本缓冲区,则窗口计数中的样本将在 0 到 255 之间计数四次,而缓冲区计数中的样本从 0 线性递增到 1023。

    第三个要素是触发器。该值设置为 1 指示采样窗口中何时发生触发。可以在下面的窗口中看到,当看到触发值时,该窗口在第三列中显示 1(在本例中为 0x00 为 LFSR 序列的开始)。

    3800d6b56624f5ac89f951151a9039c3.png

    我们将 LFSR 序列写到一个文本文件中,可以使用一点 Python 将文本文件的结果与 ILA CSV 进行比较。

    1. import csv
    2. csv_file = 'iladata_trig.csv'
    3. text_file = 'fibonacci.txt'
    4. with open(csv_file, newline='') as csvfile:
    5.     reader = csv.reader(csvfile)
    6.     # Skip the top two rows of the CSV File
    7.     next(reader)
    8.     next(reader)
    9.     Fibonacci_hw_values = []
    10.     # Store Fibonacci Sequence
    11.     for i, row in enumerate(reader):
    12.         if i < 256:
    13.             Fibonacci_hw_values.append(row[3])
    14.         else:
    15.             break
    16. Fibonacci_tb_values = []
    17. # Open test bench text file
    18. with open(text_file, 'r') as file:
    19.     for line in file:
    20.         # Strip newlines and any whitespace around the value
    21.         value = line.strip()
    22.         Fibonacci_tb_values.append(value)
    23. non_matching_in_a = []
    24. non_matching_in_b = []
    25. Fibonacci_tb_values = [item.lower() for item in Fibonacci_tb_values]
    26. for item in Fibonacci_tb_values:
    27.     if item not in Fibonacci_hw_values:
    28.         non_matching_in_a.append(item)
    29. for item in Fibonacci_hw_values:
    30.     if item not in Fibonacci_tb_values:
    31.         non_matching_in_b.append(item)
    32. print("Non-matching in HW:", non_matching_in_a)
    33. print("Non-matching in TB:", non_matching_in_b)

    在Python中,我们可以打开这两个文件并将它们读入Python列表中;一个来自测试台文本文件,另一个来自 CSV 文件。初步结果如下。

    e3038da4fb25988422b7e410814f387b.png

    运行 Python 脚本展示了我们如何使用 Python CSV 包处理来自 ILA 的数据。如果我们想提取一列数据并生成一个文本文件,也很简单。如下:

    ffc0a4598e89577795e3639493d79165.png

    注意:如果使用 Versal 设备,我们可以使用一个名为 ChipScoPy 的 Python 接口来控制 Versal ILA。

  • 相关阅读:
    uni-app---- 点击按钮拨打电话功能&&点击按钮调用高德地图进行导航的功能【安卓app端】
    .NET使用QuestPDF高效地生成PDF文档
    【unity小技巧】适用于任何 2d 游戏的钥匙门系统和buff系统——UnityEvent的使用
    【PHP】如何关闭buffer实时输出内容到前端
    数据结构:栈
    Mysql在ubuntu22.04上安装配置
    Oracle 中的伪列
    狗屁不通文章生成易语言代码
    vue基础知识六:v-show和v-if有什么区别?使用场景分别是什么?
    视频编解码从H.264到H.266:浅析GB28181安防视频汇聚EasyCVR视频压缩技术
  • 原文地址:https://blog.csdn.net/Pieces_thinking/article/details/138174226