perlの配列渡しで、リファレンスでサブルーチンに渡すことを試す。
サンプルとしては、以下。
--
#! /bin/perl
sub test {
my ( $ref, $ref_count ) = @_;
print "test:@org reference = ", $ref, "\n";
print "test:@org reference = ", $ref_count, "\n";
print "test:@org reference = ", @$ref, "\n";
print "test:@org reference = ", @$ref[0], "\n";
}
my @org = ( 1, 2, 3, 4, 5 );
my $org = @org;
&test( \@org, $org );
print "main:@org reference = ", \@org, "\n";
print "main:@org reference = ", $org, "\n";
--
要点としては以下。
・リファレンスを渡す場合、配列の前に\をつける。
@aaa -> \@aaa
・配列の数は、どうやら別途渡してやらないとサブルーチンではいくつの配列か判らないっぽい。
$aaa = @aaa で配列数をカウントし、サブルーチンに渡す。
・
2008年10月21日火曜日
2008年4月18日金曜日
サブルーチン(?)へのファイルポインタの引き渡し方法
perl使用時のサブルーチン(?)へのファイルポインタの引き渡し方法は、以下のとおり。
open ( WRITE_FILE, "> test.txt" );
&test_write ( *WRITE_FILE );
close ( WRITE_FILE );
sub test_write {
local(*FH) = @_;
printf( FH "Hello world\n");
}
[要調査項目]
(1) * は“型グログ”というらしい。詳細はチト不明。
(2) sub で記述している部分については、サブルーチンでいいのか? 関数とかではなく?
(3) localとmyの違い。なんか昔調べたのだけど忘れた。
open ( WRITE_FILE, "> test.txt" );
&test_write ( *WRITE_FILE );
close ( WRITE_FILE );
sub test_write {
local(*FH) = @_;
printf( FH "Hello world\n");
}
[要調査項目]
(1) * は“型グログ”というらしい。詳細はチト不明。
(2) sub で記述している部分については、サブルーチンでいいのか? 関数とかではなく?
(3) localとmyの違い。なんか昔調べたのだけど忘れた。
2008年3月18日火曜日
ModelSimでのRocket IOお試し
ModelSimでRocket IO(Xilinx)のシミュレーションを実行してみる。
なお、Rocket IOのシミュレーションには、Smart Model対応の環境が必要。
試したモジュールは、CoreGeneratorで生成した“GTP Aurora(2.8)”。
これで生成すると、projectフォルダの下に以下のフォルダが生成される。
project
+- module_name
+ +- cc_manager
+ +- clock_module
+ +- examples
+ +- scripts
+ +- src
+ +- testbench
+ +- ucf
scriptsの下にお試し用のスクリプト(example_test.do)がある。
example_test.doでは、scriptsの直下で行なうことを前提としているような形でファイルの位置情報が記載されているので、scriptsフォルダをシミュレーション用フォルダとするか、module_nameの下にシミュレーション用フォルダを作成すること。
以下、VHDLおよびverilog HDLでのシミュレーション実行までの手順を示す。なお、基本的には2回目以降はexample_test.doを実行すればいいはず。
[VHDLの場合]
(1) smart_modelを使えるように、libraryを設定する。
> compxlib -s mti_pe -arch virtex5 -smartmodel_setup
# なおmodelsim.iniも書き換えておく必要あり。この辺を参照すること。
# http://japan.xilinx.com/support/answers/14019.htm
(2) example_test.doを編集する。MTI_LIBS変数はどこにも定義されていない上に不要な模様なので、以下の行をコメントアウトしておく。
set MTI_LIS $env{MTI_LIBS}
(3) example_test.doを実行する。
> do example_test.do
[verilog HDLの場合]
(1) VHDLと同様にライブラリの設定をする。詳細は前述を参照。
(2) example_test.doを編集する。MTI_LIBSはVHDLと同様にコメントアウトしておく。
(3) simprim、unisim、xlinxcorelibの参照位置をvmapコマンドで変えておく。
> vmap simprim C:/xilinx/verilog/mti_pe/simprims_ver
> vmap unisim C:/xilinx/verilog/mti_pe/unisims_ver
> vmap xilinxcorelib C:/xilinx/verilog/mti_pe/xilinxcorelib_ver
# これをしないと、なぜかVHDLの方のライブラリを参照しにいってしまい、
# “FDSモジュールにINIT変数なんかない”と言われてvsimでErrorで落ちる。
(4) example_test.doを実行する。
> do example_test.do
verilogの(3)については、もっと別のやり方があるような気がするので、時間があるときに方法を探しておこう。
なお、Rocket IOのシミュレーションには、Smart Model対応の環境が必要。
試したモジュールは、CoreGeneratorで生成した“GTP Aurora(2.8)”。
これで生成すると、projectフォルダの下に以下のフォルダが生成される。
project
+- module_name
+ +- cc_manager
+ +- clock_module
+ +- examples
+ +- scripts
+ +- src
+ +- testbench
+ +- ucf
scriptsの下にお試し用のスクリプト(example_test.do)がある。
example_test.doでは、scriptsの直下で行なうことを前提としているような形でファイルの位置情報が記載されているので、scriptsフォルダをシミュレーション用フォルダとするか、module_nameの下にシミュレーション用フォルダを作成すること。
以下、VHDLおよびverilog HDLでのシミュレーション実行までの手順を示す。なお、基本的には2回目以降はexample_test.doを実行すればいいはず。
[VHDLの場合]
(1) smart_modelを使えるように、libraryを設定する。
> compxlib -s mti_pe -arch virtex5 -smartmodel_setup
# なおmodelsim.iniも書き換えておく必要あり。この辺を参照すること。
# http://japan.xilinx.com/support/answers/14019.htm
(2) example_test.doを編集する。MTI_LIBS変数はどこにも定義されていない上に不要な模様なので、以下の行をコメントアウトしておく。
set MTI_LIS $env{MTI_LIBS}
(3) example_test.doを実行する。
> do example_test.do
[verilog HDLの場合]
(1) VHDLと同様にライブラリの設定をする。詳細は前述を参照。
(2) example_test.doを編集する。MTI_LIBSはVHDLと同様にコメントアウトしておく。
(3) simprim、unisim、xlinxcorelibの参照位置をvmapコマンドで変えておく。
> vmap simprim C:/xilinx/verilog/mti_pe/simprims_ver
> vmap unisim C:/xilinx/verilog/mti_pe/unisims_ver
> vmap xilinxcorelib C:/xilinx/verilog/mti_pe/xilinxcorelib_ver
# これをしないと、なぜかVHDLの方のライブラリを参照しにいってしまい、
# “FDSモジュールにINIT変数なんかない”と言われてvsimでErrorで落ちる。
(4) example_test.doを実行する。
> do example_test.do
verilogの(3)については、もっと別のやり方があるような気がするので、時間があるときに方法を探しておこう。
ModelSimでのpauseからの復帰
ModelSimで、doファイルを使用している際、エラーが発生するとpaseで止まることがある。
この時の表示は以下のような形。
#MACRO ./hoge.do PAUSED at line 10
VSIM{paused}>
この状態だと、doファイル(hoge.do)の編集ができない(別プロセスで使用とかなんとか)ので、pause状態を解除する必要がある。コマンドとしては、resumeを使用する。
VSIM{paused}> resume
: (なんか続きを実行中。エラーなんでまともに動作しないけど)
ModelSim>
これでpause状態からは復帰する。
で、doファイルも編集できると思ったのだが、何故かまだ使用中。
後で、ゆっくりマニュアルでも読むことにしよう。
この時の表示は以下のような形。
#MACRO ./hoge.do PAUSED at line 10
VSIM{paused}>
この状態だと、doファイル(hoge.do)の編集ができない(別プロセスで使用とかなんとか)ので、pause状態を解除する必要がある。コマンドとしては、resumeを使用する。
VSIM{paused}> resume
: (なんか続きを実行中。エラーなんでまともに動作しないけど)
ModelSim>
これでpause状態からは復帰する。
で、doファイルも編集できると思ったのだが、何故かまだ使用中。
後で、ゆっくりマニュアルでも読むことにしよう。
2008年3月14日金曜日
tcshでの変数の加算
tcshでの変数の加算方法
@を使うことで可能。
[例1]
set val = 1;
@ val = $val + 1
インクリメントだったら、
@ val++;
でもOK。
とりあえずこんな感じで。echoコマンドを適当にやりたいコマンドに変更すれば繰り返し数を制御できる。
#! /bin/tcsh
set val = 1;
while ( val < 16 )
echo $val;
@ val++;
end
今まではforeachしか使わなかったけど、これは結構便利かもしれない。
@を使うことで可能。
[例1]
set val = 1;
@ val = $val + 1
インクリメントだったら、
@ val++;
でもOK。
とりあえずこんな感じで。echoコマンドを適当にやりたいコマンドに変更すれば繰り返し数を制御できる。
#! /bin/tcsh
set val = 1;
while ( val < 16 )
echo $val;
@ val++;
end
今まではforeachしか使わなかったけど、これは結構便利かもしれない。
2008年3月12日水曜日
VHDLのstring
writeとかwritelenとかではなく、ModelSimとかで波形表示する際に有効な、VHDLで文字列を格納しておく方法。
signal signal_name : string(1 to n);
で信号(というより格納領域)を定義しておいて、signal_nameには通常の信号(std_logic_vectorとか)と同様に文字列を代入する。文字列は“”で囲っておく。
例:
signal bus_condition : string(1 to 3);
:
process ( CLK, RESET ) begin
if ( RESET='1' ) then
bus_condition <= "typ"; elseif ( CLK'event and CLK='1' ) then
if ( PERR='1' ) then
bus_condition <= "err"; else bus_condition <= "typ"; end if; end if;
end process;
注意点としては、以下のとおり。
(1) bit array(と言うのも変かな?)の0番目は使用不可。
(2) 信号を定義したビット数と文字列の数が合わないとcompile時にerrorが出る。
ちなみに、信号の定義は(1 to n)でも(n downto 1)でもどちらでもいい。別に1始まりでなくてもいいけど、そうするとnが文字数になるので楽。
テストベンチでの使用になるけど、意外と便利かも。文字数に融通が効く(例えば、5文字分を定義しておいて、3文字しか入れないとか)ともっと便利なのだが。
signal signal_name : string(1 to n);
で信号(というより格納領域)を定義しておいて、signal_nameには通常の信号(std_logic_vectorとか)と同様に文字列を代入する。文字列は“”で囲っておく。
例:
signal bus_condition : string(1 to 3);
:
process ( CLK, RESET ) begin
if ( RESET='1' ) then
bus_condition <= "typ"; elseif ( CLK'event and CLK='1' ) then
if ( PERR='1' ) then
bus_condition <= "err"; else bus_condition <= "typ"; end if; end if;
end process;
注意点としては、以下のとおり。
(1) bit array(と言うのも変かな?)の0番目は使用不可。
(2) 信号を定義したビット数と文字列の数が合わないとcompile時にerrorが出る。
ちなみに、信号の定義は(1 to n)でも(n downto 1)でもどちらでもいい。別に1始まりでなくてもいいけど、そうするとnが文字数になるので楽。
テストベンチでの使用になるけど、意外と便利かも。文字数に融通が効く(例えば、5文字分を定義しておいて、3文字しか入れないとか)ともっと便利なのだが。
登録:
投稿 (Atom)