メディア

高位設計手法にアサーションを適用アスペクト指向プログラミングの活用で(2/4 ページ)

» 2010年04月01日 00時00分 公開
[遠藤 侑介 (東芝 研究開発センター),EDN]

既存の手法の問題点

 続いて、具体的な回路記述の例を用い、従来のPSLではなぜ高位設計に対して十分なアサーションを記述できないのかを説明する。

 リスト2に示したのは、Verilog HDLによる回路記述の例である。バスからの入力を行う回路を表現しており、信号線must_readが1になったとき、バスに対してアドレス0xABCD番地のデータを要求し、次のクロックのタイミングにおけるバスのデータ線の値を信号線resultに書き込むというものだ*3)。バスは信号線bus_addr、bus_data、bus_en、bus_wrから成り立っている。


リスト2 VerilogHDLで記述したバス入力回路 リスト2 VerilogHDLで記述したバス入力回路 

 これに対して、「読み出し命令を受理したら、バスの読み込みを行う」というアサーションを記述するケースを考える。そのアサーションの中には、「読み出し命令を受理する」と「バスの読み込みを行う」という2つのイベントが存在することになる。これらのイベントがリスト2の設計記述上で信号線の条件として表現できるかどうか考えてみる。

 まず「読み出し命令を受理する」については「must_readが1になる」と表現できる。一方、「バスの読み込みを行う」は、「bus_enが1になり、かつ同時にbus_wrが0になる」と表現可能だ。これらを用いれば、「読み出し命令を受理したら、バスの読み込みを行う」というアサーションは、PSLを使ってリスト3のように記述することができる。

リスト3 アサーションの記述例 リスト3 アサーションの記述例 

 このコードでは、PSLのデフォルトクロックを信号線clkの立ち上がりと定め、あるクロックのタイミングで信号線must_readが1になっていたら、次のクロックで必ずbus_enが1に、かつbus_wrが0になることを宣言している。このように、信号線の値の変化だけによってイベントが表現できる場合には、PSLでアサーションを記述できる。

 一方、SystemCでは、モジュール間の通信はチャンネルを介して行う。チャンネルは通常いくつかの関数(メソッド)を持ち、それらを呼び出すことによって、モジュールからモジュールを駆動したり、データの受け渡しを行ったりする。

リスト4 SystemCで記述したバス入力回路 リスト4 SystemCで記述したバス入力回路 

 リスト4のコードは、リスト2と同様のバス入力を行う回路をSystemCによって記述したものである。このコードでは、読み込み開始の通知を受け渡すチャンネルmust_readと、実際の読み込みのための通信を行うチャンネルbusが使われている。この処理は、まず「must_read -> read()」を呼び出し、それがリターンするのを待ち受ける(ほかのモジュールが「must_read -> write()」を行ったらリターンする)。そして、リターンしたら、「bus -> read(0xabcd)」の呼び出しにより、バスに対してアドレス0xABCD番地のデータをリクエストし、この呼び出しの終了によってリクエストしたデータを受信するという意味になる。

 ここで問題になるのは、従来のPSLでは、「読み出し命令を受理したら、バスの読み込みを行う」というアサーションを記述することはできないということだ。なぜ記述できないのかと言えば、「呼び出し命令を受理する」ということは、「must_read -> readの呼び出しがリターンする」ことに相当し、「バスの読み込みを行う」ということは「bus -> readの呼び出しを開始する」ことに相当し、それぞれメソッド呼び出しで記述されているわけだが、メソッド呼び出しのような高位のイベントはPSLから指定できないからである。

リスト5 アサーションを適用できるように変更したコード リスト5 アサーションを適用できるように変更したコード 

 この問題に対する安易な解決策としては、PSLから指定したい高位のイベント(例としてはメソッド呼び出し)を反映する低位の代替イベント(例としては信号線の変化)を用意し、PSLからその低位の代替イベントを指定するという方法が考えられる。PSLから指定したいメソッド呼び出しの個所において、ダミーの変数の値を変化させ、PSLからはその変化を参照するのである。具体的には、「must_read -> read();」が終了した直後にダミーの変数leave_must_read_receivedの値をインクリメントし、また「bus -> read();」の直前でダミーの変数enter_bus_read_enteringの値をインクリメントする。このような変更を行った結果がリスト5に示した設計記述である。

リスト6 リスト5のコードに対応するPSLコード リスト6 リスト5のコードに対応するPSLコード 

 アサーションを適用するには、このように設計記述を書き換えた上で、PSLをリスト6のように書き換える。leave_must_read_receivedのような変数(信号線)の変化は低位のイベントであり、これであれば従来のPSLでも参照できる。これによってPSLを使って検証が行えるようになる。

 しかし、リスト4とリスト5を見比べればわかるように、アサーションのためのコードを挿入すると、本来の回路記述が煩雑で読みにくいものとなる。また、アサーションを記述するために設計記述を書き換えてしまうという行為は、本質的に好ましくない。さらに、アサーションと設計記述が互いに依存するようになってしまう。しかも、このような記述が多くのモジュールに遍在してしまうことになる。高位設計でアサーションを利用しようとすると、このような問題が生じてしまうのである。

 上述した問題を解決するために、筆者らは、ソフトウエア開発の分野で注目されている「アスペクト指向プログラミング(AOP:Aspect Oriented Programming)」という技術を活用することを考えた。以下では、まずAOPの考え方や処理系の例について解説を行った上で、AOPを用いた高位設計向けのアサーションベース検証手法を紹介する。


脚注

※3…例を簡素化するために、リセット処理などは省略している。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSフィード

公式SNS

EDN 海外ネットワーク

All material on this site Copyright © ITmedia, Inc. All Rights Reserved.
This site contains articles under license from AspenCore LLC.