SystemVerilog:DPI-Cで使える型を試す(シリーズ2)です。
今回は、bit, logicです。
試したソースコードがこちら↓
○Cコード
○SystemVerilogコード
出力結果がこちらになります。
ちょっと svLogicVecVal のC言語の型に戸惑った。
bval側の値は 0 が正しそうですね。
試したコードは「こちら(github)」に置いてます。
追記
svLogicVecValのaval, bvalについて
「IEEE1800-2009 H.10.1.1 Scalars of type bit and logic」に記載があります。
早速、テストコードを変更してテストしてみました。
ちゃんとinput側で「Z, X」になってますね。
また、bit位置も確認OK。ソースコードは同じリポジトリにて更新してます。
今回は、bit, logicです。
試したソースコードがこちら↓
○Cコード
1|#include <stdio.h>
2|#include "dpiheader.h"
3|
4|// extern int c_svbit( const svBitVecVal*, svBitVecVal*);
5|// extern int c_svlogic( const svLogicVecVal*, svLogicVecVal*);
6|
7|int c_main(void) {
8| printf("Hello from c_main()\n");
9|
10| svBitVecVal bitvec_in, bitvec_out;
11| svLogicVecVal logicvec_in, logicvec_out;
12|
13| bitvec_in = 8;
14| logicvec_in.aval = 8;
15| logicvec_in.bval = 0;
16|
17| c_svbit ( &bitvec_in, &bitvec_out);
18| printf("------ c in=%d, out=%d\n",bitvec_in, bitvec_out);
19| c_svlogic ( &logicvec_in, &logicvec_out);
20| printf("------ c in(a)=%d, out(a)=%d, in(b)=%d, out(b)=%d\n",
21| logicvec_in.aval, logicvec_out.aval, logicvec_in.bval, logicvec_out.bval);
22|
23| // input svLogicVecVal.bval data
24| printf("\n");
25| printf("--- test svLogicVecVal.bval data\n");
26| logicvec_in.aval = 3;
27| logicvec_in.bval = 2;
28| c_svlogic ( &logicvec_in, &logicvec_out);
29| printf("------ c in(a)=%d, out(a)=%d, in(b)=%d, out(b)=%d\n",
30| logicvec_in.aval, logicvec_out.aval, logicvec_in.bval, logicvec_out.bval);
31|
32| return (0);
33|}
34|
○SystemVerilogコード
1|module tb;
2| // import c_main
3| import "DPI-C" context task c_main();
4|
5| initial begin
6| c_main();
7| $finish(2);
8| end
9|
10| // export tasks
11| export "DPI-C" c_svbit = task sv_bit_task;
12| export "DPI-C" c_svlogic = task sv_logic_task;
13|
14| task sv_bit_task (input bit [7:0] a, output bit [7:0] b);
15| b = a * 10;
16| $display("--- sv_bit : input=%d, output=%d", a, b);
17| endtask
18|
19| task sv_logic_task (input logic[3:0] a, output logic[3:0] b);
20| b = a + 4;
21| $display("--- sv_logic : input=%d, output=%d", a, b);
22| endtask
23|
24|endmodule : tb
25|
出力結果がこちらになります。
ちょっと svLogicVecVal のC言語の型に戸惑った。
bval側の値は 0 が正しそうですね。
試したコードは「こちら(github)」に置いてます。
追記
svLogicVecValのaval, bvalについて
「IEEE1800-2009 H.10.1.1 Scalars of type bit and logic」に記載があります。
/* canonical representation */この値は(bval,aval)になっているようです。
#define sv_0 0
#define sv_1 1
#define sv_z 2 /* representation of 4-st scalar z */
#define sv_x 3 /* representation of 4-st scalar x */
早速、テストコードを変更してテストしてみました。
ちゃんとinput側で「Z, X」になってますね。
また、bit位置も確認OK。ソースコードは同じリポジトリにて更新してます。