OSSになったVerilogシミュレーター「CVC」

##はじめに
数か月前に、Tachyon Design Automation社のVerilogシミュレーター「CVC」がOSSになっていることに気づきました。
<blockquote class="twitter-tweet" lang="ja"><p>Tachyon Design Automation社のVerilogシミュレータがOSSになっとった…。</p>&mdash; tethys (@tethys_seesaa) <a href="https://twitter.com/tethys_seesaa/status/511849240071397376">2014, 9月 16</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

当初はTachyon社のWebサイトが未整理だったので手をつけていませんでしたが、だいぶ整ってきてみたようなのでダウンロード、インストールして試してみることにしました。そのメモ書きです。

##CVCの特徴

主に[こちら](http://www.tachyon-da.com/what-is-cvc/)に書かれています。Verilogシミュレーターとしては商用シミュレーターと遜色はありません。波形ビューワーは[GTKWave](http://gtkwave.sourceforge.net/)に対応し、波形ファイルとしてFSTフォーマットで出力できます。対応OSはLinuxで、32/64bit両対応です。

目につく特徴として、X伝播評価アルゴリズム・2値化シミュレーションがあります。
VHDLは非対応です。
SystemVerilogの対応は限定的で、DPIサポートのみです。とはいえDPIのサポートで、C言語で比較的柔軟な検証環境を構築できます。またSystemVerilog固有の変数では、`bit`/`logic`/`int`/`byte`/`shortint`/`longint`をサポートし、DPI用に`chandle`をサポートしています。

##ライセンス

CVCはOSSですが、ライセンスは`Artistic license`をモディファイした**OSS CVC dual license**を独自に作成しています。dualとは、ユーザーから見ておおざっぱに言うと、サポートの有無になります。学習向けは問題ないと思いますが、開発・商用で使用する場合はライセンス条項をよくお読みください。


##ダウンロード、コンパイル、インストール、動作テスト
ここではCentOS6.6で試してみました。ドキュメントには64bit推奨と書かれていたので、64bit版を前提に書きます。

ダウンロードにはユーザー登録(メールアドレス)が必要です。

非サポート用はCVCのバイナリを作る作業から開始します。

まずダウンロードしたファイルを解凍します。

```sh
$ tar xvfi open_src_cvc_700c_tar.bz2
```

最初は、プラットフォームがCVCに対応しているか確認し、以下のようにメッセージが出ればOKです。

```sh
$ open-src-cvc.700c/bin/checkcvc
System configuration is fine for CVC compilation.
```

次に、コンパイルを行います。`src`ディレクトリに移動し、Makeを実行します。
自分の環境ではカレントディレクトリにPATHを通していないため、Makefile内で、生成したファイルをそのままカレントディレクトリで実行しているところ(hexasm)を **./hexasm**のように書き直しました。

```sh
$ cd open-src-cvc.700c/src/
$ make -f makefile.cvc64
```
エラー無くコンパイルが終了すると、**cvc64**というバイナリができます。これがシミュレーターの本体となります。

次に、生成したバイナリが正常に動作するか確認を行います。以下のようにcvc64を`/tmp`にコピーし、スクリプトを実行します。
最後のようなメッセージが出れば正常に動作していることになります。

```sh
$ cp cvc64 /tmp
$ cd ../tests_and_examples/install.test/
$ $ ./inst_test.sh cvc64
>>>> Install test completed (this should be only message printed).
```

あとはcvc64をPATHの通っているディレクトリにコピーすれば、インストールは完了です。

##使い方
`tests_and_examples`ディレクトリにCVCの特徴を生かしたサンプルとOpencoresを使用したサンプルがあります。適宜実行すると動きがわかると思います。
ここでは簡単にHello, world!的なVerilogモジュールで試してみます。

```sv:tb.v
module tb();

  initial begin
    $display("Hello, world!");
    $finish(1);
  end

endmodule
```
まず、対象ファイルをコンパイルします。

```sh
$ cvc64 tb.v
OSS_CVC_7.00b-x86_64-rhel6x of 07/07/14 (Linux-elf).
Copyright (c) 1991-2014 Tachyon Design Automation Corp.
  All Rights reserved.  Licensed software subject to prohibitions and
  restrictions.  See OSS CVC artistic license included with release.
Today is Wed Jan 21 21:29:13 2015.
Elaborating source file "tb.v"
Highest level modules:
tb
  Compiling module 1 of 1.
  CVC compilation 0.1 seconds elapsed.

  EXECUTABLE SAVED TO 'cvcsim'.

End of OSS_CVC_7.00b-x86_64-rhel6x at Wed Jan 21 21:29:13 2015 (elapsed 0.1 seconds).
```

エラー無く終了すると、**cvcsim**というファイルが出来上がります。これを実行することでシミュレーションを行います。

```sh
$ ./cvcsim 
OSS_CVC_7.00b-x86_64-rhel6x of 07/07/14 (Linux-elf).
Copyright (c) 1991-2014 Tachyon Design Automation Corp.
  All Rights reserved.  Licensed software subject to prohibitions and
  restrictions.  See OSS CVC artistic license included with release.
Today is Wed Jan 21 21:30:04 2015.
Highest level modules:
tb

Hello, world!
Halted at location **tb.v(5) time 0 from call to $finish.
```

実行可能なCのバイナリに変換してシミュレーションを行う形式は、Synopsys社の[VCS](http://www.synopsys.com/Tools/Verification/FunctionalVerification/Pages/VCS.aspx)やOSSの[Verilator](http://www.veripool.org/wiki/verilator)を連想させますね。


##おわりに
元プロプライエタリなシミュレーターであるため、コンパクトながら多彩な機能を持ち、チューニングのために様々なオプションが入っています。またDPIが使えるのもうれしいところです。
本格的に使うのもよし、簡単なSyntaxチェックに使うのもよし、手元にダウンロードして手元に置いても損のないツールと思います。[Icarus Verilog](http://iverilog.icarus.com)や[Verilator](http://www.veripool.org/wiki/verilator)らとパフォーマンス比較すると面白いかもしれません。