作者: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 的预处理和转换,欢迎联系索取。