... | @@ -191,10 +191,41 @@ endfunction |
... | @@ -191,10 +191,41 @@ endfunction |
|
|
|
|
|
## 組み合わせ回路を作るときの注意
|
|
## 組み合わせ回路を作るときの注意
|
|
|
|
|
|
組み合わせ回路を作るために`if`文や`case`文を使う場合、**必ず全パターンを記述してください**。つまり、`else`や`default`を必ず書いてくださいということです。
|
|
組み合わせ回路を作るために`if`文や`case`文を使う場合、**必ず全パターンを記述してください**。つまり、`else`や`default`を必ず書いて、値を代入してくださいということです。
|
|
|
|
|
|
これは、特定の条件の時に代入されない → その場合信号が変化しない → 信号を記憶しなければ と解釈されるためで、ラッチが生成されてしまいます。
|
|
これは、特定の条件の時に代入されない → その場合信号が変化しない → 信号を記憶しなければ と解釈されるためで、ラッチが生成されてしまいます。
|
|
|
|
|
|
|
|
例えば、以下のように書くとラッチが生成されます。
|
|
|
|
|
|
|
|
```verilog
|
|
|
|
always @(*) begin
|
|
|
|
case (ins[31:24])
|
|
|
|
8'b1000_0000: d <= 3'b001;
|
|
|
|
8'b1000_0001: d <= 3'b010;
|
|
|
|
// ins[31:24]の値が8'b1000_0000でも8'b1000_0001でもない場合、
|
|
|
|
// dに値が代入されない
|
|
|
|
// →dの値は変化しない
|
|
|
|
// →dの値を記憶しておく必要がある
|
|
|
|
// →ラッチが生成される
|
|
|
|
endcase
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
組み合わせ回路を作る(ラッチが生成されないようにする)ためには、以下のように記述してください。
|
|
|
|
|
|
|
|
```verilog
|
|
|
|
always @(*) begin
|
|
|
|
case (ins[31:24])
|
|
|
|
8'b1000_0000: d <= 3'b001;
|
|
|
|
8'b1000_0001: d <= 3'b010;
|
|
|
|
default: d <= 3'b000;
|
|
|
|
// ins[31:24]の値が8'b1000_0000または8'b1000_0001のどちらかにしかならないのだとしても、
|
|
|
|
// あるいはins[31:24]の値が8'b1000_0000でも8'b1000_0001でもない場合にはdの値を使わないのだとしても、
|
|
|
|
// default:を記述してdに何らかの値を代入しておく
|
|
|
|
endcase
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
命令セットにないから来ないはず、という発想で書かないのは**間違いです**。C言語等では、本当に来ないなら記述しなくても問題なく動作しますが、HDL の場合はそうではありません。論理合成ツールからは、回路の入力として何が来るか把握できないため、何が来ても大丈夫なように回路を構成しようとします。そのため、不要なラッチができてしまいます。
|
|
命令セットにないから来ないはず、という発想で書かないのは**間違いです**。C言語等では、本当に来ないなら記述しなくても問題なく動作しますが、HDL の場合はそうではありません。論理合成ツールからは、回路の入力として何が来るか把握できないため、何が来ても大丈夫なように回路を構成しようとします。そのため、不要なラッチができてしまいます。
|
|
|
|
|
|
## コンパイラ指示子
|
|
## コンパイラ指示子
|
... | | ... | |