01signal.com

比较 Vivado的 block 设计文件

介绍

Vivado 项目内的 block 设计由文件名中带有 .bd 后缀的文件表示,例如 vivado_system.bd。该文件以人类可读的文本格式包含有关 block 设计的所有信息。在旧版本的 Vivado中,此文件以 XML 格式编写。如今, JSON 格式用于表示 block 设计。

由于文本格式,可以使用众所周知的文本比较工具(diff 和类似的图形工具)来比较两个 block 设计文件。这样可以跟踪对 block 设计所做的更改。

然而, JSON 格式在比较文本文件方面有一个显着的缺点: 在对象(objects)的定义中,属性(properties)及其值可以以任意顺序列出。因此,像 diff 这样的工具可以显示两 JSON 文件的文本内容显着不同,即使它们包含完全相同的信息。

不幸的是, Vivado 生成的 block 设计文件的某些部分存在此问题。因此,两 .bd 文件之间的文本比较显示出许多误导性差异,这是信息排序不一致的结果。

JSON 文件的规范化

对文本文件进行随机排序的自然解决方案是将该文件转换为规范形式。 RFC 8785中对如何执行此类规范化有严格的定义,但是无需遵循该标准来比较两个文件。避免随机重新排序就足够了。

一个简单的解决方案是根据属性的名称按字母顺序对属性对象进行排序。这确保了 JSON 文件内信息的一致表示。然而,以这种方式重新排序信息有一个缺点。属性通常按照使文件易于阅读的顺序列出: 重要的属性通常放在文件的前面,而属性则根据其含义进行分组。因此,读取规范形式的 JSON 文件会稍微困难一些。

Perl 脚本

借助 JSON Perl 模块,可以轻松编写对 JSON 文件进行规范化的 Perl 脚本:

#!/usr/bin/perl
use warnings;
use strict;

use JSON;

local $/; # Slurp mode

my $json = JSON->new->allow_nonref->space_after->indent->canonical;

my $in = <>;

my $h = $json->decode($in);
my $out = $json->encode($h);

print $out;

这个脚本(script)的使用是这样的:

$ ./jsonize.pl vivado_system.bd > canonicalized.bd

为了比较 block 设计,请对两个规范化的 JSON 文件进行文本比较。

此页面由英文自动翻译。 如果有不清楚的地方,请参考原始页面
Copyright © 2021-2024. All rights reserved. (b4b9813f)