• ベストアンサー

verilogで、配列の一部をタスクに渡したい

verilog初心者です。 以下の様な配列があったとして、array[50]~array[99]に対してデータ処理をするタスクを作りたい場合、どの様にすればよいのでしょうか?  reg[7:0] array[0:99]; Cでいうところの、こんな感じの事がやりたいのです。  unsinged int array[100];  func(&array[50]); /* array[50]~array[99]に対してデータ処理 */ よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

1.のものです。 simだけでよいならば、functionではなくtaskを使うのもひとつ方法です。(taskも大抵は論理合成できますが) taskならばそのモジュール内で(手前で)宣言されている全てのヴァリアントにアクセスできます。 もっといえば、functionを使わずベタに書けば(手前で)宣言されている全てのヴァリアントにアクセスできます。 wireへの代入方法は基本中の基本です。 wire[400-1:0] tmp; integer i; for( i=0 ; i<50 ;i=i+1) begin assign tmp[i*8+0]=array[i][0]; assign tmp[i*8+1]=array[i][1]; assign tmp[i*8+2]=array[i][2]; assign tmp[i*8+3]=array[i][3]; assign tmp[i*8+4]=array[i][4]; assign tmp[i*8+5]=array[i][5]; assign tmp[i*8+6]=array[i][6]; assign tmp[i*8+7]=array[i][7]; end こんな感じです。細かいチェックはしていません。ケアレスミスはご容赦ください。 verilog1995方式ですとfor文中の[]のバス記述の、「コロン」 の前後にforの変数を記述するのは許可されません。(確か・・) 従って : の無い記述にするために1bitづつベタ書します。 (verilog2001では相対バス幅記述が可能です。これを使うと1行でかけます。)

fugafugahogehoge
質問者

お礼

なるほど。分かりました。 大変分かりやすいサンプルありがとうございました。

その他の回答 (1)

回答No.1

C言語のように簡単になるかどうか・・・ 一案として、受け皿となるwire[8*50-1:0] tmp を用意して あくまでも400bitのwireを受け渡すことです。 wireへの代入時にfor分を使ってラクをします。 funcの方は400bitの入力を用意します。 これなら論理合成でも問題になることはまずないです。

fugafugahogehoge
質問者

お礼

ありがとうございます。 ただ、論理合成は考えてないんです。 シミュレーション記述でこんな事をしたいんです。 > 一案として、受け皿となるwire[8*50-1:0] tmp を用意して > あくまでも400bitのwireを受け渡すことです。 具体的には、どの様なコードになるのでしょうか? 教えて頂けませんか? 以上、よろしくお願いします。

関連するQ&A