初歩からのHDLテストベンチDesign Wave Magazine 2009 January 105...

2
Design Wave Magazine 2009 January 105 HDL で回路を記述できるようになったばかりで,これからテ ストベンチを書こうとしてる方を対象とした連載の第 10 回で ある.Verilog HDL と VHDL の両方のテストベンチの書き方 を解説する.前回(本誌 2008 年 12 月号,pp.93-103 の第 9 回)は,検証者がテスト入力を意図的に作り出した.しかし, 想定外のバグに対しては,まったくケアできていない.検証者 が意識し得ないバグまで,完全に取り去る方法は確立されてい ないが,そこへのアプローチの一つであるランダム検証につい て解説する. (筆者) 1.ランダム検証のための基礎知識 ● 意識していないバグを炙り出すランダム検証 Verilog HDL ・ VHDL 共通 ランダム検証とは,検証対象への入力をランダムに変化 させ,その結果を確認するものです.この検証方法は検証 者が意識していないコーナ・ケースのバグを発見できる可 能性があります. ランダム検証はテストの最初から行うものではありませ ん.必ず検証者が意識できるバグを潰した後で,つまり単 機能検証が終わってから行います.ランダム検証とは,い わば「当てずっぽう検証」です.最初から行うと,本来確認 しなければいけないと分かっている項目を確認できないこ とがあります. また,ランダム検証とはいっても,すべての値やタイミ ングを完全にランダムに変化させることはありません.完 全なランダムに入力を与えてしまうと,仕様から外れてい たり,そもそもその回路の使用目的から外れたりしてしま うためです.値やタイミングをランダムに振る場合でも, 仕様から外れない範囲で制約をかけます. さらにいえば,ランダム検証の際,本当のランダム,つ まりシミュレーションを行うたびに値が変わるような使い方 は,基本的にはしません.なぜならそのテストでバグが発 見され,回路を修正してもう一度そのテストをしようと思っ ても,同じ状況を再現できないからです.多くの場合,疑 似ランダムといわれる,ランダムっぽく値は変化するが,も う一度同じことをしたときに同じ値が出る方法を使います. 図1(a) は,シフト・レジスタを利用して疑似ランダム 値を生成する回路です.この回路は,図1(b) のようにラ ンダムっぽく値が変化した後,ちょうど255 回目(8 クロッ クのシフトで1 回とする)で同じ値に戻ります.ただし,す べてのフリップフロップが 0 の状態から始めると,値がまっ たく変わらなくなります.このような構成で,8 ビットの ランダムな値を得られます 注1 ● 検証結果をファイルに書き込むスコアボード Verilog HDL ・ VHDL 共通 スポーツの試合などでは,その試合をすべて見ていなく ても,スコアボード,つまり得点板を見ることで試合の状 況や結果が分かります.テストにおけるスコアボードとは, 期待値検証の結果をファイルに書き込むものと考えてくだ さい(本誌 2008 年 9 月号,pp.126-137 の連載第 8 回を参照). 初歩からのHDLテストベンチ� 初歩からのHDLテストベンチ� 安岡貴志 第 10 回 ランダム検証とスコアボード デバイスの記事 ビギナーズ Verilog HDL,VHDL,テストベンチ,ランダム検証,スコアボード,FIFO Keyword 注 1 :「原始多項式」について調べてみると,ほかのビット幅や疑似ランダム 値が生成される理論について知ることができる.

Transcript of 初歩からのHDLテストベンチDesign Wave Magazine 2009 January 105...

Page 1: 初歩からのHDLテストベンチDesign Wave Magazine 2009 January 105 HDLで回路を記述できるようになったばかりで,これからテ ストベンチを書こうとしてる方を対象とした連載の第10回で

Design Wave Magazine 2009 January 105

HDLで回路を記述できるようになったばかりで,これからテ

ストベンチを書こうとしてる方を対象とした連載の第10回で

ある.Verilog HDLとVHDLの両方のテストベンチの書き方

を解説する.前回(本誌2008年12月号,pp.93-103の第

9回)は,検証者がテスト入力を意図的に作り出した.しかし,

想定外のバグに対しては,まったくケアできていない.検証者

が意識し得ないバグまで,完全に取り去る方法は確立されてい

ないが,そこへのアプローチの一つであるランダム検証につい

て解説する. (筆者)

1.ランダム検証のための基礎知識

● 意識していないバグを炙り出すランダム検証

Verilog HDL・VHDL共通

ランダム検証とは,検証対象への入力をランダムに変化

させ,その結果を確認するものです.この検証方法は検証

者が意識していないコーナ・ケースのバグを発見できる可

能性があります.

ランダム検証はテストの最初から行うものではありませ

ん.必ず検証者が意識できるバグを潰した後で,つまり単

機能検証が終わってから行います.ランダム検証とは,い

わば「当てずっぽう検証」です.最初から行うと,本来確認

しなければいけないと分かっている項目を確認できないこ

とがあります.

また,ランダム検証とはいっても,すべての値やタイミ

ングを完全にランダムに変化させることはありません.完

全なランダムに入力を与えてしまうと,仕様から外れてい

たり,そもそもその回路の使用目的から外れたりしてしま

うためです.値やタイミングをランダムに振る場合でも,

仕様から外れない範囲で制約をかけます.

さらにいえば,ランダム検証の際,本当のランダム,つ

まりシミュレーションを行うたびに値が変わるような使い方

は,基本的にはしません.なぜならそのテストでバグが発

見され,回路を修正してもう一度そのテストをしようと思っ

ても,同じ状況を再現できないからです.多くの場合,疑

似ランダムといわれる,ランダムっぽく値は変化するが,も

