(57)【特許請求の範囲】
【請求項１】
ＨＤＬ（ハードウェア記述言語）コードを実行するための方法であって、
前記方法は、
ハードウェア装置において、ＲＴＬ（レジスタ転送レベル）設計を記述するＨＤＬコードを受信するステップであって、前記ＨＤＬコードは、出力変数の値を決定する条件文を含み、前記条件文は、前記出力変数の値を決定するために第１のセットのＨＤＬ文を実行するかどうか、または前記出力変数の値を決定するために第２のセットのＨＤＬ文を実行するかどうかを決定するために制御表現を使用する、ステップと、
前記制御表現の値が不確定であるという決定に応じて、
該ハードウェア装置が、前記出力変数に関連する第１の一時値を決定するために前記第１のセットのＨＤＬ文を実行するステップと、
前記ハードウェア装置が、前記出力変数に関連する第２の一時値を決定するために前記第２のセットのＨＤＬ文を実行するステップと、
前記ハードウェア装置が、前記第１の一時値および前記第２の一時値を使用して前記出力変数の値を決定するステップと、
前記ハードウェア装置が、前記出力変数の値を記憶するステップと
を含む、方法。
【請求項２】
前記出力変数の値を決定するステップは、前記第１の一時値および前記第２の一時値を結合するために、ユーザ選択可能な結合関数を使用するステップを含む、請求項１に記載の方法。
【請求項３】
前記ユーザ選択可能な結合関数は、前記第１の一時値および前記第２の一時値のビット単位の結合を実施する、請求項２に記載の方法。
【請求項４】
前記ハードウェア装置は、
ＨＤＬコードを解釈することができるハードウェアベースのＨＤＬインタプリタ、または
前記ＨＤＬコードに基づいたオブジェクトコードを実行することができるコンピュータ
のうちの１つを含む、請求項１に記載の方法。
【請求項５】
前記条件文は、「ｉｆ」文または「ｃａｓｅ」文のうちの１つである、請求項１に記載の方法。
【請求項６】
ＨＤＬ（ハードウェア記述言語）コードを実行するための方法であって、
前記方法は、
ハードウェア装置において、ＲＴＬ（レジスタ転送レベル）設計を記述するＨＤＬコードを受信するステップであって、前記ＨＤＬコードは、出力変数の値を決定するために三項演算子を使用するＨＤＬ文を含み、前記三項演算子は、前記出力変数の値を第１のＨＤＬ表現から求めるか、または前記出力変数の値を第２のＨＤＬ表現から求めるかを決定するために制御表現を使用する、ステップと、
ハードウェア装置において、ユーザ選択可能な結合関数を受信するステップと、
前記制御表現の値が不確定であるという決定に応じて、
前記ハードウェア装置が、前記第１のＨＤＬ表現の値と前記第２のＨＤＬ表現の値とを結合するために前記ユーザ選択可能な結合関数を使用して前記出力変数の値を決定するステップと、
前記ハードウェア装置が、前記出力変数の値を記憶するステップと
を含む、方法。
【請求項７】
前記ユーザ選択可能な結合関数は、前記出力変数の値を、前記出力変数の値が不確定であることを示す特殊値に設定する、請求項６に記載の方法。
【請求項８】
前記出力変数の値を決定するステップは、
第１の値を前記第１のＨＤＬ表現から求めるステップと、
第２の値を前記第２のＨＤＬ表現から求めるステップと、
前記第１の値および前記第２の値を結合するように、ユーザ選択可能な結合関数を使用するステップと、
を含む、請求項６に記載の方法。
【請求項９】
前記ハードウェア装置は、
ＨＤＬコードを解釈することができるハードウェアベースのＨＤＬインタプリタ、または
前記ＨＤＬコードに基づいたオブジェクトコードを実行することができるコンピュータ
のうちの１つを含む、請求項６に記載の方法。
【請求項１０】
ＨＤＬ（ハードウェア記述言語）コードを実行するための方法であって、
前記方法は、
ハードウェア装置において、ＲＴＬ（レジスタ転送レベル）設計を記述するＨＤＬコードを受信するステップであって、前記ＨＤＬコードは、記憶場所を決定するためにインデックス表現を使用し、前記ＨＤＬコードは、前記記憶場所に第１の値を記憶する、ステップと、
前記インデックス表現の値が不確定であるという決定に応じて、
前記ハードウェア装置が、前記インデックス表現に対する候補インデックス値を選択するステップと、
前記ハードウェア装置が、前記候補インデックス値を使用して候補記憶場所を決定するステップと、
前記ハードウェア装置が、前記第１の値および前記候補記憶場所に現在記憶されている第２の値を使用して、結合値を決定するステップと、
前記ハードウェア装置が、前記候補記憶場所に前記結合値を記憶するステップと、
を含む、方法。
【請求項１１】
前記結合値を決定するステップは、前記第１の値および前記第２の値を結合するためにユーザ選択可能な結合関数を使用するステップを含む、請求項１０に記載の方法。
【請求項１２】
前記ユーザ選択可能な結合関数は、前記第１の値および前記第２の値のビット単位の結合を実施する、請求項１１に記載の方法。
【請求項１３】
前記ハードウェア装置は、
ＨＤＬコードを解釈することができるハードウェアベースのＨＤＬインタプリタ、または
前記ＨＤＬコードに基づいたオブジェクトコードを実行することができるコンピュータ
のうちの１つを含む、請求項１０に記載の方法。
【請求項１４】
ＨＤＬ（ハードウェア記述言語）コードを実行するための方法であって、
前記方法は、
ハードウェア装置において、ＲＴＬ（レジスタ転送レベル）設計を記述するＨＤＬコードを受信するステップであって、前記ＨＤＬコードは、クロック変数の値が、第１のクロック値から第２のクロック値に変化する場合は、出力変数に入力変数の値を代入し、前記ＨＤＬコードは、前記クロック変数の値が、前記第１のクロック値から前記第２のクロック値に変化しない場合は、前記出力変数の値を変更しない、ステップと、
前記クロック変数の値が、前記第１のクロック値から不確定値、または不確定値から前記第２のクロック値に変化したという決定に応じて、
前記ハードウェア装置が、前記入力変数の値および前記出力変数の現在値を結合することによって、前記出力変数の値を決定するステップと、
前記ハードウェア装置が、前記出力変数の値を記憶するステップと
を含む、方法。
【請求項１５】
前記出力変数の値を決定するステップは、前記入力変数の値および前記出力変数の現在値を結合するためにユーザ選択可能な結合関数を使用するステップを含む、請求項１４に記載の方法。
【請求項１６】
前記ユーザ選択可能な結合関数は、前記入力変数の値および前記出力変数の現在値のビット単位の結合を実施する、請求項１５に記載の方法。
【請求項１７】
前記ハードウェア装置は、
ＨＤＬコードを解釈することができるハードウェアベースのＨＤＬインタプリタ、または
前記ＨＤＬコードに基づいたオブジェクトコードを実行することができるコンピュータ
のうちの１つを含む、請求項１４に記載の方法。
【請求項１８】
ＨＤＬ（ハードウェア記述言語）コードを実行するための方法であって、
前記方法は、
ハードウェア装置において、ＲＴＬ（レジスタ転送レベル）設計を記述するＨＤＬコードを受信するステップであって、前記ＨＤＬコードは、出力変数の値を決定し、前記ＨＤＬコードは、制御表現の値に基づいて、前記ＨＤＬコードの異なる部分を実行する、ＨＤＬコンストラクトを含む、ステップと、
前記制御表現の値が不確定であるという決定に応じて、前記ハードウェア装置が、前記出力変数の値が不確定であるということを示す特殊値を前記出力変数に代入するステップであって、たとえ前記ＨＤＬコードの異なる部分が、前記出力変数に同一値を代入していても、前記特殊値は、前記出力変数に代入される、ステップと、
前記ハードウェア装置が、前記出力変数の値を記憶するステップと
を含む、方法。
【請求項１９】
前記ハードウェア装置は、
ＨＤＬコードを解釈することができるハードウェアベースのＨＤＬインタプリタ、または
前記ＨＤＬコードに基づいたオブジェクトコードを実行することができるコンピュータ
のうちの１つを含む、請求項１８に記載の方法。
【請求項２０】
前記ＨＤＬコードは、
「ｉｆ」文、「ｃａｓｅ」文、または三項演算子を含む文のうちの１つを含む、請求項１８に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
（発明者）
Ｇｕｉｌｌｅｒｍｏ  Ｍａｔｕｒａｎａ、Ａｒｔｕｒｏ  ＳａｌｚおよびＪｏｓｅｐｈ  Ｔ．Ｂｕｃｋ
（発明の分野）
本発明は、電子設計の自動化に関する。より特定すると、本発明は、不確定値を使用して動作コンストラクトをシミュレーションするための方法および装置に関する。
【背景技術】
【０００２】
（背景）
（関連技術）
コンピュータ技術の急速な進歩は、高度なシミュレーションおよび検証によって可能にされてきた。確かに、このようなツールがなければ、今日のコンピュータ機器によく見られる複雑な集積回路を検証することはほとんど不可能であろう。
【０００３】
電子設計フローの早期段階において、設計は通常、高レベルの抽象度で記述され、その後の段階において、設計は抽象度のレベルを徐々に下げて記述される。より高レベルの抽象度での各イベントまたは演算は、より低レベルの抽象度での複数のイベントまたは演算にマップするため、より高レベルの抽象度で実施されるシミュレーションは通常、より低レベルの抽象度で実施されるシミュレーションよりも高速で実行する。しかしながら、より低レベルの抽象度でのシミュレーションは、より高レベルの抽象度でのシミュレーションよりも詳細であるため、より低レベルの抽象度でのシミュレーションは通常、より高レベルの抽象度でのシミュレーションよりも正確である。
【０００４】
設計時間を低減するために、通常、設計フローのできるだけ早期にエラーを正確に特定することが所望される。エラーが特定される段階が遅れると、デバッグされた設計のために設計フローのいくつかの段階を繰り返されなければならない可能性が高くなるため、設計時間を大幅に増大させる可能性がある。したがって、通常、異なるレベルの抽象度でのシミュレーションが互いに一貫していることを確実にすることが所望されるのは、そうでなければ、より低レベルの抽象度でのシミュレーションが実施される後の段階でしか設計上のエラーが発見されない場合があるからである。
【発明の概要】
【課題を解決するための手段】
【０００５】
本発明の一実施形態は、不確定値を使用してＲＴＬ（レジスタ転送レベル）設計の動作コンストラクトをシミュレーションするシステムを提供する。具体的には、本発明の実施形態は、ユーザが、ＲＴＬシミュレーションによって生成される結果と、関連のゲートレベルのシミュレーションによって生成される結果との間の不一致を低減することを可能にできる。
【０００６】
工程の間、システムは、表現の値に依存して異なって動作するコンストラクト、例えば、制御表現の値に基づいてコードの異なる部分を実行することができる、または、インデックス表現の値に基づいて異なる記憶場所にデータを記憶することができる等、のコンストラクトを含むＨＤＬ（ハードウェア記述言語）を受信することができる。表現の値が不確定であるという決定に応じて、システムは、表現によって制御される２つ以上の代替を実行してから、その結果を何らかの規定の様式で結合することができる。
【０００７】
具体的には、本発明の実施形態は、例えば、条件が不確定である場合の「ｉｆ」文の意味論、条件またはケース表現が不確定である場合のｃａｓｅ文の意味論、センシティビティリストの条件が不確定になる場合の過程を制御するエッジセンシティブの意味論、インデックスが不確定である場合の変数の一部のインデックス付き選択の意味論、制御表現が不確定である場合の三項演算の意味論、４状態値から２状態値への変換の意味論、センシティビティリストの条件が不確定になる場合の過程内のエッジセンシティブイベントの意味論、条件が不確定である場合のレベルセンシティブイベント制御の意味論等の、不確定値に対するＨＤＬの意味論を修正する。
【０００８】
本発明の実施形態は、いくつかの手法を使用して動作コンストラクトをシミュレーションすることができる。例えば、システムは、修正されたＨＤＬコードが新しいＨＤＬ意味論に応じて作動するように、（例えば、プリコンパイラを使用して）ＨＤＬコードを修正または書き直してもよい。代替として、ＨＤＬコンパイラが、新しい意味論に応じてオブジェクトコードを生成するように修正されてもよい。また別の手法において、ＨＤＬインタプリタが、新しい意味論に応じてＨＤＬコードを解釈するように修正されてもよい。
本願明細書は、例えば、以下の項目も提供する。
（項目１）
ＨＤＬ（ハードウェア記述言語）コードを実行するための方法であって、
ＲＴＬ（レジスタ転送レベル）設計を記述するＨＤＬコードを受信するステップであって、前記ＨＤＬコードは、出力変数の値を決定する条件文を含み、前記条件文は、前記出力変数の値を決定するために第１のセットのＨＤＬ文を実行するかどうか、または前記出力変数の値を決定するために第２のセットのＨＤＬ文を実行するかどうかを決定するために制御表現を使用する、ステップと、
前記制御表現の値が不確定であるという決定に応じて、
前記出力変数に関連する第１の一時値を決定するために前記第１のセットのＨＤＬ文を実行するステップと、
前記出力変数に関連する第２の一時値を決定するために前記第２のセットのＨＤＬ文を実行するステップと、
前記第１の一時値および前記第２の一時値を使用して前記出力変数の値を決定するステップと、
前記出力変数の値を記憶するステップと
を含む、方法。
（項目２）
前記出力変数の値を決定するステップは、前記第１の一時値および前記第２の一時値を結合するために、ユーザ選択可能な結合関数を使用するステップを含む、項目１に記載の方法。
（項目３）
前記ユーザ選択可能な結合関数は、前記第１の一時値および前記第２の一時値のビット単位の結合を実施する、項目２に記載の方法。
（項目４）
前記方法は、
ＨＤＬインタプリタが前記ＨＤＬコードを解釈し、
コンピュータが、前記ＨＤＬコードをコンパイルすることによって生成されるオブジェクトコードを実行するか、または前記コンピュータが、
前記ＨＤＬコードを修正するようにプリコンパイラを使用することと、
前記修正されたＨＤＬコードをコンパイルすることと、
によって生成される前記オブジェクトコードを実行すると、実施される、項目１に記載の方法。
（項目５）
前記条件文は、「ｉｆ」文または「ｃａｓｅ」文のうちの１つである、項目１に記載の方法。
（項目６）
ＨＤＬ（ハードウェア記述言語）コードを実行するための方法であって、
ＲＴＬ（レジスタ転送レベル）設計を記述するＨＤＬコードを受信するステップであって、前記ＨＤＬコードは、出力変数の値を決定するために三項演算子を使用するＨＤＬ文を含み、前記三項演算子は、前記出力変数の値を決定するために第１のＨＤＬ表現を評価するかどうか、または前記出力変数の値を決定するために第２のＨＤＬ表現を評価するかどうかを決定するために制御表現を使用する、ステップと、
ユーザ選択可能な結合関数を受信するステップと、
前記制御表現の値が不確定であるという決定に応じて、
前記ユーザ選択可能な結合関数を使用して前記出力変数の値を決定するステップと、
前記出力変数の値を記憶するステップと
を含む、方法。
（項目７）
前記ユーザ選択可能な結合関数は、前記出力変数の値を、前記出力変数の値が不確定であることを示す特殊値に設定する、項目６に記載の方法。
（項目８）
前記出力変数の値を決定するステップは、
第１の値を取得するように、前記第１のＨＤＬ表現を評価するステップと、
第２の値を取得するように、前記第２のＨＤＬ表現を評価するステップと、
前記第１の値および前記第２の値を結合するように、ユーザ選択可能な結合関数を使用するステップと、
を含む、項目６に記載の方法。
（項目９）
前記方法は、
ＨＤＬインタプリタが前記ＨＤＬコードを解釈し、
コンピュータが、前記ＨＤＬコードをコンパイルすることによって生成されるオブジェクトコードを実行するか、または前記コンピュータが、
前記ＨＤＬコードを修正するようにプリコンパイラを使用することと、
前記修正されたＨＤＬコードをコンパイルすることと、
によって生成される前記オブジェクトコードを実行すると、実施される、項目６に記載の方法。
（項目１０）
ＨＤＬ（ハードウェア記述言語）コードを実行するための方法であって、
ＲＴＬ（レジスタ転送レベル）設計を記述するＨＤＬコードを受信するステップであって、前記ＨＤＬコードは、記憶場所を決定するためにインデックス表現を使用し、前記ＨＤＬコードは、前記記憶場所に第１の値を記憶する、ステップと、
前記インデックス表現の値が不確定であるという決定に応じて、
前記インデックス表現に対する候補インデックス値を選択するステップと、
前記候補インデックス値を使用して候補記憶場所を決定するステップと、
前記第１の値および前記候補記憶場所に現在記憶されている前記第２の値を使用して、結合値を決定するステップと、
前記候補記憶場所に前記結合値を記憶するステップと、
を含む、方法。
（項目１１）
前記結合値を決定するステップは、前記第１の値および前記第２の値を結合するためにユーザ選択可能な結合関数を使用するステップを含む、項目１０に記載の方法。
（項目１２）
前記ユーザ選択可能な結合関数は、前記第１の値および前記第２の値のビット単位の結合を実施する、項目１１に記載の方法。
（項目１３）
前記方法は、
ＨＤＬインタプリタが前記ＨＤＬコードを解釈し、
コンピュータが、前記ＨＤＬコードをコンパイルすることによって生成されるオブジェクトコードを実行するか、または前記コンピュータが、
前記ＨＤＬコードを修正するようにプリコンパイラを使用することと、
前記修正されたＨＤＬコードをコンパイルすることと、
によって生成される前記オブジェクトコードを実行すると、実施される、項目１０に記載の方法。
（項目１４）
ＨＤＬ（ハードウェア記述言語）コードを実行するための方法であって、
ＲＴＬ（レジスタ転送レベル）設計を記述するＨＤＬコードを受信するステップであって、前記ＨＤＬコードは、クロック変数の値が、第１のクロック値から第２のクロック値に変化する場合は、出力変数に入力変数の値を代入し、前記ＨＤＬコードは、前記クロック変数の値が、前記第１のクロック値から前記第２のクロック値に変化しない場合は、前記出力変数の値を変更しない、ステップと、
前記クロック変数の値が、前記第１のクロック値から不確定値、または不確定値から前記第２のクロック値に変化したという決定に応じて、
前記入力変数の値および前記出力変数の現在値を結合することによって、前記出力変数の値を決定するステップと、
前記出力変数の値を記憶するステップと
を含む、方法。
（項目１５）
前記出力変数の値を決定するステップは、前記第１の値および前記第２の値を結合するためにユーザ選択可能な結合関数を使用するステップを含む、項目１４に記載の方法。
（項目１６）
前記ユーザ選択可能な結合関数は、前記第１の値および前記第２の値のビット単位の結合を実施する、項目１５に記載の方法。
（項目１７）
前記方法は、ＨＤＬインタプリタが前記ＨＤＬコードを解釈し、
コンピュータが、前記ＨＤＬコードをコンパイルすることによって生成されるオブジェクトコードを実行するか、または前記コンピュータが、
前記ＨＤＬコードを修正するようにプリコンパイラを使用することと、
前記修正されたＨＤＬコードをコンパイルすることと、
によって生成される前記オブジェクトコードを実行すると実施される、項目１４に記載の方法。
（項目１８）
ＨＤＬ（ハードウェア記述言語）コードを実行するための方法であって、
ＲＴＬ（レジスタ転送レベル）設計を記述するＨＤＬコードを受信するステップであって、前記ＨＤＬコードは、出力変数の値を決定し、前記ＨＤＬコードは、制御表現の値に基づいて、前記ＨＤＬコードの異なる部分を実行する、ＨＤＬコンストラクトを含む、ステップと、
前記制御表現の値が不確定であるという決定に応じて、前記出力変数の値が不確定であるということを示す特殊値を前記出力変数に代入するステップであって、たとえ前記ＨＤＬコードの異なる部分が、前記出力変数に同一値を代入していても、前記特殊値は、前記出力変数に代入される、ステップと、
前記出力変数の値を記憶するステップと
を含む、方法。
（項目１９）
前記方法は、
ＨＤＬインタプリタが前記ＨＤＬコードを解釈し、
コンピュータが、前記ＨＤＬコードをコンパイルすることによって生成されるオブジェクトコードを実行するか、または
前記コンピュータが、
前記ＨＤＬコードを修正するようにプリコンパイラを使用することと、
前記修正されたＨＤＬコードをコンパイルすることと、
によって生成される前記オブジェクトコードを実行すると、実施される、項目１８に記載の方法。
（項目２０）
前記ＨＤＬコードは、
「ｉｆ」文、「ｃａｓｅ」文、または三項演算子を含む文のうちの１つを含む、項目１８に記載の方法。
【図面の簡単な説明】
【０００９】
【図１】図１は、本発明の実施形態に従い、集積回路の設計および製造の多様な段階を示す。
【図２】図２は、本発明の実施形態に従い、シミュレーションおよび検証ソリューションのワークフローを示す。
【図３】図３は、本発明の実施形態に従い、「ｉｆ」コンストラクトを示す。
【図４】図４は、本発明の実施形態に従い、ＲＴＬシミュレーションがゲートレベルシミュレーションとどのように一貫しないことがあり得るかを示す。
【図５】図５は、本発明の実施形態に従い、条件文をシミュレーションするための過程を示すフローチャートである。
【図６】図６は、本発明の実施形態に従い、変数インデックス表現を使用するコンストラクトをシミュレーションするための過程を示すフローチャートである。
【図７】図７は、本発明の実施形態に従い、コンピュータシステムを示す。
【発明を実施するための形態】
【００１０】
集積回路（ＩＣ）設計フロー
図１は、本発明の実施形態に従い、集積回路の設計および製造の多様な段階を示す。
【００１１】
過程は通常、製品考案（ステップ１００）で始まり、ＥＤＡ過程（ステップ１１０）を使用して実現される。設計が最終決定されると、通常、テープアウトされ（イベント１４０）、製造過程（ステップ１５０）、パッケージおよび組立過程（ステップ１６０）を経て、最終チップを製造する（結果１７０）。
【００１２】
ＥＤＡ過程（ステップ１１０）は、ステップ１１２〜１３０から成り、これらは以下に記載されるが、説明のみを目的とし、本発明の限定を意味するものではない。例えば、実際の集積回路設計は、設計者が、以下に説明される順序とは異なる順序で設計ステップを実施することを要求する場合がある。
【００１３】
システム設計（ステップ１１２）：このステップでは、設計者は、実装を望む機能性を記述する。また、もし〜ならの仮定プランニングも実施して、機能性を再調整したり、コストを確認したり等をすることもできる。ハードウェアとソフトウェアのアーキテクチャパーティショニングもこの段階で発生し得る。このステップで使用され得る、Ｓｙｎｏｐｓｉｓ，Ｉｎｃ．の例示的なＥＤＡソフトウェア製品としては、Ｍｏｄｅｌ  Ａｒｃｈｉｔｅｃｔ、Ｓａｂｅｒ（登録商標）、Ｓｙｓｔｅｍ  Ｓｔｕｄｉｏ、およびＤｅｓｉｇｎ  Ｗａｒｅ（登録商標）製品が挙げられる。
【００１４】
論理設計および機能検証（ステップ１１４）：この段階で、システム内のモジュールに対するＶＨＤＬまたはＶｅｒｉｌｏｇコードが作成され、設計は機能の正確性が確認される。より具体的には、設計は、正しい出力を生成することが確実であるように確認される。このステップで使用され得る、Ｓｙｎｏｐｓｉｓ，Ｉｎｃ．の例示的なＥＤＡソフトウェア製品としては、ＶＣＳ（登録商標）、Ｖｅｒａ（登録商標）、ＤｅｓｉｇｎＷａｒｅ（登録商標）、Ｍａｇｅｌｌａｎ（登録商標）、Ｆｏｒｍａｌｉｔｙ（登録商標）、ＥＳＰ、およびＬｅｄａ（登録商標）製品が挙げられる。
【００１５】
テストの合成および設計（ステップ１１６）：この段階で、ＶＨＤＬ／Ｖｅｒｉｌｏｇは、ネットリストに変換され得る。ネットリストは、ターゲット技術のために最適化され得、テストは、最終チップを確認するために設計して実装され得る。このステップで使用され得る、Ｓｙｎｏｐｓｙｓ、Ｉｎｃ．の例示的なＥＤＡソフトウェアとしては、Ｄｅｓｉｇｎ  Ｃｏｍｐｉｌｅｒ（登録商標）、Ｐｈｙｓｉｃａｌ  Ｃｏｍｐｉｌｅｒ（登録商標）、Ｔｅｓｔ  Ｃｏｍｐｉｌｅｒ、Ｐｏｗｅｒ  Ｃｏｍｐｉｌｅｒ（登録商標）、ＦＰＧＡ  Ｃｏｍｐｉｌｅｒ、ＴｅｔｒａＭａｘ（登録商標）、およびＤｅｓｉｇｎＷａｒｅ（登録商標）製品が挙げられる。
【００１６】
ネットリスト検証（ステップ１１８）：このステップで、ネットリストは、タイミング制約事項の順守、およびＶＨＤＬ／Ｖｅｒｉｌｏｇソースコードとの対応が確認される。このステップで使用され得る、Ｓｙｎｏｐｓｉｓ，Ｉｎｃ．の例示的なＥＤＡソフトウェア製品としては、Ｆｏｒｍａｌｉｔｉｙ（登録商標）、ＰｒｉｍｅＴｉｍｅ（登録商標）、およびＶＣＳ（登録商標）製品が挙げられる。
【００１７】
設計プランニング（ステップ１２０）：ここで、チップの全体的なフロアプランが作成され、タイミングおよびトップレベルの配線が分析される。このステップで使用され得る、Ｓｙｎｏｐｓｉｓ，Ｉｎｃ．の例示的なＥＤＡソフトウェア製品としては、Ａｓｔｒｏ（登録商標）、およびＩＣ  Ｃｏｍｐｉｌｅｒ製品が挙げられる。
【００１８】
物理的実装（ステップ１２２）：このステップで、配置（回路要素の位置）および配線（回路要素の接続）が発生する。このステップで使用され得る、Ｓｙｎｏｐｓｉｓ，Ｉｎｃ．の例示的なＥＤＡソフトウェア製品としては、Ａｓｔｒｏ（登録商標）、およびＩＣ  Ｃｏｍｐｉｌｅｒ製品が挙げられる。
【００１９】
分析および抽出（ステップ１２４）：この段階で、回路の機能がトランジスタレベルで検証される。ここで、もし〜ならの仮定の再調整が可能になる。このステップで使用され得る、Ｓｙｎｏｐｓｉｓ，Ｉｎｃ．の例示的なＥＤＡソフトウェア製品としては、ＡｓｔｒｏＲａｉｌ（登録商標）、ＰｒｉｍｅＲａｉｌ、ＰｒｉｍｅＴｉｍｅ（登録商標）、およびＳｔａｒ−ＲＣＸＴ（登録商標）製品が挙げられる。
【００２０】
物理的検証（ステップ１２６）：このステップにおいて、設計は、製造、電気関連、リトグラフ関連、回路の正確性が確実であるように確認される。このステップで使用され得る、Ｓｙｎｏｐｓｉｓ，Ｉｎｃ．の例示的なＥＤＡソフトウェア製品としては、Ｈｅｒｃｕｌｅｓ（登録商標）製品が挙げられる。
【００２１】
解決強化（ステップ１２８）：このステップには、設計の製造可能性を改善するように、レイアウトの幾何学的操作が関与する。このステップで使用され得る、Ｓｙｎｏｐｓｉｓ，Ｉｎｃ．の例示的なＥＤＡソフトウェア製品としては、Ｐｒｏｔｅｕｓ／Ｐｒｏｇｅｎ、ＰｒｏｔｅｕｓＡＦ、およびＰＳＭＧｅｎ製品が挙げられる。
【００２２】
マスクデータ準備（ステップ１３０）：このステップは、最終チップを製造するマスクの製造のための「テープアウト」データを提供する。このステップで使用され得る、Ｓｙｎｏｐｓｉｓ，Ｉｎｃ．の例示的なＥＤＡソフトウェア製品としては、ＣＡＴＳ（登録商標）ファミリー製品が挙げられる。
本発明の実施形態は、上記のステップの１つ以上の間に使用され得る。具体的には、本発明の一実施形態は、論理設計および機能検証ステップ１１４の間に使用され得る。
【００２３】
シミュレーションおよび検証
図２は、本発明の実施形態に従い、シミュレーションおよび検証ソリューションのワークフローを示す。
【００２４】
過程は、典型的には、被試験設計（ＤＵＴ）を記述するソースファイル２０４を作成することによって始まる（ステップ２０２）。ソースファイル２０４は、ＨＤＬを使用してＤＵＴを記述することができる。
例えば、ＤＵＴは、Ｖｅｒｉｌｏｇ等の標準ＨＤＬを使用して記述され得る。
【００２５】
次に、コンパイラを使用して、ソースファイルをコンパイラして、シミュレーション実行可能ファイル２０６を取得することができる（ステップ２０４）。シミュレーション実行可能ファイル２０６は、実行されると、ＤＵＴの動作をシミュレーションするソフトウェアアプリケーションであり得る。シミュレーション実行可能ファイルは、シミュレーション中にＤＵＴの検証を実施する命令も含むことができる。例えば、コンパイラは、シミュレーション中にＤＵＴの異なる部分の機能を確認するための命令を生成するように構成され得る。
【００２６】
次に、シミュレーション実行可能ファイルが実行されて、ＤＵＴをシミュレーションし、インタラクティブデバッグを実施することができ、シミュレーションダンプファイル２１０が、後の分析のために生成されてもよい（ステップ２０８）。シミュレーションダンプファイル２１０は、典型的には、シミュレーション中に信号値がどのように変化するかについての情報を含む。次に、シミュレーションダンプファイルが分析されて（ステップ２１２）、ＤＵＴをデバッグすることができる。
【００２７】
図２に示されるワークフローは、説明の目的のためだけであって、本発明の範囲を限定することを意図しない。当業者には、いくつかの変形が明らかであろう。例えば、システムは、プリコンパイラを使用して、ソースファイルを修正し、次いで、修正されたソースファイルをコンパイルすることができる。代替として、システムは、典型的にはワークフローにコンパイルステップを必要としない、インタプリタ型シミュレータを使用することができる。コンパイラベースの手法は、インタプリタベースの手法の余分なレイヤおよび非効率性を回避するため、コンパイラベースの手法は通常、インタプリタベースの手法よりもシミュレーションが高速で使用するメモリが少ないことに注意されたい。ソースファイルのコンパイラに必要な時間は、関連するソースファイルが最後にコンパイルされてから更新されていた場合を除き、コンパイルされたモジュールを再使用する、増分コンパイルを使用することによって、大幅に低減され得る。
【００２８】
ＲＴＬシミュレーションおよびゲートレベルシミュレーション
ＤＵＴは、異なるレベルの抽象度でシミュレーションされ得る。例えば、ＨＤＬは、典型的には、レジスタ転送レベル（ＲＴＬ）で設計を記述する。このレベルでは、ＤＵＴの動作は、信号値を記憶するレジスタ、および信号値の論理演算を実施する組み合わせ論理の観点から定義される。一方で、ＤＵＴは、レジスタ転送レベルよりも低レベルの抽象度である、ゲートレベルでも記述され得る。ゲートレベルで、ＤＵＴは、論理ゲートのネットワークとして表される。
【００２９】
より高レベルの抽象度での各イベントまたは演算は、典型的には、より低レベルの抽象度での複数のイベントまたは演算にマップするため、より高レベルの抽象度でのシミュレーションは通常、より低レベルの抽象度でのシミュレーションよりも迅速に実行する。しかしながら、より低レベルの抽象度でのシミュレーションは、より高レベルの抽象度でのシミュレーションよりも詳細であるため、より低レベルの抽象度でのシミュレーションは、典型的には、より高レベルの抽象度でのシミュレーションよりも正確である。したがって、より高レベルの抽象度でのシミュレーションは、シミュレーションがより低レベルの抽象度で実施される場合にのみ見られるエラーを見過ごす場合がある。
【００３０】
設計フローの早期段階は通常、高レベルの抽象度で設計を記述し、その後の段階はこれより徐々にレベルを下げた抽象度で設計を記述する。例えば、ＲＴＬ設計は、ゲートレベル設計を生成するように合成され得る。
【００３１】
設計時間を低減するために、設計フローのできるだけ早期にエラーを正確に特定することが所望される。エラーが特定される段階が遅れると、デバッグされた設計に対して設計フローのいくつかの段階を繰り返されなければならない可能性が高くなるため、設計時間を大幅に増大させる可能性がある。このため、異なるレベルの抽象度でのシミュレーションが同一の一連のエラーを特定することを確実にすることが所望される。具体的には、ＲＴＬシミュレーションは、ゲートレベルシミュレーションと同一の一連のエラーを生成すべきである。そうでなければ、エラーがないと思われるＲＴＬ設計が、ゲートレベルシミュレーションが実施される場合にのみ発見されるエラーを含む場合がある。
【００３２】
ＲＴＬシミュレーションがゲートレベルシミュレーションと全く同一のエラーを特定することを確実にすることは非常に困難な場合があることに注意されたい。しかしながら、２つのシミュレーションの間の不一致を低減することが所望される。
【００３３】
不確定値とパワーアップモデル化
ＨＤＬは、典型的には、ユーザが、信号の値が不確定であることを示すことを可能にする。不確定値は、論理最適化の間、「無関心」値として解釈され得る。例えば、ＨＤＬコードは、変数の値が不確定であることを示す変数に、特殊な値を代入することができる。合成の間、システムは、最小数のゲートを使用する最適化された論理回路を決定するために、不確定値の変数を活用することができる。
【００３４】
例えば、Ｖｅｒｉｌｏｇにおいて、記号「Ｘ」は、変数内の未知のビットを示すために使用され得て、これは、一連の値に属する変数の値を示すために使用され得る。値「１’ｂＸ」は、「１’ｂ０」または「１’ｂ１」のいずれかであり得る、１ビットが未知の値を示す。値「２’ｂ１Ｘ」は、最上位ビットが「１」に等しく、最下位ビットが未知の値である、２ビットの値を示す。したがって、値「２’ｂ１Ｘ」は、「２’ｂ１０」または「２’ｂ１１」のいずれかであり得る。同様に、値「２’ｂＸＸ」は、４つの可能な値、すなわち、「２’ｂ００」、「２’ｂ０１」、「２’ｂ１０」、「２’ｂ１１」のうちの１つであり得る。変数の値が２つ以上の値であり得る場合、変数は「不確定」値を有する。
【００３５】
パワーアップの間の信号値は通常不確定であるため、パワーアップの間の回路の動作をモデル化することは、非常に重要な検証問題をもたらす。さらに、複雑な低出力回路は、典型的には低電圧で作動するため、パワーアップ動作を正確にモデル化することは、これらの回路においては特に重要である。したがって、信号の電圧のわずかな差が、信号が「０」または「１」として解釈されるかどうかを変えることができ、パワーアップ信号値における不確実性を増加させる。さらに、これらの回路は複雑であるため、パワーアップ信号値に関する明示的または暗示的な想定を有する可能性が増加し、このため、パワーアップ信号値がこれらの想定を違反する可能性が増加し、これによって、不正な動作を発生させる。
【００３６】
上記のように、設計フローのできるだけ早期に設計エラーを検出することが所望される。特に、ＲＴＬ設計においてパワーアップの間の不正な動作を検出することが所望される。パワーアップ動作は、ＲＴＬ設計において、例えば、Ｖｅｒｉｌｏｇの「Ｘ」記号等、変数に代入されると、変数の値が不確定であることを示す、ＨＤＬの特殊な値を使用して、モデル化され得る。
【００３７】
残念ながら、従来のＨＤＬコンパイラおよびシミュレータは、所与のＨＤＬコンストラクトの不確定値を正しく解釈しない。これは、不確定値は、主に、コンパイラが論理回路を最適化することを助けることを意図したものであって、不確定信号値を使用してＲＴＬ設計の動作をシミュレーションするために使用されることを意図していなかったことからであり得る。このため、従来の技法において、ユーザは、パワーアップ動作を正しくモデル化することを望む場合に、このようなＨＤＬコンストラクトを採用することができない。変数が不確定である状況を明示的に処理するＨＤＬコードを作成することが可能な場合があることに注意されたい。しかしながら、このような手法は、ユーザに不自然な様式でコードを作成することを要求することになるため、手間がかかる。さらに、不確定値を明示的に処理するように既存のＨＤＬコードを書き直すことは、このような作業に関連する膨大なコストにより、非実用的であり得る。従来の技法とは対照的に、本発明の一実施形態は、既存のＨＤＬコードを書き直すことをユーザに要求せずにパワーアップ動作の正確なモデル化を可能にする様式において、不確定値を解釈するシステムを提供する。
【００３８】
図３は、本発明の実施形態に従い、「ｉｆ」コンストラクトを示す。
【００３９】
ソースファイル３０２は、「ｉｆ」文３０４を含むＨＤＬコードを包合することができる。「ｉｆ」文３０４は、制御表現３０６を使用して、文３０８または文３１０を実行するかどうかを決定する。例えば、制御表現３０６が１ビット値を評価すると想定する。制御表現３０６の値が「１’ｂ１」に等しい場合、文３０８が実行される。一方、制御表現３０６の値が「１’ｂ０」に等しい場合、文３１０が実行される。しかしながら、我々は、制御表現３０６の値が不確定である場合、つまり、制御表現３０６の値が「１’ｂＸ」に等しい場合の動作に関心がある。残念ながら、このシナリオにおいて、従来のＶｅｒｉｌｏｇ意味論は、「１’ｂＸ」の値を「１’ｂ０」の値として処理する。つまり、制御表現３０６が「１’ｂＸ」に等しい場合、文３１０は、従来のＶｅｒｉｌｏｇ意味論の下で実行されることになる。明らかに、従来のシミュレータは、制御表現３０６の値が「１’ｂ０」に等しいかのように「ｉｆ」文３０４を実行するため、パワーアップ動作をモデル化するために、制御表現３０６に不確定値が代入されると、従来のＶｅｒｉｌｏｇ意味論は、行動を正確にモデル化することに失敗する。
【００４０】
図４は、本発明の実施形態に従い、ＲＴＬシミュレーションがゲートレベルのシミュレーションとどのように一貫しないことがあり得るかを示す。
【００４１】
回路４０２は、値「１」および「０」を有する２つの入力と、制御入力と、出力と、を含む、セレクタである。制御入力が１に等しいと、「１」の値の入力は出力に結合され、制御入力が０に等しいと、「０」の値の入力は、出力に結合される。回路４０２は、ＨＤＬコード４０４を使用して表現され得る。具体的には、ＨＤＬコード４０４は、セレクタの制御入力が変数「ｃｏｎｄ」、およびセレクタの出力が変数「ａ」であることを表す。ＨＤＬコード４０４が合成されてゲートレベル設計を生成すると、ＨＤＬコード４０４は、ゲートレベルで、相当するＨＤＬコードが最適化されたコード４０６のようになるように、最適化される場合がある。コンパイラは、実際には最適化されたコード４０６を生成しない場合があり、その代わりに、最適化されたコード４０６に相当するラッチとして、ＨＤＬコード４０４を合成する場合があることに注意されたい。
【００４２】
当業者には、コード４０４および最適化されたコード４０６は機能的に同等であることが明らかであろう。しかしながら、従来の技法は、不確定値を正しく解釈しないため、ＲＴＬシミュレーションおよびゲートレベルシミュレーションは、従来のＶｅｒｉｌｏｇ意味論の下では異なる結果を生成する場合がある。具体的には、「ｃｏｎｄ」変数が不確定であると想定、例えば、「ｃｏｎｄ」変数は「１’ｂＸ」に等しいと想定する。Ｖｅｒｉｌｏｇは、シミュレーションの間に「Ｘ」の値を「０」の値として処理するため、従来のＲＴＬシミュレーションは、出力変数「ａ」に値「０」を代入する。一方、ゲートレベルシミュレーションは、出力変数「ａ」に値「Ｘ」を代入する。このため、このシナリオでは、ＲＴＬシミュレーションは、ゲートレベルシミュレーションと不一致であり得て、望ましくない。
【００４３】
ＲＴＬシミュレータとゲートレベルシミュレータとの間のこの不一致は、ＲＴＬシミュレータのエラーレポートが、ゲートレベルシミュレータのエラーレポートに比較される場合に、誤検知または検出漏れを発生させ得る。例えば、ＲＴＬシミュレータが、ゲートレベルシミュレータによれば実際はエラーではないエラーをレポートすると、誤検知が発生する場合がある。同様に、ＲＴＬしミュテータが、ゲートレベルシミュレータがレポートするエラーをレポートしないと、検出漏れが発生する場合がある。本発明の一実施形態は、ユーザが、ＲＴＬシミュレーションによって生成される結果と、ゲートレベルシミュレーションによって生成される結果との間の不一致を低減することを可能にできる。具体的には、本発明の実施形態は、ＨＤＬ意味論を変更することによって、ユーザが、誤検知および検出漏れの発生を低減することを可能にできる。
【００４４】
以下の項では、シミュレータが不確定値を正しく処理するように、ＨＤＬコードをシミュレーションするために使用され得るシステムおよび技法を説明する。
【００４５】
不確定値を使用する動作コンストラクトをシミュレーション
一実施形態において、システムは、表現の値に依存して異なって動作するコンストラクト、例えば、制御表現の値に基づいてコードの異なる部分を実行することができる、または、インデックス表現の値に基づいて異なるメモリ場所にデータを記憶することができる等のコントラクトを含むＨＤＬコードを受信することができる。表現の値が不確定であるという決定に応じて、システムは、表現によって制御される全ての代替を実行し、次いで、結果を何らかの規定の様式で結合する。
【００４６】
結果を合体する１つの様式は、代替の間で異なるいかなる状態も不確定になることを確実にすることである。結合過程は、代替に条件付スケジュール演算が関与しない場合に、理解がより容易であるように思えることに注意されたい。一部の代替が将来のイベントをスケジュールする場合、結合過程は困難になり得る。
【００４７】
一実施形態は、不確定条件によって制御されるコードの異なる部分（またはブロック）において、代入が発生すると、名前を変更された変数を作成する。次に、実施形態は、全ての名前を変更された変数の値を結合し、本来の変数への代入を実施することができる。
【００４８】
結合過程は典型的には、名前を変更された変数上で演算しないため、名前を変更された変数が結合される順序は、通常は無関係である。例えば、本来の変数がａ、ｂ、およびｃであると想定する。さらに、変数ａは、名前を変更された変数ａ１およびａ２に関連し、変数ｂは、名前を変更された変数ｂ１およびｂ２に関連し、変数ｃは、名前を変更された変数ｃ１およびｃ２に関連すると想定する。結合過程は、まず、名前を変更された変数ａ１およびａ２を結合して、変数ａの値を取得することができる。次に、結合過程は、関連する名前を変更された変数を結合することによって、変数ｂおよびｃの値を取得することができる。しかしながら、結合過程は、例えば、ｃ１およびｃ２の次にｂ１およびｂ２、さらに最後にａ１およびａ２を結合する等の異なる順序で、名前を変更された変数を結合した可能性もある。しかしながら、一部の状況において、順序は重要であり得ることに注意されたい。このような状況において、システムは、名前を変更された変数が正しい順序で結合されることを確実にすることができる。
【００４９】
結合過程は、いくつかの様式において実施され得る。例えば、１つの技法では、結合操作への引数が互いに等しくない場合に不確定値を出力し、引数が互いに等しい場合に引数のうちの１つの値を出力する。例えば、ａ１およびａ２が互いに等しくない場合、結合操作は、不確定値を出力してもよい。一方で、ａ１およびａ２が互いに等しい場合、結合操作は、ａ１の値を出力してもよい。別の技法では、制御表現が不確定である場合に不確定値を出力する。したがって、この技法では、引数が互いに等しいか等しくないかに関わらず、結合操作は必ず不確定値を出力する。一実施形態において、システムは、制御表現の値が不確定であるという決定に応じて、異なる代替を実行することなく、システムが不確定値を出力変数に代入するように、ＨＤＬコードを最適化することができる。
【００５０】
本発明の実施形態は、ユーザが使用を望む種類の結合をユーザが選択することを可能にする。このため、実施形態は、ユーザが、第１の結合技法がＨＤＬコードのある場所で使用されること、および第２の結合技法がＨＤＬコードの別の場所で使用されることを指定することを可能にしてもよい。
【００５１】
本発明の実施形態は、不確定値に対するＨＤＬ意味論、例えば、条件が不確定である場合の「ｉｆ」文の意味論、条件またはケース表現が不確定である場合のｃａｓｅ文の意味論、センシティビティリストの条件が不確定になる場合のプロセスを制御するエッジセンシティブの意味論、インデックスが不確定である場合の変数の一部のインデックス付き選択の意味論、制御表現が不確定である場合の三項演算の意味論、４状態値から２状態値への変換の意味論、センシティビティリストの条件が不確定になる場合のプロセス内のエッジセンシティブイベントの意味論、条件が不確定である場合のレベルセンシティビティリストイベント制御の意味論等を修正する。
【００５２】
ＨＤＬ意味論は、いくつかの技法を使用して修正され得る。例えば、システムは、修正されたＨＤＬコードが新しいＨＤＬ意味論に応じて作動するように、（例えば、プリコンパイラを使用して）ＨＤＬコードを修正または書き直してもよい。この技法の１つの利点は、新しい意味論はプリコンパイラに実装されるので、ＨＤＬコンパイラへの変更を必要としない場合があることである。代替として、ＨＤＬコンパイラが、新しい意味論に応じてオブジェクトコードを生成するように修正されてもよい。また別の手法において、ＨＤＬインタプリタが、新しい意味論に応じてＨＤＬコードを解釈するように修正されてもよい。
【００５３】
ＨＤＬコンストラクトの意味論の修正
以下の項では、本発明の実施形態が、ＨＤＬコンストラクトの意味論をどのように修正できるかについての実施例を提供する。
【００５４】
「ｉｆ」文
不確定条件のある「ｉｆ」文の場合、両方の代替の動作が実施され得て、次に、いずれか１つにおいて代入された全ての変数の値が結合され得る。
【００５５】
例えば、以下の「ｉｆ」文を検討する。
ｉｆ（ｃｏｎｄ）
ａ＝ｂ；
ｅｌｓｅ
ａ＝ｃ；
本発明の実施形態は、この「ｉｆ」文を、以下のように作成されているかのように解釈することによって、ＨＤＬ意味論を修正することができる。
ｉｆ（｜ｃｏｎｄ＝＝＝１’ｂｘ）
ａ１＝ｂ；
ａ２＝ｃ；
ａ＝ｍｅｒｇｅ（ａ１，ａ２）；
ｅｌｓｅ
ｉｆ（ｃｏｎｄ）
ａ＝ｂ；
ｅｌｓｅ
ａ＝ｃ；
表現（｜ｃｏｎｄ＝＝＝ｌ’ｂｘ）は、「ｃｏｎｄ」変数のビットを使用して「ＯＲ」演算を実施し、「ＯＲ」演算の結果が不確定であるかどうかを決定する。「ｃｏｎｄ」変数のビットのうちの１つでも「１」に等しい場合、「ＯＲ」演算の結果は、「１’ｂ１」である。しかしながら、「ｃｏｎｄ」変数が１つ以上の「Ｘ」ビットを有し、全ての他のビットが「０」である場合、「ＯＲ」演算の結果は、「１’ｂＸ」になる。実施形態が、「ＯＲ」演算の結果は不確定であると決定する場合、実施形態は、名前を変更された変数ａ１およびａ２を使用して「ｉｆ」文の２つの分岐の実行をモデル化し、「ｍｅｒｇｅ」関数を使用してａ１およびａ２の結果の値を結合し、結合値を変数ａに代入する。一方で、実施形態が、「ＯＲ」演算の結果は不確定ではないと決定する場合、実施形態は、通常のＨＤＬ意味論に応じて、本来の「ｉｆ」文を実行する。
【００５６】
本来の「ｉｆ」文を書き直すいくつかの様式が存在してもよいことに注意されたい。例えば、本来の「ｉｆ」文は、次のように書き直され得る。
ａ＝（Ｉ  ｃｏｎｄ＝＝＝‘ｘ）？ｍｅｒｇｅ（ｂ，ｃ）：（ｃｏｎｄ  ？  ｂ：ｃ）；
代替として、本来の「ｉｆ」文は、次のように書き直され得る。
ｉｆ（ｃｏｎｄ）
ａ＝ｂ；
ｅｌｓｅ  ｉｆ（！  ｃｏｎｄ）
ａ＝ｃ；
ｅｌｓｅ  ｂｅｇｉｎ
ａ１＝ｂ；
ａ２＝ｃ；
ａ＝ｍｅｒｇｅ（ａｌ，ａ２）；
ｅｎｄ
「ｍｅｒｇｅ」関数は、ユーザが、条件が不確定である場合に「ｉｆ」文がどのように解釈されるかを制御することを可能にできる。具体的には、ユーザは、コンパイル時または実行時に「ｉｆ」文の解釈を変更することができる。例えば、ユーザは、引数の値に関係なく不確定値を返す「悲観的な」結合関数が使用されるべきであることを指定してもよい。上記の例では、「悲観的な」結合関数は、ｂがｃに等しい場合でも不確定値を返すことになる。
【００５７】
代替として、ユーザは、可能な限り確定値を決定しようとする、より「楽観的な」結合関数を使用することができる。例えば、「楽観的な」結合関数は、引数が互いに等しい場合には引数値を返し、引数が互いに等しくない場合には不確定値を返してもよい。
【００５８】
「楽観的な」結合関数の別の例は、引数のビット単位の比較を実施し、引数のそれぞれのビットが互いに等しくない場合にのみ、ビットが不確定である値を返す関数である。例えば、変数ｂが「２’ｂ１０」に等しく、変数ｃが「２’ｂ１１」に等しいと想定する。楽観的な結合関数は、これらの値を結合して、値「２’ｂ１Ｘ」を取得してもよい。これらの結合関数の例は、説明の目的で提示されたものであって、本発明を開示された形式に限定することを意図しない。当業者には、いくつかの他の結合関数が使用され得ることが明らかであろう。
【００５９】
「ｅｌｓｅ」ブロックは、以下に示される「ｉｆ」文においては、存在しなくてもよい。
ｉｆ（ｃｏｎｄ）
ａ＝ｂ；
上記の「ｉｆ」文において、変数ｃｏｎｄが「０」に等しい場合、変数ａは変化しない。したがって、「ｉｆ」文は、次のように書き直され得る。
ｉｆ（Ｉ  ｃｏｎｄ  ＝＝＝ｌ’ｂｘ）
ａ１＝ｂ；
ａ２＝ａ；
ａ＝ｍｅｒｇｅ（ａｌ，ａ２）；
ｅｌｓｅ
ｉｆ（ｃｏｎｄ）
ａ＝ｂ；
上記の「ｉｆ」文を書き直すためのいくつかの様式が存在し得る。例えば、上記の「ｉｆ」文は、次のようにも書き直され得る。
ａ＝（Ｉ  ｃｏｎｄ＝＝＝‘ｘ）？  ｍｅｒｇｅ（ｂ，ａ）：（ｃｏｎｄ？ｂ：ａ）；
当業者には、「ｉｆ」文を書き直すための上記の技法は、他の状況に適合され得ることが容易に明らかであろう。例えば、「ｅｌｓｅ  ｉｆ」文の連鎖は、最後の「ｉｆ」から開始して下から上への形式で、解かれ得る。最後の「ｉｆ」文を上記の様式で書き直す場合「ｅｌｓｅ」が１つ少ない「ｉｆ」文となる。この様式において、「ｉｆ」文全体は、個々の「ｉｆ」文を反復して書き直すことによって、書き直され得る。
【００６０】
同様に、「ｉｆ」文内に複数の代入が存在する場合、これらも上記の技法を使用して処理され得る。具体的には、一連の名前を変更された変数は、いずれかの代替において代入された各本来の変数に対して作成され得て、次いで、一連の名前を変更された変数が結合され得て、本来の変数の値を決定する。
【００６１】
「ｉｆ」文はまた、関数またはタスク内の変数値も修正してもよい。このようなシナリオにおいて、異なる代替において修正される一連の変数が抽出され得て、修正されたコードは、本来の変数ではなく、名前を変更された変数に値を代入することができ、最終的に、システムは、全ての必要な結合演算を実施することができる。
【００６２】
「ｉｆ」文が既に不確定値に正しく対応する様式で作成されていた場合であっても、依然として、上記の新しい意味論を使用して書き直され得る、または解釈され得ることに注意されたい。例えば、「ｅｌｓｅ  ｉｆ」コンストラクトを使用する、次の「ｉｆ」文を検討する。
ｉｆ（｜ｃｏｎｄ  ＝＝＝  １’  ｂｘ  ）
ａ＝‘ｘ；
ｅｌｓｅ
ｉｆ（ｃｏｎｄ）
ａ＝ｂ；
ｅｌｓｅ
ａ＝ｃ；
条件は決して不確定ではないため、一番下の「ｉｆ」コンストラクトの書き直しは無用となる。不確定条件は、一番上の「ｉｆ」文によってキャッチされる。したがって、一番下の「ｉｆ」文の書き直しは、本来の動作を保存することになる。つまり、「ｉｆ」文が既に不確定値に正しく対応する様式で作成されている場合、「ｉｆ」文を書き直しても問題はない、つまり、意図された動作を保存することになる。
【００６３】
ＨＤＬは、「ｉｆ」文の意味論を修正するために使用され得る命令をサポートしてもよい。例えば、ＨＤＬは、ネスト構造の「ｉｆ」文の条件のどれもが成功しない場合、かつこのような条件に対応する「ｅｌｓｅ」ブロックが存在しない場合、エラーを生成する「一意」および「優先」ディレクティブを含むことができる。「一意」ディレクティブはまた、ネスト構造の「ｉｆ」文の複数の条件が真である場合にもエラーを生成してもよい。これらのエラー生成シナリオの場合、全ての出力変数は、シミュレーション中に「Ｘ」に設定され得る。同様に、「並列」および「完全」ディレクティブの場合、出力変数は、シミュレーション中にこれらの命令がエラーを生成することになるシナリオが発生すると、「Ｘ」に設定され得る。
【００６４】
例えば、ＨＤＬ意味論は、システムが、「一意」、「優先」または「完全」ディレクティブを有する「ｉｆ」文の最後に追加の「ｅｌｓｅ」文を追加するように修正され得る。「ｅｌｓｅ」文は、エラーを生成したであろう状況をキャッチし、出力変数に「Ｘ」の値を代入する。「一意」かつ「並列」ディレクティブを含む「ｉｆ」文の場合、システムは、ネスト構造の「ｉｆ」文の間に複数の一致が存在する場合、つまり、条件が相互に排他的でない場合、出力変数に「Ｘ」の値を代入することができる。
【００６５】
「ｃａｓｅ」文
「ｃａｓｅ」文の従来の意味論に応じて、ケース文内のブロックは、ブロックに関連するラベルが制御変数または表現に一致する場合にのみ選択される。したがって、制御変数または変数が不確定ビットを含む場合、「ｃａｓｅ」文は、１つが存在する場合はデフォルトのブロックを選択する場合、またはブロックを全く選択しない場合がある。
【００６６】
本発明の一実施例は、制御変数または表現が１つ以上の不確定ビットを含む場合に、「ｃａｓｅ」文の意味論を修正する。具体的には、実施形態は、制御変数または表現に一致する場合があるケースラベルに関連するブロックを実行することができる。次に、実施形態は、異なるブロックを実行する結果を結合することができる。例えば、制御変数の値が「２’ｂ１Ｘ」である場合、実施形態は、ラベル「２’ｂ１０」および「２’ｂ１１」に関連するブロックを実行し、結果を結合することができる。
【００６７】
ケース文の動作は、ネスト構造の「ｉｆ」文に相当する。例えば、以下のｃａｓｅ文を検討する。
ｃａｓｅ（ａ）
１０：ｓ０；
１１：ｓ１；
１２：ｓ２；
ｅｎｄｃａｓｅ
上記のｃａｓｅ文は、以下に示される「ｉｆ」文に本質的に相当する。
ｉｆ  （ａ  ＝＝＝  １０）  ｓ０；
ｅｌｓｅ  ｉｆ  （ａ  ＝＝＝  １１）  ｓ１；
ｅｌｓｅ  ｉｆ  （ａ  ＝＝＝  １２）  ｓ２；
上記に示された相当する「ｉｆ」文は、「ｉｆ」文の新しい意味論に応じて解釈され得る。ｃａｓｅ文の従来の意味論は、ケースの比較演算子（「＝＝＝」）を使用することに注意されたい。本発明の実施形態は、ケース比較演算子の代わりに正規の比較演算子（「＝＝」）を使用することによって、ｃａｓｅ文の意味論を変更することができる。
【００６８】
ラベルまたはケース条件のいずれかに明示的な「Ｘ」または「Ｚ」ビットが存在する場合、意味論は変更されずにそのままであり得る。また、本発明の一実施形態は、「ｃａｓｅ」文のデフォルト条件を特殊な様式で処理しない、つまり、ケースの条件が不確定である場合、デフォルト条件もまたケース文の代替であると見なされる。
【００６９】
「ｃａｓｅｘ」および「ｃａｓｅｚ」文は、正規の「ｃａｓｅ」文と同じに処理され得る。例えば、これらは、特定の種類の「ｃａｓｅ」文に応じて、文字ラベル内の任意の「Ｘ」または「Ｘ」ビットを拡張することによって、正規の「ｃａｓｅ」文に変換され得る。「Ｘ」および「Ｚ」ビットの拡張は２状態値であることに注意されたい。例えば、「ｃａｓｅｘ」文の「Ｘ」または「Ｚ」ビットは、「０」および「１」に拡張され得る。「ｃａｓｅｚ」文において、「Ｚ」ビットは、「０」および「１」に拡張され得るが、「Ｘ」ビットは拡張されない場合がある。「ｃａｓｅｘ」または「ｃａｓｅｚ」分が正規の「ｃａｓｅ」分に変換された後、次いで、上記に説明されたような新しいケース意味論に応じて解釈され得る。
【００７０】
ＳｙｓｔｅｍＶｅｒｉｌｏｇによって、「一意」および「優先」ディレクティブは「ｃａｓｅ」文で使用されることが可能になる。また、合成によって、「完全」および「並列」ディレクティブも「ｃａｓｅ」文で使用されることが可能になる。これらのディレクティブは、「ｉｆ」文で処理された様式と同一の様式で処理され得る。具体的には、一致するケースがない場合、実施形態は、全ての代入された変数に「Ｘ」の値を代入する、デフォルトのラベルを追加することができる。同様に、複数の一致ケース（一意または並列違反）がある場合、「Ｘ」の値は、関連する変数に代入され得る。
【００７１】
ケース表現内の不確定値の動作を指定する「ｃａｓｅ」文は、不確定値の動作を指定しない標準の「ｃａｓｅ」文と同一の様式で処理される。つまり、不確定値を処理するように既に作成されていた「ｃａｓｅ」文は、不確定値を処理するように作成されていなかったｃａｓｅ文とは異なって処理される必要がなくてもよい。しかしながら、新しい意味論に応じてこのような「ｃａｓｅ」文を解釈すると、ユーザが意図した動作をオーバーライドする場合がある。
過程のセンシティビティ
過程のセンシティビティリストは、過程がトリガーされるかどうかを決定する。センシティビティリストが不確定値を含む場合、問題は過程がトリガーされるかどうかである。本発明の一実施形態は、２つのシナリオ、すなわち、過程がトリガーされるシナリオ、および過程がトリガーされないシナリオからの結果を結合する。例えば、実施形態は、過程がトリガーされると過程が変数に代入する新しい値と、過程がトリガーされないシナリオに対応する既存の値とを結合することができる。
【００７２】
センシティビティリストの不確定値は、信号のエッジ演算子、または過程のエッジおよびレベルセンシティブ条件に対応する単純な信号であり得る。エッジ演算子の場合、不確定値は、エッジが不確定値へ移行、または不確定値から移行すると、発生し得る。本発明の実施形態は、論理によってサンプリングされる値が２種類の移行では異なり得て、異なる出力代入となるために、両方の種類の不確定移行に対応する。
【００７３】
説明を容易にするために、「ｅｄｇｅ」演算子を使用して、２つの値の移行を表す。具体的には、「ｅｄｇｅ」演算子を使用して、本発明の実施形態が、移行に対するＨＤＬ意味論を変更することによって、不確定な移行をどのように処理することができるかを示す。例えば、「ｅｄｇｅ（［０１］）ｃｌｋ」は、クロック「ｃｌｋ」の上昇エッジを表す。同様に、Ｖｅｒｉｌｏｇの「ｐｏｓｅｄｇｅ」の意味論は、「ｅｄｇｅ（［０１］［０Ｘ］［０Ｚ］［Ｘ１］［Ｚ１］）」に相当し、つまり、正のエッジは、０から１、０からＸ、０からＺ、Ｘから１、Ｚから１の移行を含む。
【００７４】
Ｖｅｒｉｌｏｇにおいて、入力「ｄ」、出力「ｑ」、およびクロック「ｃｌｋ」によるＤフリップフロップは、次のようにモデル化され得る。
ａｌｗａｙｓ  ＠  （ｐｏｓｅｄｇｅ  ｃｌｋ  ）  ｑ  ＜＝  ｄ；
本発明の実施形態は、Ｄフリップフロップに次の意味論を使用する。
ａｌｗａｙｓ  ＠  （ｅｄｇｅ  （［０１］）  ｃｌｋ）  ｑ  ＜＝  ｄ；
ａｌｗａｙｓ  ＠  （  ｅｄｇｅ  （  ［０ｘ］  ［０ｚ］  ［  ｘ１］  ［ｚ１］  ）  ｃｌｋ）  ｑ  ＜＝  ｍｅｒｇｅ  （  ｄ，  ｑ）  ；
つまり、Ｄフリップフロップの場合、０から１への移行は以前と同様に処理されるが、０からＸ、０からＺ、Ｘから１、またはＺから１への移行は、「ｄ」と「ｑ」の値を結合し、結合値を「ｑ」に代入することになる。
【００７５】
変数インデックス表現
変数インデックス表現は、セレクタ変数または表現に基づいて、ベクトルまたは配列の一部を選択する表現である。セレクタ変数または表現が不確定である場合、選択されているベクトルまたは配列の一部は、不確定である。従来のＨＤＬ意味論の下では、インデックスが不確定の配列上で読み取り演算が実施されると、読み取り演算は、不確定値を返す。本発明の一実施形態は、インデックスが不確定値を有する場合、ベクトルまたは配列の読み取り演算の意味論を変更しない。つまり、実施形態は、不確定であるインデックスを使用して、ベクトルまたは配列上で読み取り演算が実施される場合、不確定値を返す。本発明の別の実施形態は、不確定インデックスが有することができるインデックス値に関連するベクトルまたは配列要素を結合し、結合値を読み取り演算の結果として返すことによって、従来のＨＤＬ意味論を修正することができる。
【００７６】
従来のＨＤＬ意味論の下では、インデックスが不確定の配列上で書き込み演算が実施されると、書き込み演算は、どの配列要素にも書き込まない、つまり、書き込み演算は何も実行しない。本発明の一実施形態は、不確定インデックスが有することができるインデックス値に関連するベクトルまたは配列要素に現在記憶されている値に、書き込まれる値を結合し、結合値をそれらのベクトルまたは配列要素に書き込むことによって、従来のＨＤＬ意味論を修正する。
【００７７】
例えば、配列「ｍｅｍ」は、３ビットインデックスを使用してアクセスされ得る、８つの要素を記憶すると想定する。インデックス「３’ｂ００Ｘ」に値「ｖａｌ」を書き込む場合、従来の意味論に従うと、インデックスは不確定値を有するために、値「ｖａｌ」は書き込まれない。対照的に、本発明の実施形態は、配列要素ｍｅｍ［３’ｂ０００］およびｍｅｍ［３’ｂ００１］に書き込む。具体的には、実施形態は、値「ｍｅｒｇｅ（ｖａｌ、ｍｅｍ［３’ｂ０００］）」を配列要素ｍｅｍ［３’ｂ０００］に書き込み、さらに値「ｍｅｒｇｅ（ｖａｌ、ｍｅｍ［３’ｂ００１］）」を配列要素ｍｅｍ［３’ｂ００１］に書き込む。
【００７８】
三項演算子
従来のＨＤＬ意味論の下では、三項演算子「？」の動作は通常、そのゲートレベルの実装よりも「楽観的」である。本発明の一実施形態は、より「悲観的」であるように三項演算子の動作を修正する。
【００７９】
具体的には、スカラー「ｂ」および「ｃ」の場合、三項演算子「ａ？ｂ：ｃ」は、ゲートレベルでは「（ａ＆ｂ）｜（〜ａ＆ｃ）」として実装され得る。従来のＨＤＬ意味論の下では、三項演算は、制御変数「ａ」が不確定であっても、これらが互いに等しい場合、スカラー「ｂ」または「ｃ」の値を返すことができる。しかしながら、ゲートレベル実装は、「ｂ」および「ｃ」の値が互いに等しい場合であっても、制御変数「ａ」が不確定であれば、不確定値を返す。ゲートレベル実装は、ＨＤＬ解釈が不確定値を返さない状況で不確定値を返すため、ゲートレベル意味論は、ＨＤＬ意味論よりも「悲観的」であり得る。
【００８０】
一実施形態において、システムは、ユーザ選択可能な結合関数を受信することができる。
制御表現の値が不確定であるという決定に応じて、システムは、ユーザ選択可能な結合関数を使用して出力変数の値を決定し、出力変数の値を記憶することができる。
【００８１】
本発明の一実施形態は、条件が不確定の場合、三項演算子が、代替の結合を実施し、結合値を返すように、三項演算子の意味論を修正する。具体的には、変数「ａ」がＨＤＬ文「ａ？ｂ：ｃ」において不確定である場合、三項演算子は、値「ｍｅｒｇｅ（ｂ、ｃ）」を返す。
【００８２】
４状態から２状態への変換
別の問題となり得るコンストラクトは、４状態から２状態への変換の動作である。変換された４状態値がいくつかの非２状態値（例えば、ＸまたはＺ）を有する場合、変換中に情報が失われる。一実施形態において、シミュレータは、このような変換が発生すると、実行時警告を生成する。代替として、シミュレータは、実行時エラーを発行し、シミュレーションを停止することができる。シミュレーションの動作は、ユーザによって選択され得る。
【００８３】
ＨＤＬコンストラクトの意味論の修正過程
制御表現に基づいて実行されるＨＤＬコードの一部は、単純な代入よりもはるかに複雑であり得て、非常に複雑な動作につながり得ることに注意されたい。本発明の一実施形態は、関数呼び出しによって実施されるいかなる副作用も結合関数に送信されないことを確実にすることによって、複雑度を限定する。つまり、コードのいかなる関数またはタスクも、通常に呼び出されたかのように実行され得て、結果は結合されない。別の実施形態において、システムは、副作用のあるタスクまたは関数への呼び出しがある場合、新しい意味論を抑制することができる。例えば、プログラミングインターフェースを経由して呼び出されるいかなるユーザ関数も、システムに新しい意味論を抑制させる場合がある。また別の実施形態において、システムは、関数呼び出しを確認し、関数呼び出しが、関数呼び出し外でアクセスされる非ローカル変数に値を代入するかどうかを決定することができる（例えば、関数呼び出しへの参照によって渡されるグローバル変数）。そうであれば、実施形態は、結合値をこれらに代入することによって、これらの変数に新しい意味論を適用することができる。
【００８４】
以下の項では、新しい意味論に応じてＨＤＬコードをシミュレーションするための過程を説明する。当業者には、多数の修正及び変形が容易に明らかであることに注意されたい。例えば、インタプリタを使用してＨＤＬコードをシミュレーションする代わりに、システムは、ＨＤＬコードをコンパイルして、コンピュータによって実行されると、コンピュータに、新しいＨＤＬ意味論に応じてＨＤＬコードをシミュレーションさせる、オブジェクトコードを生成することができる。代替として、システムは、修正されたＨＤＬコードがコンパイルされると、コンピュータによって実行される場合にコンピュータに新しいＨＤＬ意味論に応じてＨＤＬコードをシミュレーションさせることができる、オブジェクトコードを生成するように、ＨＤＬコードを修正または書き直すことができる。
【００８５】
一実施形態において、「表現」および「文」という用語は、異なるプログラム言語のコンストラクトに関連するため、同義語ではない。具体的には、ＨＤＬ表現およびＨＤＬ文は、ＨＤＬの文法において異なる非終端記号に関連し得る。一実施形態において、文は表現を含むことができるが、表現は文を含むことができない。
【００８６】
図５は、本発明の実施形態に従い、条件文をシミュレーションするためのプロセスを示すフローチャートである。
【００８７】
過程は、ＲＴＬ設計を記述するＨＤＬコードを受信することによって開始することができ、ＨＤＬコードは、出力変数の値を決定する条件文を含み、条件文は、第１のセットのＨＤＬ文を実行して出力変数の値を決定するかどうか、または第２のセットのＨＤＬ文を実行して出力変数の値を決定するかどうか、を決定するために、制御表現を使用する（ステップ５０２）。制御表現は、ＨＤＬの構文に一致するＨＤＬ表現であり得る。一連のＨＤＬ文は、ゼロ以上のＨＤＬ文を含むことができる。
【００８８】
例えば、ＨＤＬコードは、例えば、条件等の制御表現を使用する「ｉｆ」文を含むことができて、第１のセットのＨＤＬ文を実行するかどうか、または第２のセットのＨＤＬ文を実行するかどうかを決定する。代替として、ＨＤＬコードは、制御表現を使用する「ｃａｓｅ」文を含むことができて、どのセットのＨＤＬ文を実行するかどうかを決定する。加えて、ＨＤＬコードは、例えば、センシティビティリスト等の制御表現を使用する過程を含むことができて、一連のＨＤＬ文を実行するかどうかを決定する。
【００８９】
一実施形態において、例えば、「？」演算子等の三項演算子は、条件文ではない。三項演算子は、条件表現の値を使用して、第１の表現を評価するかどうか、または第２の表現を評価するかどうかを決定する。一方で、条件文は、条件表現の値を使用して、第１のセットの文を評価するかどうか、または第２のセットの文を評価するかどうかを決定する。実施形態が表現および文を異なるＨＤＬコンストラクトとして処理する場合、三項演算子は、条件文ではない。
【００９０】
上記のように、一連のＨＤＬ文は、「ヌル」であり得る、つまり、ＨＤＬ文を全く含まない場合がある。例えば、「ｅｌｓｅ」ブロックを有さない「ｉｆ」文を検討する。この「ｉｆ」文は、条件が真の場合に実行される１つのセットのＨＤＬステートメントだけを有し、「ｅｌｓｅ」ブロックに対応するＨＤＬ文のセットは「ヌル」である。同様に、過程は典型的には、センシティビティリストに基づいて一連のＨＤＬ文を実行する。センシティビティリストに説明される条件が真ではない場合、仮定は通常どのコードも実行しない。
【００９１】
次に、システムはＨＤＬコードをシミュレーションすることができる。具体的には、シミュレーションの間、システムは、制御表現の値が不確定であるかどうかを確認することができる（ステップ５０４）。
【００９２】
制御表現の値がわかっている場合、つまり、制御表現の値のビットのどれもが不確定ビットではない場合、システムは、従来の意味論に応じてＨＤＬコードをシミュレーションすることができる（ステップ５０６）。具体的には、システムは、制御表現の値を使用して、第１のセットのＨＤＬ文または第２のセットのＨＤＬ文を実行するかどうかを決定することができ、実行中に、出力変数の値を決定する。
【００９３】
一方で、制御表現の値が不確定である場合、システムは、新しい意味論に応じてＨＤＬコードをシミュレーションすることができる（ステップ５０８）。
【００９４】
具体的には、システムは、第１のセットのＨＤＬ文を実行して、出力変数に関連する第１の一時値を決定することができる（ステップ５１０）。
【００９５】
次に、システムは、第２のセットのＨＤＬ文を実行して、出力変数に関連する第２の一時値を決定することができる（ステップ５１２）。
【００９６】
システムは、次いで、第１の一時値および第２の一時値を使用して、出力変数の値を決定することができる（ステップ５１４）。一連のＨＤＬ文がヌルの場合、一連のＨＤＬ文を実行することは、何も実行しない、つまり、ＮＯＰを実施することに相当し得る。例えば、第２のセットのＨＤＬ文が空である場合、システムは、次のステップをスキップするだけであり、つまり、システムは、第１の一時値および出力変数の既存の値を使用して、出力変数を決定する。
【００９７】
一実施形態において、システムは、「ｍｅｒｇｅ」関数を使用して、第１の一時値および第２の一時値を結合することによって、出力変数の値を決定することができる。結合関数は、結合値を第１の一時値または第２の一時値に設定することができる。代替として、第１の一時値が第２の一時値に等しくない場合、結合関数は、結合値を、例えば、「Ｘ」等の出力変数の値が不確定であることを示す特殊値に設定することができる。例えば、第１の一時値が「２’ｂ１０」であり、第２の一時値が「２’ｂ１１」である場合、ある結合関数は「２’ｂ１０」を返すことができ、別の結合関数は「２’ｂ１１」を返すことができ、また別の結合関数は「Ｘ」を返すことができる。
【００９８】
また別の実施形態において、システムは、２つの値のビット単位の結合を実施することによって、第１の一時値または第２の一時値を結合することができる。具体的には、システムは、第１の一時値および第２の一時値のそれぞれのビットが互いに等しくない場合、出力変数のビットを「Ｘ」に設定することができる。そうでなければ、ビットが互いに等しい場合、システムは、出力変数のそれぞれのビットをこのビット値に等しいように設定することができる。例えば、第１の一時値が「２’ｂ１０」であり、第２の一時値が「２’ｂ１１」である場合、結合関数は「２’ｂ１Ｘ」を返すことができる。
【００９９】
一実施形態において、システムは、ユーザ選択可能な結合関数を使用することによって、出力変数の値を決定して、第１の一時値および第２の一時値を結合する。ユーザ選択可能な結合関数は、ＲＴＬ設計の動作が合成されたゲートレベル設計の動作と実質的に同一であるように、選択され得る。一実施形態において、システムは、実行時の間にユーザ選択可能な結合関数の機能を変更することができる。例えば、シミュレータまたはシミュレーション実行可能ファイルは、シミュレーションを一時停止するために使用され得る、ユーザインターフェースを表示することができる。次に、ユーザは、異なるユーザ選択可能な結合関数の機能を選択することができる。次に、ユーザは、新しいユーザ選択可能な結合関数の機能を使用して、シミュレーションを継続することができる。代替として、ユーザは、コンパイルの間に使用するユーザ選択可能な結合関数の機能を指定することができる。
【０１００】
図５に示される過程を継続して、システムは次に、出力変数の値をコンピュータ可読記憶媒体に記憶することができる（ステップ５１６）。例えば、システムは、出力変数に関連する記憶場所に出力変数の値を記憶することができる。
【０１０１】
図５に示される過程の多数の修正および変形が可能である。例えば、一実施形態において、システムは、制御変数の値に基づいて、ＨＤＬコードの異なる部分を実行するＨＤＬコンストラクを含む、ＨＤＬコードを受信することができる。次に、制御変数の値が不確定であるという決定に応じて、システムは、出力変数の値が不確定であることを示す出力変数に、特殊値を代入することができる。実施形態は、ＨＤＬコードの異なる部分が、出力変数に同一値を代入する場合であっても、出力変数に特殊値を代入してもよい。この実施形態において、システムは、制御変数の値が不確定であることを決定すると同時に、出力変数に特殊値を代入することができるため、結合関数を使用しない、または変数の名前を変更しない場合があることに注意されたい。つまり、システムは、結果が名前を変更された変数の関数ではないため、結合関数を省略することができる。
【０１０２】
別の実施形態において、システムは、クロック変数の値が、第１のクロック値から第２のクロック値に変化する場合、出力変数に入力変数の値を代入するＨＤＬコードを受信することができる。しかしながら、クロック変数の値が、第１のクロック値から第２のクロック値に変化しない場合、ＨＤＬコードは、出力変数の値を変更しない場合がある。次に、クロック変数の値が第１のクロック値から不確定値、または不確定値から第２のクロック値に変化しないという決定に応じて、システムは、入力変数の値および出力変数の現在値を使用して、結合値を決定することができる。システムは、次に、結合値を出力変数に代入する。
【０１０３】
図６は、本発明の実施形態に従い、変数インデックス表現を使用するコンストラクトをシミュレーションするための過程を示すフローチャートである。
【０１０４】
過程は、ＲＴＬ設計を記述するＨＤＬコードを受信することによって開始することができ、ＨＤＬコードは、インデックス表現を使用して記憶場所を決定してから、記憶場所に値を記憶する（ステップ６０２）。例えば、ＨＤＬコードは、インデックス表現を使用して決定される配列要素に値を書き込む文を含むことができる。インデックス表現は、ＨＤＬの構文に一致するＨＤＬ表現であり得る。記憶場所は、値を記憶するために使用されるコンピュータ可読記憶媒体上の場所であり得る。例えば、記憶場所は、ベクトルまたは配列要素を記憶するために使用される記憶場所であり得る。
【０１０５】
次に、システムは、ＨＤＬコードをシミュレーションすることができる。具体的には、シミュレーションの間、システムは、インデックス表現の値が不確定であるかどうかを確認することができる（ステップ６０４）。
【０１０６】
インデックス表現の値がわかっている場合、システムは、従来の意味論に応じてＨＤＬコードをシミュレーションすることができる（ステップ６０６）。具体的には、システムは、インデックス表現の値を使用して、記憶場所を決定し、記憶場所に値を書き込むことができる。
【０１０７】
一方で、制御表現の値が不確定である場合、システムは、新しい意味論に応じてＨＤＬコードをシミュレーションすることができる（ステップ６０８）。
【０１０８】
具体的には、システムは、インデックス表現の値に対する一連の候補インデックス値を決定することができる（ステップ６１０）。例えば、インデックス表現の値が「２’ｂ１Ｘ」である場合、一連の候補インデックス値は、「２’ｂ１０」および「２’ｂ１１」を含むことができる。
【０１０９】
各候補インデックス値に対して、システムは、候補記憶場所を決定することができる（６１２）。例えば、システムは、候補インデックス値を選択し、選択された候補インデックス値を使用して候補記憶場所を決定することができる。
【０１１０】
次に、システムは、候補記憶場所に現在記憶されている値を決定することができる（ステップ６１４）。
【０１１１】
システムは、次に、記憶場所に書き込まれる値、および候補記憶場所に現在記憶されている値を使用して、結合値を決定することができる（ステップ６１６）。上記のように、システムは、異なる結合関数を使用して、結合値を決定することができる。
【０１１２】
次に、システムは、結合値を候補記憶場所に記憶することができる（ステップ６１８）。
【０１１３】
図７は、本発明の実施形態に従い、コンピュータシステムを示す。
【０１１４】
コンピュータシステムは、ＨＤＬコードをシミュレーション、コンパイル、または修正するために使用され得る。コンピュータシステム７０２は、プロセッサ７０４、メモリ７０６、および記憶装置７０８を備える。コンピュータシステム７０２は、ディスプレイ７１４、キーボード７１０、およびポインティングデバイス７１２に連結され得る。記憶装置７０８は、ＨＤＬコード７１６、プリコンパイラ７１８、修正されたＨＤＬコード７２０、コンパイラ７２２、シミュレーション実行可能ファイル７２４、およびインタプリタ７２６を記憶することができる。
【０１１５】
ユーザは、新しいＨＤＬ意味論に従って、ＨＤＬコード７１６によって記述されたＲＴＬ設計をシミュレーションすることを所望する場合がある。ユーザは、プリコンパイラ７１８を使用して、ＨＤＬコード７１６を書き直し、または修正して、修正されたＨＤＬコード７２０を生成することができる。修正されたＨＤＬコード７２０は、次に、コンパイラ７２２を使用してコンパイルされて、シミュレーション実行可能ファイル７２４を生成することができる。シミュレーション実行可能ファイルがコンピュータシステム７０２によって実行されると、コンピュータシステム７０２に、新しい意味論に従ってＲＴＬ設計の動作をシミュレーションさせることができる。代替として、ユーザは、インタプリタ７２６に修正されたＨＤＬコード７２０を提供して、新しい意味論に従ってＲＴＬ設計をシミュレーションすることができる。
【０１１６】
コンパイラ７２２およびインタプリタ７２６は、新しいＨＤＬ意味論が、プリコンパイラ７１８によって完全に実装される場合、従来のＨＤＬ意味論を使用することができる。代替として、新しいＨＤＬ意味論が、コンパイラ７２２またはインタプリタ７２６によって実装される場合、プリコンパイラ７１８またはプリコンパイルステップを必要としない場合がある。また別の変形において、新しい意味論の一部の態様は、プリコンパイラ７１８によって実装され得るが、他の態様は、コンパイラ７２２またはインタプリタ７２６によって実装され得る。
【０１１７】
コンパイラは、オブジェクトコードにマーカーを挿入することができて、デバッガが、オブジェクトコードの一部に対応するＨＤＬコードの一部を決定することを可能にする。コンパイラが新しい意味論を実装する場合、デバッガがＨＤＬコードとオブジェクトコードとの相関関係を継続できるように、オブジェクトコードのマーカー挿入様式を変更しなければならない場合がある。デバッガはまた、マーカーを正しく解釈するように、修正されることが必要な場合もある。
【０１１８】
結論
発明を実施するための形態において説明されたデータ構造およびコードは、典型的には、コンピュータシステムによって使用するためのコードおよび／またはデータを記憶することができる任意の装置または媒体であってもよい、コンピュータ可読記憶媒体上に記憶される。これには、揮発性メモリ、非揮発性メモリ、ディスクドライブ、磁気テープ、ＣＤ（コンパクトディスク）、ＤＶＤ（デジタル多用途ディスクまたはデジタルビデオディスク）等の磁気および光学式記憶装置、または現在周知または今後開発されるコンピュータ可読媒体を記憶することが可能な他の媒体、が挙げられるが、これらに限定されない。
【０１１９】
さらに、本発明の実施形態の前述の説明は、図説および説明の目的のためだけに提示された。これらは、本発明を網羅すること、または本発明を開示される形式に限定することを意図しない。したがって、当業者には、多数の修正及び変形が容易に明らかであろう。加えて、上記の開示は本発明を限定することを意図しない。本発明の範囲は、添付の請求項によって定義される。
【図１】
0005403835.tif 000002
【図２】
0005403835.tif 000003
【図３】
0005403835.tif 000004
【図４】
0005403835.tif 000005
【図５】
0005403835.tif 000006
【図６】
0005403835.tif 000007
【図７】
0005403835.tif 000008