工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> VHDL

TEXTIOを使用して外部刺激ファイルからVHDLテストベンチを駆動する

外部ファイルから刺激データを読み取ることは、VHDLでテスト対象デバイス(DUT)を制御する強力な方法です。信号値とシミュレーション時間のシーケンスをプレーン・テキスト・ファイルにスクリプト化することで、設計者はテストベンチ・ロジックを変更せずにテスト・パターンを迅速に切り替えられます。VHDLファイル・アクセスに関するシリーズの第2弾となるこの記事では、TEXTIOライブラリを使用して刺激ファイルを読み取り、その値を4入力マルチプレクサーに適用する方法を実演します。

テスト・ケースの概要

DUTは、8ビット・データ・ワードを持つ標準的な非同期4入力マルチプレクサーです。テストベンチは出力検証を行わず、単に入力を駆動して波形を手動で確認できるようにします。参考までにエンティティ宣言を以下に再掲します。

 entity mux_4 is port( din_0 : in unsigned(7 downto 0); din_1 : in unsigned(7 downto 0); din_2 : in unsigned(7 downto 0); din_3 : in unsigned(7 downto 0); sel : in unsigned(1 downto 0); dout : out unsigned(7 downto 0)); end entity; 

DUTに接続する信号はテストベンチ・アーキテクチャで宣言され、ラベルDUTでインスタンス化されます:

 signal din_0 : unsigned(7 downto 0); signal din_1 : unsigned(7 downto 0); signal din_2 : unsigned(7 downto 0); signal din_3 : unsigned(7 downto 0); signal sel : unsigned(1 downto 0); signal dout : unsigned(7 downto 0); DUT: entity work.mux_4(rtl) port map ( din_0 => din_0, din_1 => din_1, din_2 => din_2, din_3 => din_3, sel => sel, dout => dout ); 

刺激ファイルの設計

多くの形式が可能ですが、以下の例は明確で人間が読みやすいレイアウトを示しています。各行は1つのシミュレーション・ステップを表し、以下を含みます:

行頭で始まるコメントはテストベンチで無視され、データ・セットに続くコメントはシミュレーター・コンソールに出力されます。

 # Column description: # wait_time | sel | din_0 | din_1 | din_2 | din_3 # Optional console printout 0 ns 0 AA BB CC DD # Setting initial values 10 ns 1 AA BB CC DD # Testing by changing the selector signal 10 ns 2 AA BB CC DD 10 ns 3 AA BB CC DD 10 ns 3 A1 B1 C1 D1 # Testing by changing all data inputs 10 ns 3 A2 B2 C2 D2 10 ns 3 A3 B3 C3 D3 10 ns 3 00 00 00 D2 # Changing all unselected inputs 10 ns 3 01 02 03 D2 10 ns 3 11 22 33 D2 1 ns 0 CC DD EE FF # Changing all inputs fast 1 ns 1 DD EE FF CC 1 ns 2 EE FF CC DD 1 ns 3 FF CC DD EE 10 ns 0 00 00 00 00 # Simulation stop 

TEXTIOによるファイル読み取り

以下は、刺激ファイルを開き、各行をパースし、DUT入力に値を割り当て、コメントを処理するコア・プロセスです。この例では、整形式ファイルを想定しています。列はスペース1つで区切られ、#文字の後にはスペース1つが続きます。

 PROC_SEQUENCER : process file text_file : text open read_mode is "stimulus.txt"; variable text_line : line; variable ok : boolean; variable char : character; variable wait_time : time; variable selector : sel'subtype; variable data : dout'subtype; begin while not endfile(text_file) loop readline(text_file, text_line); -- 空行と行頭コメントをスキップ if text_line.all'length = 0 or text_line.all(1) = '#' then next; end if; read(text_line, wait_time, ok); assert ok report "Read 'wait_time' failed for line: " & text_line.all severity failure; hread(text_line, selector, ok); assert ok report "Read 'sel' failed for line: " & text_line.all severity failure; sel <= selector; hread(text_line, data, ok); assert ok report "Read 'din_0' failed for line: " & text_line.all severity failure; din_0 <= data; hread(text_line, data, ok); assert ok report "Read 'din_1' failed for line: " & text_line.all severity failure; din_1 <= data; hread(text_line, data, ok); assert ok report "Read 'din_2' failed for line: " & text_line.all severity failure; din_2 <= data; hread(text_line, data, ok); assert ok report "Read 'din_3' failed for line: " & text_line.all severity failure; din_3 <= data; wait for wait_time; -- 末尾コメントがあればコンソールに出力 read(text_line, char, ok); -- 期待される改行をスキップ read(text_line, char, ok); if char = '#' then read(text_line, char, ok); -- 期待される改行をスキップ report text_line.all; end if; end loop; finish; end process; 

シミュレーション出力

ModelSimで実行すると、コンソールに累積シミュレーション時間とともに末尾コメントが表示されます。以下の抜粋は出力されるメモのシーケンスを示しています:

 # ** Note: Setting initial values # Time: 0 ns Iteration: 1 Instance: /file_stim_tb # ** Note: Testing by changing the selector signal # Time: 10 ns Iteration: 0 Instance: /file_stim_tb # ** Note: Testing by changing all data inputs # Time: 40 ns Iteration: 0 Instance: /file_stim_tb # ** Note: Changing all unselected inputs # Time: 70 ns Iteration: 0 Instance: /file_stim_tb # ** Note: Changing all inputs fast # Time: 91 ns Iteration: 0 Instance: /file_stim_tbf # ** Note: Simulation stop # Time: 104 ns Iteration: 0 Instance: /file_stim_tb # Break in Process PROC_SEQUENCER at file_stim_tb.vhd line 98 

テストベンチが生成する波形は、ファイルからのタイミングとデータ値を反映し、設計者がDUTの振る舞いを視覚的に検証できます。

重要なポイント

上記の例に従うことで、VHDLのTEXTIOの完全な柔軟性を活用し、複雑なテスト・シナリオを駆動しながら、クリーンで保守しやすいテストベンチ構造を維持できます。

TEXTIOを使用して外部刺激ファイルからVHDLテストベンチを駆動する

VHDL

  1. 三角ヤスリの設計・用途・手入れ方法を解説
  2. Linuxでデジタル署名を使用してバイナリファイルの完全性を検証する方法
  3. C# usingステートメント完全ガイド:名前空間インポート、エイリアス、静的ディレクティブ
  4. C言語 ファイル入出力: fopen, fprintf, fread, fseek をマスターする
  5. C言語ヘッダーファイルの理解:種類、使い方、ベストプラクティス
  6. VHDLのTEXTIOライブラリでテキスト・ファイルからFPGAブロックRAMを初期化する
  7. VHDLで自己検証テストベンチを構築する実践ガイド
  8. VerilogファイルI/Oの完全ガイド:オープン、読み取り、書き込み、クローズ
  9. Python JSON:エンコード、デコード、ファイル処理の実践ガイド
  10. Javaファイル操作のマスター:java.ioによる作成・読み取り・書き込み・削除
  11. Java BufferedReader でファイル読み込み:実践ガイドと例