... | @@ -6,12 +6,9 @@ Verilatorという高速なシミュレータを用いてデバッグしまし |
... | @@ -6,12 +6,9 @@ Verilatorという高速なシミュレータを用いてデバッグしまし |
|
|
|
|
|
## Verilatorとは
|
|
## Verilatorとは
|
|
|
|
|
|
VerilatorはオープンソースのVerilog HDLシミュレータです。
|
|
VerilatorはオープンソースのVerilog HDL/SystemVerilogシミュレータです。Verilog HDL/SystemVerilogの記述をC++に変換し、コンパイル後にシミュレーションするため非常に高速という特徴があります。一方、高速化のためにVerilog HDL/SystemVerilogの一部の機能が使えないという制約があります。
|
|
|
|
|
|
Verilog HDLの記述をC++に変換し、コンパイル後にシミュレーションするため非常に高速という特徴があります。
|
|
現在はテストベンチをC++で書く必要があります。
|
|
一方、高速化のためにVerilog HDLの一部の機能が使えないという制約があります。
|
|
|
|
|
|
|
|
また、テストベンチをC++で書く必要があります。
|
|
|
|
|
|
|
|
## Verilatorのインストール
|
|
## Verilatorのインストール
|
|
|
|
|
... | @@ -19,24 +16,37 @@ Verilog HDLの記述をC++に変換し、コンパイル後にシミュレーシ |
... | @@ -19,24 +16,37 @@ Verilog HDLの記述をC++に変換し、コンパイル後にシミュレーシ |
|
$ sudo apt-get install verilator
|
|
$ sudo apt-get install verilator
|
|
```
|
|
```
|
|
|
|
|
|
高速化のため、以下の設定をおすすめします(編集にはroot権限が必要です)。
|
|
高速化のため、以下の設定をおすすめします(編集にはroot権限が必要です)。(2024追記:行数は変わっている様です。`OPT_FAST`をエディタ内部で検索するとよいでしょう)
|
|
|
|
|
|
* `/usr/share/verilator/include/verilated.mk`の89行目`#OPT_FAST = -O2 -fstrict-aliasing`の`#`を消すことで最適化を有効にする
|
|
* `/usr/share/verilator/include/verilated.mk`の89行目`#OPT_FAST = -O2 -fstrict-aliasing`の`#`を消すことで最適化を有効にする
|
|
|
|
|
|
## Verilatorを用いてCoreMark_for_Synthesisのシミュレーションを行う
|
|
## Verilatorを用いてCoreMark_for_Synthesisのシミュレーションを行う
|
|
|
|
|
|
適当な作業ディレクトリを用意し、そこにVerilog HDLのソースファイルを置いたとします。
|
|
適当な作業ディレクトリを用意し、そこにVerilog HDLのソースファイルを置いているとします。
|
|
|
|
|
|
そのディレクトリに、C++で書かれたテストベンチファイルを作成します。例を一番下に書きました。
|
|
そのディレクトリに、C++で書かれたテストベンチファイルを作成します。例を一番下に書きました。
|
|
|
|
|
|
|
|
Verilatorは先で述べたとおり、CPPを利用したシミュレータです。このためシミュレーションでは
|
|
|
|
1. verilog -> c++へのトランスパイル(verilatorコマンド)
|
|
|
|
2. c++のビルド(obj_dir内部でのmake)
|
|
|
|
3. 実行
|
|
|
|
|
|
|
|
の三段階のステップが必要になります。以下が詳細です。
|
|
|
|
|
|
|
|
### 1. c++へのトランスパイル
|
|
トップモジュールが`top.v`の場合、`$ verilator --cc top.v -exe test_bench.cpp`とコマンドを実行することで、`obj_dir`というディレクトリが作成されます(Vivadoでは出ないLintエラーの警告が出るかもしれません)。このディレクトリの中には、C++に変換された`top.v`である`Vtop.h`などが含まれています(`cpu.v`であれば`Vcpu.h`ができるなど、ファイル名に応じて生成されるファイル名が変化します。適宜読み替えてください)。
|
|
トップモジュールが`top.v`の場合、`$ verilator --cc top.v -exe test_bench.cpp`とコマンドを実行することで、`obj_dir`というディレクトリが作成されます(Vivadoでは出ないLintエラーの警告が出るかもしれません)。このディレクトリの中には、C++に変換された`top.v`である`Vtop.h`などが含まれています(`cpu.v`であれば`Vcpu.h`ができるなど、ファイル名に応じて生成されるファイル名が変化します。適宜読み替えてください)。
|
|
|
|
|
|
なお、トップモジュールから参照されているモジュールはファイル名ベースで検索されます。Verilog HDLの一般的な慣習に従い、モジュールの記述は同名のファイル(`alu`モジュールなら`alu.v`)に書きましょう。
|
|
なお、トップモジュールから参照されているモジュールはファイル名ベースで検索されます。Verilog HDLの一般的な慣習に従い、モジュールの記述は同名のファイル(`alu`モジュールなら`alu.v`)に書きましょう。
|
|
|
|
|
|
|
|
### 2. c++のビルド
|
|
`$ make -C obj_dir -f Vtop.mk`とコマンドを実行することで、`obj_dir`の中に`Vtop`という実行ファイルが作成されます。
|
|
`$ make -C obj_dir -f Vtop.mk`とコマンドを実行することで、`obj_dir`の中に`Vtop`という実行ファイルが作成されます。
|
|
これを実行する(`$ obj_dir/Vtop`)ことで、シミュレーションが行われます。
|
|
|
|
|
|
|
|
|
|
### 3. 実行
|
|
|
|
実行する(`$ obj_dir/Vtop`)ことで、シミュレーションが行われます。
|
|
|
|
|
|
|
|
## テストベンチの例
|
|
以下は、C++で書かれたテストベンチ(`test_bench.cpp`)の例です。
|
|
以下は、C++で書かれたテストベンチ(`test_bench.cpp`)の例です。
|
|
|
|
トップモジュールの入出力がVtopのメンバ変数になります。inputに対応するメンバ変数を変更し、eval関数を実行することでoutputが正しい値になります。
|
|
|
|
なお、正しく配線がつながっていない場合はoutputがおかしな値になります。
|
|
|
|
|
|
```cpp
|
|
```cpp
|
|
#include <cstdio>
|
|
#include <cstdio>
|
... | @@ -99,3 +109,6 @@ int main() { |
... | @@ -99,3 +109,6 @@ int main() { |
|
```
|
|
```
|
|
|
|
|
|
`readmemh`で読み込まれるhexファイルのサイズがVerilog HDLで記述されたメモリの容量より多い場合、Vivadoでは入りきらない部分が無視されるだけですが、Verilatorでは実行時エラーとなります。hexファイルのサイズをVerilog HDLで記述されたメモリの容量と一致させるようにしてください。
|
|
`readmemh`で読み込まれるhexファイルのサイズがVerilog HDLで記述されたメモリの容量より多い場合、Vivadoでは入りきらない部分が無視されるだけですが、Verilatorでは実行時エラーとなります。hexファイルのサイズをVerilog HDLで記述されたメモリの容量と一致させるようにしてください。
|
|
|
|
|
|
|
|
## 注意
|
|
|
|
uartを正しくシミュレーションするためにはuart.vの周波数と、c++の周波数定義が一致している必要があります。 |