2009년 9월 1일 화요일

Verilog Verification

H.264 encoder와 같은 거대한 application은 처음부터 Verilog로 구현하지 않는다.
우선 C와 같은 언어로 구현한 후에 다수 실험을 거치고, 필요한 부분들을 변경해서, 구현이 완전히 확정되었을 때 HDL로 옮기는 것이 의미가 있다.  HDL 구현은 그만큼 수정하기 어렵기 때문이다.
이와 같이 C 구현을 Verilog로 재구현할 경우, 재구현한 코드가 맞게 동작한다는 것을 검증할 필요가 있다.
구현 초기 단계에 하나의 4×4 block, 혹은 하나의 16×16 block에 대해서는 simulation에서 wire를 하나씩 보면서 검증할 수도 있다:

위에서 recon된 4×4 block의 16개 값이 맞다는 것 정도는 눈으로 검증할 수 있다.
하지만 다음과 같은 4개 16×16 block의 Luma와 Chroma 모두에 대해서는?

이 쯤 되면 곤란하다;
더구나 코드를 수정할 때마다, 처음부터 전부 다시 검증해야 하기 때문에 더 이상 수동적인 방법에 의존할 수 없다.
이를 어떻게 하면 자동화 할 수 있을까?

이를 위해 System C와 같은 언어를 사용할 수 있다고 하는데, Verilog의 File I/O로도 자동화 할 수 있다.

// synopsys translate_off
  integer fReconLuma;
  initial fReconLuma = $fopen( “ReconSim_Luma.txt” );
  always @ ( posedge iClk or negedge iRst ) begin
    if ( iModeCount == pModeCount_I4_BestMode ) begin
      $fdisplay( fReconLuma, “[Y:%d X:%d Blk:%d] %d %d %d %d”, iFrameIndex_Y, iFrameIndex_X, iSubBlockCount,
        iReconstructedPixel_0, iReconstructedPixel_1, iReconstructedPixel_2, iReconstructedPixel_3 );
    end
  end
// synopsys translate_on

위 코드는 recon된 값들을 Y,X 좌표와 block count와 함께 ReconSim_Luma.txt 파일에 출력해 준다:

[Y: 0 X: 0 Blk: 0]  50 216 255 238
[Y: 0 X: 0 Blk: 0]  47 191 195 205
[Y: 0 X: 0 Blk: 0]  45 190 176 167
[Y: 0 X: 0 Blk: 0]  48 215 221 160
[Y: 0 X: 0 Blk: 1] 255 255 255 252
[Y: 0 X: 0 Blk: 1] 230 203 218 185
[Y: 0 X: 0 Blk: 1] 187 170 185 142
[Y: 0 X: 0 Blk: 1] 179 187 192 164

$fopen으로 파일을 열고,
$fdisplay는 C의 fprintf 와 비슷한 형식으로 로그를 찍고, 끝에 newline을 덧붙인다.
본래 C 구현의 reference code에도 다음과 같이 같은 형식의 Recon_Luma.txt를 뽑는다:

  FILE *fp;
  fp = fopen( “Recon_Luma.txt”, “a” );
  for ( j = 0; j < 4; ++j ) {
   fprintf( fp, "[Y:%2d X:%2d Blk:%2d]", nFrameIndexY, nFrameIndexX, nMBIdx );
   for ( i = 0; i < 4; ++i ) {
    fprintf( fp, "\%4d", ipm74x4[ i ][ j ] );
   }
   fprintf( fp, "\n" );
  }
  fclose( fp );

이렇게 C reference code에서 뽑은 Recon_Luma.txt와
Verilog 구현의 simulation을 통해 뽑은 ReconSim_Luma.txt를 diff tool로 비교하면,
어디부터 틀렸는지 금방 확인이 가능하고, verifcation이 자동화 된다.

Diff tool은 WinMerge 추천!  (오픈 소스 툴이다)
SVN settings에서 다음과 같이 원하는 diff tool을 지정할 수 있다:

 

댓글 없음:

댓글 쓰기