... | @@ -193,6 +193,8 @@ endfunction |
... | @@ -193,6 +193,8 @@ endfunction |
|
|
|
|
|
組み合わせ回路を作るために`if`文や`case`文を使う場合、**必ず全パターンを記述してください**。つまり、`else`や`default`を必ず書いて、値を代入してくださいということです。
|
|
組み合わせ回路を作るために`if`文や`case`文を使う場合、**必ず全パターンを記述してください**。つまり、`else`や`default`を必ず書いて、値を代入してくださいということです。
|
|
|
|
|
|
|
|
重要なのは、**全ての実行経路で値を代入する必要がある**ということです(が、そのうえでVivadoが「確かにすべての実行経路で値が代入される」と分かる書き方でないといけません)。
|
|
|
|
|
|
これは、特定の条件の時に代入されない → その場合信号が変化しない → 信号を記憶しなければ と解釈されるためで、ラッチが生成されてしまいます。
|
|
これは、特定の条件の時に代入されない → その場合信号が変化しない → 信号を記憶しなければ と解釈されるためで、ラッチが生成されてしまいます。
|
|
|
|
|
|
例えば、以下のように書くとラッチが生成されます。
|
|
例えば、以下のように書くとラッチが生成されます。
|
... | @@ -226,6 +228,7 @@ always @(*) begin |
... | @@ -226,6 +228,7 @@ always @(*) begin |
|
end
|
|
end
|
|
```
|
|
```
|
|
|
|
|
|
|
|
|
|
命令セットにないから来ないはず、という発想で書かないのは**間違いです**。C言語等では、本当に来ないなら記述しなくても問題なく動作しますが、HDL の場合はそうではありません。論理合成ツールからは、回路の入力として何が来るか把握できないため、何が来ても大丈夫なように回路を構成しようとします。そのため、不要なラッチができてしまいます。
|
|
命令セットにないから来ないはず、という発想で書かないのは**間違いです**。C言語等では、本当に来ないなら記述しなくても問題なく動作しますが、HDL の場合はそうではありません。論理合成ツールからは、回路の入力として何が来るか把握できないため、何が来ても大丈夫なように回路を構成しようとします。そのため、不要なラッチができてしまいます。
|
|
|
|
|
|
## コンパイラ指示子
|
|
## コンパイラ指示子
|
... | | ... | |