将Primus生成的波形文件导入MATLAB的处理过程和技巧

作者:Jane,来源:易灵思官微

VCD 文件及其查看器,如 GTKWave,擅长记录和展示波形,而 MATLAB 擅长对复杂数据进行计算、分析和可视化。在项目设计开发阶段,有时候,我们需要将 EDA 工具生成的波形数据,导入到 MATLAB 中进行更深入的分析、处理或可视化。

然而,EDA 工具生成的波形数据文件,通常无法直接支持 MATLAB 的快速导入,需要对波形数据文件进行一系列的预处理和格式转化。那 Primus 生成的波形 vcd 文件,又需要进行怎样的预处理和格式转化,才能允许 MATLAB 直接导入呢?

本文将给大家分享这个过程的实现步骤,技巧和经验。

第一部分:应用场景

我们首先来看看,什么时候需要将波形 VCD 文件进行转化并导入 MATLAB?这里我为大家总结了一些典型的应用场景:

应用场景 1. 集成电路设计与验证

模拟电路分析: 将 SPICE 仿真(如放大器、滤波器、ADC/DAC)的瞬态分析、交流分析结果导入MATLAB,进行频域分析(FFT)、信噪比计算、谐波失真分析等。MATLAB 的信号处理工具箱非常强大。

数字电路验证:将数字仿真(如 FPGA、ASIC)的时序波形导入 MATLAB,与理论值或 MATLAB 生成的黄金参考进行对比,验证算法功能的正确性。

应用场景 2. 信号完整性分析

分析高速串行链路(如 PCIe, DDR)的仿真波形,在 MATLAB 中进行眼图生成、浴盆曲线绘制、抖动分解等,这些在 VCD 查看器中很难完成。

应用场景 3. 混合信号系统协同仿真

当你有一个系统,一部分在 Simulink(控制算法)中建模,另一部分(具体的电路实现)在 EDA 工具中仿真时,可以将电路仿真输出的 VCD 文件导入 MATLAB/Simulink,进行系统级联合验证。

第二部分:具体实现步骤

了解了什么时候需要将波形 VCD 文件进行转化并导入 MATLAB后,再继续了解如何实现 VCD 文件的处理和转化。

VCD 波形文件虽然是文本格式,但其结构复杂,不适合直接用 MATLAB 读取。而将 VCD转换为表格形式的 CSV 文件则是理想的中介。

下面给大家分享 VCD 转 CSV 的具体实现步骤,以及处理要求和技巧。本文分享基于Python 脚本的转化工具。整个过程分为两大步:转换 和 导入。

步骤一:转换

使用 Python 脚本,将 VCD 文件转换为 CSV 文件,你可以使用 `vcdvcd` 这个 Python 库,它非常强大。

1. 安装库 vcdvcd 库:

```bash

pip install vcdvcd

```

2. 编写 Python 脚本(这里我们使用 `vcd2csv.py`):

```python

from vcdvcd import VCDVCD

import csv

# 读取 VCD 文件

vcd = VCDVCD('your_simulation.vcd')

# 获取所有信号名称

signal_names = list(vcd.signals.keys())

print("找到以下信号:", signal_names)

# 获取所有时间点

times = sorted({time for signal in vcd.signals.values() for time in signal.values})

# 创建 CSV 文件并写入数据

with open('output.csv', 'w', newline='') as csvfile:

writer = csv.writer(csvfile)

# 写入表头:第一列是时间,后面是各个信号名

header = ['time'] + signal_names

writer.writerow(header)

# 遍历每个时间点

for time in times:

row = [time]

for sig_name in signal_names:

# 获取该信号在当前时间点的值,如果不存在则用上一个值(或空格)

sig = vcd[sig_name]

# find_value 方法可以找到在指定时间点的值

value = sig.find_value(time)row.append(value if value is not None else '')

writer.writerow(row)

print("转换完成!")

```

注意:这是一个基础示例。对于大型 VCD 文件,你可能需要优化代码,例如处理信号层次结构、选择特定信号等。`vcdvcd` 库提供了丰富的功能来处理这些情况。

步骤二:导入

将第一步生成的 CSV 文件导入 MATLAB在 MATLAB 中,这一步非常简单。你可以选择两个两个方法的任意一种。

导入方法:1. 使用 `readtable` 函数:

```matlab

% 导入 CSV 文件

data = readtable('output.csv');

% 显示前几行数据,确认导入成功

head(data)

% 现在你可以像操作普通 MATLAB 变量一样操作这个表格

% 例如,提取时间和某个信号

time = data.time;

signal_a = data.YourSignalName; % 将 YourSignalName 替换为 CSV 表中的实际列名

% 进行绘图和分析

figure;

plot(time, signal_a);

xlabel('Time (s)');

ylabel('Signal Value');

title('Imported VCD Signal');

```

导入方法 2. 使用导入数据工具(GUI 方式) :

在 MATLAB 的“主页”选项卡中,点击“导入数据”。然后选择你的 CSV 文件。在导入工具中,你可以指定列数据类型、跳过标题行等,然后点击“导入选择”将其生成脚本或变量。

第三部分:重要注意事项和陷阱

注意事项 1:文件大小

VCD 文件可能非常巨大(几个 GB),转换后的 CSV 文件可能更大。这会导致转换和导入过程非常缓慢,甚至内存不足。因此,在转换时,使用 Python脚本只选择你真正需要分析的几个信号,而不是全部导出。

注意事项 2: 时间点对齐

VCD 是事件驱动的,每个信号的值变化时才记录。这意味着不同信号的时间点可能不完全一致。上面的 Python 脚本通过生成所有时间点的并集来解决这个问题,缺失值会用上一个值或空值填充。你需要根据你的分析目的决定如何处理这些缺失值(例如,前向填充)。

注意事项 3:数据格式

数字信号在 VCD 中可能是多位二进制、十进制或十六进制。我们需要确保转换脚本能正确理解这些格式。而模拟信号通常是实数值。要确保转换时精度没有损失。

注意事项 4:信号命名

VCD 中的信号名可能带有层次结构分隔符(如top.module.signal`),在 CSV 中可能会变成列名。要确保 MATLAB 能够正确处理这些列名,有时可能需要手动修改 CSV 表头。

第四部分:总结

当你需要利用 MATLAB 强大的计算和可视化能力,去分析 Primus 产生的波形数据时,标准的处理流程为:

Primus 生成 `.vcd` → Python 脚本 对 .vcd 进行 预处理 并 转换为 `.csv` → MATLAB 导入并分析

易灵思有整套的 Python 脚本来帮您完成 vcd 的预处理和转换,欢迎联系索取。