소개
Vivado 프로젝트 내의 block design은 파일 이름에 .bd 접미사가 있는 파일(예: vivado_system.bd)로 표시됩니다. 이 파일에는 block design 에 대한 모든 정보가 텍스트 형식으로 사람이 읽을 수 있는 형식으로 포함되어 있습니다. 이전 버전의 Vivado에서는 이 파일이 XML 형식으로 작성되었습니다. 오늘날 JSON 형식은 block design을 나타내는 데 사용됩니다.
텍스트 형식 덕분에 잘 알려진 텍스트 비교 도구(diff 및 유사한 그래픽 도구)를 사용하여 두 개의 block design 파일을 비교할 수 있습니다. 이를 통해 block design에 어떤 변경 사항이 적용되었는지 추적할 수 있습니다.
그러나 JSON 형식은 텍스트 파일 비교와 관련하여 다음과 같은 중요한 단점이 있습니다. objects정의에서 properties 와 그 값은 임의의 순서로 나열될 수 있습니다. 따라서 diff 와 같은 도구는 두 JSON 파일에 정확히 동일한 정보가 포함되어 있어도 텍스트 내용이 크게 다르다는 것을 보여줄 수 있습니다.
불행하게도 Vivado 에 의해 생성된 block design 파일의 일부 부분에 이 문제가 발생합니다. 결과적으로 두 개의 .bd 파일 간의 텍스트 비교는 정보의 일관성 없는 순서로 인한 많은 오해의 소지가 있는 차이점을 보여줍니다.
JSON 파일의 정규화
텍스트 파일의 무작위 순서에 대한 자연스러운 해결책은 이 파일을 표준 형식으로 만드는 것입니다. RFC 8785 에는 이러한 정규화를 수행하는 방법에 대한 엄격한 정의가 있지만 두 파일을 비교하기 위해 해당 표준을 따를 필요는 없습니다. 무작위 재정렬을 피하는 것만으로도 충분합니다.
간단한 해결책은 properties의 이름에 따라 개체의 properties를 알파벳 순서로 정렬하는 것입니다. 이를 통해 JSON 파일 내부의 정보가 일관되게 표현됩니다. 그러나 이러한 방식으로 정보를 재정렬하는 데는 단점이 있습니다. properties는 일반적으로 파일을 읽기 쉬운 순서로 나열됩니다. 중요 properties는 일반적으로 파일의 첫 번째 위치에 배치되며 properties는 의미에 따라 그룹화됩니다. 따라서 표준 형식의 JSON 파일을 읽는 것이 약간 더 어렵습니다.
Perl script
JSON Perl module덕분에 JSON 파일의 정규화를 수행하는 Perl script를 쉽게 작성할 수 있습니다.
#!/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 designs를 비교하려면 두 개의 정규화된 JSON 파일의 텍스트 비교를 수행하십시오.