Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
B
b3exp
Manage
Activity
Members
Plan
Wiki
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
2021
b3exp
Wiki
VerilogHDLManual
Changes
Page history
New page
Templates
Clone repository
Update VerilogHDLManual
authored
3 years ago
by
Toru Koizumi
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
VerilogHDLManual.md
+7
-2
7 additions, 2 deletions
VerilogHDLManual.md
with
7 additions
and
2 deletions
VerilogHDLManual.md
View page @
bcc2f345
...
...
@@ -191,12 +191,16 @@ endfunction
## 組み合わせ回路を作るときの注意
組み合わせ回路を作るために
`if`
文や
`case`
文を使う場合、
**必ず全パターンを記述してください**
。つまり、
`else`
や
`default`
を必ず書いて、値を代入してくださいということです。
組み合わせ回路を作るため[^1]に
`if`
文や
`case`
文を使う場合、
**必ず全パターンを記述してください**
。つまり、
`else`
や
`default`
を必ず書いて、値を代入してくださいということです。
重要なのは、
**全ての実行経路で値を代入する必要がある**
ということです(が、そのうえでVivadoが「確かにすべての実行経路で値が代入される」と分かる書き方でないといけません)。
これは、特定の条件の時に代入されない → その場合信号が変化しない → 信号を記憶しなければ と解釈されるためで、ラッチが生成されてしまいます。
ラッチが意図せずできた場合、ほぼ確実に、ハードウェアでは動かない回路が完成します。
ラッチができないよう、心掛けてください。
例えば、以下のように書くとラッチが生成されます。
```
verilog
...
...
@@ -304,4 +308,5 @@ I give up.
ちなみに,なぜこういうことが起こるかを簡単に説明すると,一般に言語処理系には構文解析という文字列を構文木と呼ばれる木構造に変換するフェーズがあり,ここまで読んだ結果がこれだから次はあれかこれかが来るだろうという風に予測しながら木を構成していくからです.
つまり,上の例では
`a+b`
まで読んだ後は
`;`
が来るかあるいは
`- c`
のようにまだ式が続くかという予想を立て,予想外の
`endmodule`
が来た時点でエラーとなるわけです.
----
[
^1
]:
組み合わせ回路でない、フリップフロップやRAMを作る際の`if`文(ライトイネーブル信号やリセットなど)の場合、全パターンを記述しなくてもかまいません。このような素子は、代入されない時は元の値を保持する機能があるためです。組み合わせ回路にはそのような機能がないため、「元の値を保持したいがしたい」風な記述をしてはいけません(そのような記述をすると組み合わせ回路ではなくなり、特にラッチが生成されてしまいます)。
This diff is collapsed.
Click to expand it.