01signal.com

Vivado의 블록 디자인 파일 비교하기

소개

Vivado 프로젝트 안의 블록 디자인(block design)은 파일 이름이 .bd로 끝나는 파일로 표현됩니다. 예를 들어 vivado_system.bd와 같습니다. 이 파일에는 블록 디자인에 관한 모든 정보가 사람이 읽을 수 있는 텍스트 형식으로 담겨 있습니다. 이전 버전의 Vivado에서는 이 파일이 XML 형식으로 작성되었지만, 지금은 JSON 형식으로 블록 디자인을 표현합니다.

텍스트 형식 덕분에 블록 디자인 파일 두 개를 잘 알려진 텍스트 비교 도구(diff 및 그와 유사한 그래픽 도구)로 비교할 수 있습니다. 이를 통해 블록 디자인에 어떤 변경이 이루어졌는지 추적할 수 있습니다.

그러나 JSON 형식에는 텍스트 파일을 비교할 때 상당한 단점이 하나 있습니다. 객체의 정의에서 속성(property)과 그 값의 나열 순서가 제멋대로일 수 있기 때문입니다. 그 결과 diff와 같은 도구는 두 JSON 파일이 완전히 동일한 정보를 담고 있는데도 텍스트 내용이 크게 다르다고 표시할 수 있습니다.

안타깝게도 Vivado가 생성하는 블록 디자인 파일의 일부에는 이 문제가 있습니다. 그 결과 두 .bd 파일을 텍스트로 비교하면 정보가 일관되지 않은 순서로 배치되어 발생한, 그릇된 차이점이 많이 나타납니다.

JSON 파일의 표준화

정보가 임의의 순서로 나열될 수 있는 텍스트 파일에 대한 자연스러운 해결책은 그 파일을 표준 형태( canonical form)로 만드는 것입니다. RFC 8785에는 이러한 표준화(canonicalization)를 수행하는 엄격한 정의가 있습니다. 하지만 두 파일을 비교하는 목적이라면 그 표준을 따를 필요는 없습니다. 그저 임의의 재배열(random reordering)만 피하면 충분합니다.

간단한 해결책은 객체의 속성을 그 이름의 알파벳 순서대로 정렬하는 것입니다. 이렇게 하면 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;

이 스크립트는 다음과 같은 명령으로 사용합니다:

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

블록 디자인을 비교하려면, 표준화된 두 JSON 파일을 텍스트로 비교하면 됩니다.

이 페이지는 영어 원문을 기계 번역한 것입니다. 의문이 드는 부분이 있으면 원문을 참조하시기 바랍니다.
Copyright © 2021-2026. All rights reserved. (dcc38493)