う一度同じことをしたときに同じ値が出る方法を使います.

図1(a)は,シフト・レジスタを利用して疑似ランダム

値を生成する回路です.この回路は,図1(b)のようにラ

ンダムっぽく値が変化した後,ちょうど255回目(8クロッ

クのシフトで1回とする)で同じ値に戻ります.ただし,す

べてのフリップフロップが0の状態から始めると,値がまっ

たく変わらなくなります.このような構成で,8ビットの

ランダムな値を得られます注1.

● 検証結果をファイルに書き込むスコアボード

Verilog HDL・VHDL共通

スポーツの試合などでは,その試合をすべて見ていなく

ても,スコアボード,つまり得点板を見ることで試合の状

況や結果が分かります.テストにおけるスコアボードとは,

期待値検証の結果をファイルに書き込むものと考えてくだ

さい(本誌2008年9月号,pp.126-137の連載第8回を参照).

初歩からのHDLテストベンチ��初歩からのHDLテストベンチ��

安岡貴志

第10回 ランダム検証とスコアボード

デバイスの記事 ビギナーズ

Verilog HDL,VHDL,テストベンチ,ランダム検証,スコアボード,FIFOKeyword

注1:「原始多項式」について調べてみると,ほかのビット幅や疑似ランダム値が生成される理論について知ることができる.

Page 2: 初歩からのHDLテストベンチDesign Wave Magazine 2009 January 105 HDLで回路を記述できるようになったばかりで,これからテ ストベンチを書こうとしてる方を対象とした連載の第10回で

106 Design Wave Magazine 2009 January

テストにおいて,シミュレーション実行時にずっと人が

張り付いていなくても,結果をファイルに書き込んでくれ

るスコアボード機能を作ることで,複数のテスト・パター

ン実行後に,結果と不具合の状況を確認できます.

ランダム検証では,検証対象のデータ処理系の機能,つ

まりデータが正しく変換されているかを確認するために,

事前に期待値を作成しておくことが困難です.そこでリ

ファレンス・モデルを,検証対象回路と並行して動作させ,

期待値を出力させます.スコアボードは検証対象回路から

の出力と,リファレンス・モデルからの出力を比較し,結

果をファイルに落とします.

● FIFOの利用

Verilog HDL・VHDL共通

リファレンス・モデルとして利用されるビヘイビア・レ

ベルのモデルは,基本的にタイミングの存在しない,一つ

の関数として存在します.つまり,入力値を与えた瞬間,

クロック1周期の遅れもなく,演算結果が出力されます.

一方,検証対象回路であるRTL(Register Transfer Level)

モデルでは,入力値が与えられた後,クロック数周期後に

結果が出力されます.

このタイミングの異なる二つのモデルの期待値を比較す

るためには,出力の早い一方の値を格納しておき,必要な

タイミングで読み出す仕組みが必要です.

このような目的のために,しばしばFIFO(First-in First-

out)が利用されます.FIFOは,最初に書いたデータ順に

読み出せるメモリ回路です.

2.ランダム値生成関数の記述

前回,画像生成回路のテスト環境を作成しました(図2).

このとき,画像データの入力値は固定値でしたが,今回は

これをランダムに変化する値に変えます.

Verilog HDL

リスト1は,前回の画像データ生成部分のモジュールに

ランダム値を生成する記述を加えたものです.`ifdefの

文法を図3に示します.簡単にいえば,コンパイル時にマ

クロ名「RANDOM」を指定するとエリアAの記述がコンパ

イルされ,エリアBの記述はコンパイルされません.何も

指定しないとその逆になります.エリアBは前回の記述と

全く同じです.エリアAに書かれているファンクション

RandomGenは,図1の方法を使って疑似ランダム値を生

そのほかの原始多項式�10次 32次�   x10+x7+1 x32+x31+x4+1

(a)回路�

(b)出力される値�

11101000

…�

00000000

10110001

10000000

0011100011010010

10000001

8クロック経過�

54

3

21

255

255種類の値が循環�

1種類の値が循環�

8クロック�経過�

1 2 3 4 5 6 7 8

¡255クロック・サイクル・シフトを続けると8ビットの同じ値が表れる.�

¡8クロック・サイクルごとに値を見るなら,8クロック・サイクル×255回ごとに同じ値が表れる.�

¡XORゲートの入力は,原始多項式 x8+x4+x3+x2

+1の係数が1である� 次数に相当するレジスタ(フリップフロップ)の出力.�

1クロックしかシフトしないと,前の値を1回左シフトした値になるので,あまりランダムっぽい値にならない�

図1 疑似ランダム生成回路

8ビットのランダムな値を得る例を示す.

有効画像位置調整�同期信号生成�

画像データ�生成�

test_sync

CLK�RST

R_vbporch(10)�R_vdlength(10)�R_hbporch(10)�R_hdlength(10)�

yi_rin(8)�

R_inorder(3)� R_outorder(3)�R_yuv

yi_gin(8)�yi_bin(8)�

※ ( )内は信号のビット幅�

yr_yout(8)�yr_uout(8)�yr_vout(8)�

yuvfilter

ysyncpipe

ys_den

yinorder

test_top

yrgb2yuv youtorder

DUT

vsync_outhsync_out

YUV変換�

セレクタ1test_data

セレクタ2

R_hbporch

HSYNC VSYNC

R_hdlength

R_vbporch

R_vdlength

有効データ�

無効データ�

並べ替え� 並べ替え�

yout(8)�uout(8)�vou(8)�

rin(8)�gin(8)�bin(8)�

vsynchsync

図2 検証対象の回路とテストベンチの概要

前回(本誌2008年12月号,pp.93-103の第9回)と同じもの.