... | @@ -191,12 +191,16 @@ endfunction |
... | @@ -191,12 +191,16 @@ endfunction |
|
|
|
|
|
## 組み合わせ回路を作るときの注意
|
|
## 組み合わせ回路を作るときの注意
|
|
|
|
|
|
組み合わせ回路を作るために`if`文や`case`文を使う場合、**必ず全パターンを記述してください**。つまり、`else`や`default`を必ず書いて、値を代入してくださいということです。
|
|
組み合わせ回路を作るため[^1]に`if`文や`case`文を使う場合、**必ず全パターンを記述してください**。つまり、`else`や`default`を必ず書いて、値を代入してくださいということです。
|
|
|
|
|
|
|
|
|
|
重要なのは、**全ての実行経路で値を代入する必要がある**ということです(が、そのうえでVivadoが「確かにすべての実行経路で値が代入される」と分かる書き方でないといけません)。
|
|
重要なのは、**全ての実行経路で値を代入する必要がある**ということです(が、そのうえでVivadoが「確かにすべての実行経路で値が代入される」と分かる書き方でないといけません)。
|
|
|
|
|
|
これは、特定の条件の時に代入されない → その場合信号が変化しない → 信号を記憶しなければ と解釈されるためで、ラッチが生成されてしまいます。
|
|
これは、特定の条件の時に代入されない → その場合信号が変化しない → 信号を記憶しなければ と解釈されるためで、ラッチが生成されてしまいます。
|
|
|
|
|
|
|
|
ラッチが意図せずできた場合、ほぼ確実に、ハードウェアでは動かない回路が完成します。
|
|
|
|
ラッチができないよう、心掛けてください。
|
|
|
|
|
|
例えば、以下のように書くとラッチが生成されます。
|
|
例えば、以下のように書くとラッチが生成されます。
|
|
|
|
|
|
```verilog
|
|
```verilog
|
... | @@ -304,4 +308,5 @@ I give up. |
... | @@ -304,4 +308,5 @@ I give up. |
|
ちなみに,なぜこういうことが起こるかを簡単に説明すると,一般に言語処理系には構文解析という文字列を構文木と呼ばれる木構造に変換するフェーズがあり,ここまで読んだ結果がこれだから次はあれかこれかが来るだろうという風に予測しながら木を構成していくからです.
|
|
ちなみに,なぜこういうことが起こるかを簡単に説明すると,一般に言語処理系には構文解析という文字列を構文木と呼ばれる木構造に変換するフェーズがあり,ここまで読んだ結果がこれだから次はあれかこれかが来るだろうという風に予測しながら木を構成していくからです.
|
|
つまり,上の例では`a+b`まで読んだ後は`;`が来るかあるいは`- c`のようにまだ式が続くかという予想を立て,予想外の`endmodule`が来た時点でエラーとなるわけです.
|
|
つまり,上の例では`a+b`まで読んだ後は`;`が来るかあるいは`- c`のようにまだ式が続くかという予想を立て,予想外の`endmodule`が来た時点でエラーとなるわけです.
|
|
|
|
|
|
|
|
----
|
|
|
|
[^1]: 組み合わせ回路でない、フリップフロップやRAMを作る際の`if`文(ライトイネーブル信号やリセットなど)の場合、全パターンを記述しなくてもかまいません。このような素子は、代入されない時は元の値を保持する機能があるためです。組み合わせ回路にはそのような機能がないため、「元の値を保持したいがしたい」風な記述をしてはいけません(そのような記述をすると組み合わせ回路ではなくなり、特にラッチが生成されてしまいます)。 |