忍者ブログ

EDA Blog

Verilog、SystemVerilog、SystemCなど、ハードウェア記述言語についてのブログです。

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

[Verilog] ModelSimでDPIを使う

ほとんどModelSimのユーザーマニュアルに書かれている例そのままですが、ModelSimでSystemVerilogのDPIを使用する例です。

Cのソースコード(hello_c.c)を用意します。
この例では、Hello from c_task()と表示した後、Verilog内で定義されているタスクverilog_taskを呼び出します。
最後に、渡された変数iの値を2倍にします。

ヘッダーファイルのうち、svdpi.hはModelSimに付属しています。
dpiheader.hvlogコマンドで作成します。

#include "svdpi.h"
#include "dpiheader.h"

int c_task(int i, int *o) {
printf("Hello from c_task()\n");
verilog_task(i, o);
*o = 2 * i;
return (0);
}


Verilogのソースコード(hello_top.v)です。
export "DPI-C"宣言で、タスクverilog_taskがC言語から呼び出せるようにエクスポートしています。
import "DPI-C"宣言で、先ほどhello_c.cで宣言した関数c_taskを呼び出せるようにしています。

module hello_top;
int ret;
export "DPI-C" task verilog_task;
task verilog_task(input int i, output int o);
#10;
$display("Hello from verilog_task()");
endtask // verilog_task
import "DPI-C" context task c_task(input int i, output int o);
initial begin
c_task(1, ret);
$display("ret=%d", ret);
end
endmodule // hello_top


コンパイルとリンクの手順は下記のとおりです。
$(MODELSIM)は、ModelSimをインストールしたディレクトリです。
  1. vlog -sv -dpiheader dpiheader.h hello.v

  2. vsim -dpiexportobj exportobj hello_top

  3. gcc -c -I $(MODELSIM)/include hello_c.c

  4. gcc -shared -Bsymbolic -o hello_c.dll hello_c.o exportobj.obj -L $(MODELSIM)win32aloem -lmtipli

  5. vsim -c -sv_lib hello_c -do "run -all; quit" hello_top



実行すると下記のように表示されます。。

# Hello from c_task()
# Hello from verilog_task()
# ret= 2

拍手[1回]

PR

[verilog-mode] verilog-library-extensions

verilog-modeのAUTOINST使用時にC-c C-aを実行したときに、下記のエラーが表示された場合の対処。
AUTOINSTでインスタンスしようとするモジュールを含むファイルが見つからない場合に発生します。
top.v:6: Can't locate sample module definition
Check the verilog-library-directories variable.
I looked in (if not listed, doesn't exist):
c:/cygwin/home/user/verilog.top.v


ファイルの拡張子が.vではないために見つからない場合は、ファイルの最後に、verilog-library-extensionsを追加します。
たとえば、Quartus IIのEDA Netlist Writerは、拡張子.voというファイルを作成します。
そのモジュールをAUTOINST対象にするには下記の行を追加します。

// Local Variables:
// verilog-library-extentions:(".v" ".vo")
// End:

拍手[0回]

[Verilog] ModelSimでのデフォルト基数を変更する

ModelSimをインストールしたディレクトリにあるmodelsim.ini内のDefaultRadix設定を変えることで、波形表示時のデフォルト基数を変更できます。
たとえば、デフォルトを16進数にしたい場合は、下記のように設定します。
DefaultRadix = hex
多ビットの信号については波形表示時に毎回16進数に変えていたのですが、これでその手間が省けるようになりました。

拍手[0回]

[verilog-mode] verilog-auto-newline

verilog-modeでは、;を入力すると自動的に改行される設定になっている場合があります。
自動改行をオフするには、.emacsに下記の設定を追加してverilog-auto-newlineをnilに設定します。
(setq verilog-auto-newline nil)

拍手[4回]

[verilog-mode] verilog-auto-star-save

[verilog-mode] verilog-auto-starの続きです。

verilog-auto-star-saveをtに設定すると、C-c C-aで展開した.*が保存時にも保持されます。
デフォルトではverilog-auto-star-saveはnilになっています。

verilog-auto-star-saveをtに設定するには、

(setq verilog-auto-start-save t)

とします。

展開された.*を元に戻したい場合は、C-c C-kを押すと保存された後でも.*に戻すことができます。

拍手[0回]

[verilog-mode] verilog-auto-star

SystemVerilogの.*を使うと、ポート名とネット名が同じであればインスタンス時にわざわざ記述する必要はありません。
記述は簡潔になりますが、他人の書いたコードをデバッグするときにはモジュール間の接続がすぐに分からずに苦労する場合があるかもしれません。

verilog-modeverilog-auto-starという機能を使うと、.*を展開してくれます。
ただし、この機能はデフォルトでは無効なので、.emacsに下記の設定を追加しておく必要があります。

(setq verilog-auto-star-expand t)


たとえば、下記のようなポートCLK、DIN、DOUTを持つモジュールがあるとします。

module sample (input CLK, input DIN, output DOUT);
logic ff0, ff1;
always_ff @(posedge CLK) begin
ff0 <= DIN;
ff1 <= ff0;
end

assign DOUT = ff1;
endmodule


そして、モジュールsampleを.*を使ってインスタンスしているモジュールがあるとします。

module sample_vt;
logic CLK, DIN;
wire DOUT;

sample DUT ( .*);
endmodule


C-c C-aを押すと、下記のように.*を展開してくれます。

module sample_vt;
logic CLK, DIN;
wire DOUT;

sample DUT ( .*,
// Outputs
.DOUT (DOUT), // Implicit .*
// Inputs
.CLK (CLK), // Implicit .*
.DIN (DIN)); // Implicit .*
endmodule


.*を展開した状態で保存しても、自動的に.*に戻してから保存してくれます。

拍手[0回]

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

フリーエリア

最新CM

[04/11 なつたん]

最新TB

プロフィール

HN:
aston_martin
性別:
非公開

ブログ内検索

カウンター

アクセス解析