HWC/Verilog/テストベンチ
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
* テストベンチ関連 [#v0098fc3]
#contents
*テストベンチTips [#t260bfbb]
** ファイル I/O [#oa264ba9]
*** $fopenについて [#e3cd3338]
Verilog 2001で$fopenを使うときには、
fp = $fopen("hoge.dat");
ではなく、
fp = $fopen("hoge.dat", "w");
と明示的にアクセスモードを明示すると、OSの資源にやさしい...
明示しないと双方向"a"で開くっぽい(確認してないけど、そう...
*** ファイル出力 [#db951c35]
> C と同じようにファイル記述子を使う.
module test;
parameter DUMP_FILE = "testdata/dump.dat" //ファイル...
integer fp; // ファイル...
.
.
.
// 初期化処理 (合成不可)
initialize begin
...
fp = $fopen("xxx/xxx.dat"); // 初期化時に $fopen で...
...
end
.
.
.
// データの出力タイミングを捕捉してファイルへ書き込む
always @ (posedge CLK) begin
if (DOUTVLD) begin
// 下の2つは同じ結果になります
$fdisplay(fp, "data = %d", data); // $fdisplay で...
$fwrite(fp, "data = %d\n", data); // $fwrite では...
end
end
endmodule
*** ファイル入力 [#x749dc91]
> ファイルの内容をメモリ変数に読み込む.
module test;
parameter DATA_FILE = "testdata/din.dat"; //ファイル...
reg [11:0] mem_yMcode [0:P_MCODE_NUM-1]; // データを...
.
.
.
// 初期化処理 (合成不可)
initialize begin
...
// メモリ変数をファイルに書かれたデータで初期化
// 書式は $readmemh(ファイル名,メモリ変数,開始...
$readmemh(DATA_FILE, mem_yMcode, 0, P_MCODE_NUM-1);
...
end
endmodule
*** バイナリ入出力 (Verilog 2001) [#p8be8a26]
$fread(変数, fp)
で変数のサイズ分だけデータを読み込む.
$fwrite(fp, "%u", data)
でdataの値を書き込む.データは32bit単位でパディングされる...
また,ModelSim(6.3e)とIUS(6.2)で$fwrite("%u")の挙動が異な...
例えば,次のようなコードを実行した場合,
module test;
reg [9:0][7:0] mem;
reg [79:0] array;
integer fd;
initial begin
for ( integer i=0; i<10; i++ ) begin
mem[i] = i + 8'h10;
end
array = mem;
fd = $fopen( "mem.bin", "wb" );
$fwrite( fd, "%u", mem );
$fclose( fd );
fd = $fopen( "array.bin", "wb" );
$fwrite( fd, "%u", array );
$fclose( fd );
end
endmodule
IUSではどちらも出力が"10 11 12 13 14 15 16 17 18 19 00 00...
また,ModelSimはPacked Structを$fwrite("%u")で出力しよう...
** 他モジュール内信号の参照 [#oa264ba9]
Cの構造体と同じように参照できる。検証用に変数だけをまとめ...
// foo.v
module foo;
reg [7:0] data;
reg vld;
endmodule
// t_foo.v
foo foo_u;
if (foo_u.vld == 1'b1)
$fwrite( fp_out, "%d\n", foo_u.data );
検証対象の変数の値を強制的に設定することが出来る。
// FSMの途中の処理だけを実行させる例
force foo_u.state = S_STEP4_START;
@(posedge clk);
release foo_u.state;
@(posedge clk);
while ( foo_u.state != S_STEP4_DONE )
begin
#CLKCYC;
end
force foo_u.state = S_IDLE;
終了行:
* テストベンチ関連 [#v0098fc3]
#contents
*テストベンチTips [#t260bfbb]
** ファイル I/O [#oa264ba9]
*** $fopenについて [#e3cd3338]
Verilog 2001で$fopenを使うときには、
fp = $fopen("hoge.dat");
ではなく、
fp = $fopen("hoge.dat", "w");
と明示的にアクセスモードを明示すると、OSの資源にやさしい...
明示しないと双方向"a"で開くっぽい(確認してないけど、そう...
*** ファイル出力 [#db951c35]
> C と同じようにファイル記述子を使う.
module test;
parameter DUMP_FILE = "testdata/dump.dat" //ファイル...
integer fp; // ファイル...
.
.
.
// 初期化処理 (合成不可)
initialize begin
...
fp = $fopen("xxx/xxx.dat"); // 初期化時に $fopen で...
...
end
.
.
.
// データの出力タイミングを捕捉してファイルへ書き込む
always @ (posedge CLK) begin
if (DOUTVLD) begin
// 下の2つは同じ結果になります
$fdisplay(fp, "data = %d", data); // $fdisplay で...
$fwrite(fp, "data = %d\n", data); // $fwrite では...
end
end
endmodule
*** ファイル入力 [#x749dc91]
> ファイルの内容をメモリ変数に読み込む.
module test;
parameter DATA_FILE = "testdata/din.dat"; //ファイル...
reg [11:0] mem_yMcode [0:P_MCODE_NUM-1]; // データを...
.
.
.
// 初期化処理 (合成不可)
initialize begin
...
// メモリ変数をファイルに書かれたデータで初期化
// 書式は $readmemh(ファイル名,メモリ変数,開始...
$readmemh(DATA_FILE, mem_yMcode, 0, P_MCODE_NUM-1);
...
end
endmodule
*** バイナリ入出力 (Verilog 2001) [#p8be8a26]
$fread(変数, fp)
で変数のサイズ分だけデータを読み込む.
$fwrite(fp, "%u", data)
でdataの値を書き込む.データは32bit単位でパディングされる...
また,ModelSim(6.3e)とIUS(6.2)で$fwrite("%u")の挙動が異な...
例えば,次のようなコードを実行した場合,
module test;
reg [9:0][7:0] mem;
reg [79:0] array;
integer fd;
initial begin
for ( integer i=0; i<10; i++ ) begin
mem[i] = i + 8'h10;
end
array = mem;
fd = $fopen( "mem.bin", "wb" );
$fwrite( fd, "%u", mem );
$fclose( fd );
fd = $fopen( "array.bin", "wb" );
$fwrite( fd, "%u", array );
$fclose( fd );
end
endmodule
IUSではどちらも出力が"10 11 12 13 14 15 16 17 18 19 00 00...
また,ModelSimはPacked Structを$fwrite("%u")で出力しよう...
** 他モジュール内信号の参照 [#oa264ba9]
Cの構造体と同じように参照できる。検証用に変数だけをまとめ...
// foo.v
module foo;
reg [7:0] data;
reg vld;
endmodule
// t_foo.v
foo foo_u;
if (foo_u.vld == 1'b1)
$fwrite( fp_out, "%d\n", foo_u.data );
検証対象の変数の値を強制的に設定することが出来る。
// FSMの途中の処理だけを実行させる例
force foo_u.state = S_STEP4_START;
@(posedge clk);
release foo_u.state;
@(posedge clk);
while ( foo_u.state != S_STEP4_DONE )
begin
#CLKCYC;
end
force foo_u.state = S_IDLE;
ページ名: