... | @@ -219,5 +219,36 @@ C言語の`#include`のようなことができます。 |
... | @@ -219,5 +219,36 @@ C言語の`#include`のようなことができます。 |
|
複数の`.v`ファイルに分割して設計するときには、C言語のヘッダファイルのように、マクロ定義だけ集めたファイルを作り、インクルードするとよいでしょう。
|
|
複数の`.v`ファイルに分割して設計するときには、C言語のヘッダファイルのように、マクロ定義だけ集めたファイルを作り、インクルードするとよいでしょう。
|
|
|
|
|
|
|
|
|
|
|
|
## 構文エラーの原因
|
|
|
|
|
|
|
|
Verilogの処理系のエラーメッセージはお世辞にもわかりやすいとは言えません.
|
|
|
|
例えば,以下のような32ビットの加算を行うモジュールを考えてみます.
|
|
|
|
|
|
|
|
```verilog
|
|
|
|
module adder(
|
|
|
|
input wire [31:0] a,
|
|
|
|
input wire [31:0] b,
|
|
|
|
output wire [31:0] c
|
|
|
|
);
|
|
|
|
assign c = a + b
|
|
|
|
endmodule
|
|
|
|
```
|
|
|
|
|
|
|
|
これをフリーの処理系であるIcarus Verilogでコンパイルしようとすると,
|
|
|
|
|
|
|
|
```
|
|
|
|
$ iverilog a.v
|
|
|
|
a.v:7: syntax error
|
|
|
|
I give up.
|
|
|
|
```
|
|
|
|
|
|
|
|
と表示されます(Vivadoでも恐らく似たようなメッセージが表示されるでしょう).
|
|
|
|
エラーメッセージでは`a.v`の7行目がおかしいとされていますが,この7行目は`endmodule`としか書いておらず間違っているようには見えません.
|
|
|
|
エラーの原因は今回の例では6行目の`assign c = a + b`の最後に`;`がないことです.
|
|
|
|
このように文法的なエラーの場合はエラーメッセージで示された行より前に原因があることも多いです.
|
|
|
|
その行だけを眺めてもエラーの原因がわからない場合はそれより前を眺めてみましょう.
|
|
|
|
|
|
|
|
ちなみに,なぜこういうことが起こるかを簡単に説明すると,一般に言語処理系には構文解析という文字列を構文木と呼ばれる木構造に変換するフェーズがあり,ここまで読んだ結果がこれだから次はあれかこれかが来るだろうという風に予測しながら木を構成していくからです.
|
|
|
|
つまり,上の例では`a+b`まで読んだ後は`;`が来るかあるいは`- c`のようにまだ式が続くかという予想を立て,予想外の`endmodule`が来た時点でエラーとなるわけです.
|
|
|
|
|
|
|
|
|