アプリ版:「スタンプのみでお礼する」機能のリリースについて

verilog初心者です。

以下の様な配列があったとして、array[50]~array[99]に対してデータ処理をするタスクを作りたい場合、どの様にすればよいのでしょうか?
 reg[7:0] array[0:99];

Cでいうところの、こんな感じの事がやりたいのです。
 unsinged int array[100];
 func(&array[50]); /* array[50]~array[99]に対してデータ処理 */

よろしくお願いします。

A 回答 (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行でかけます。)
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/02 00:46

C言語のように簡単になるかどうか・・・



一案として、受け皿となるwire[8*50-1:0] tmp を用意して
あくまでも400bitのwireを受け渡すことです。

wireへの代入時にfor分を使ってラクをします。
funcの方は400bitの入力を用意します。

これなら論理合成でも問題になることはまずないです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ただ、論理合成は考えてないんです。
シミュレーション記述でこんな事をしたいんです。

> 一案として、受け皿となるwire[8*50-1:0] tmp を用意して
> あくまでも400bitのwireを受け渡すことです。
具体的には、どの様なコードになるのでしょうか?
教えて頂けませんか?

以上、よろしくお願いします。

お礼日時:2007/06/25 00:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!