2017-10-12 86 views
0

信号名を作成するためにsystemverilog/verilogで2つの文字列を連結しようとしています。 私の下のコードスニペットでは、lhs側は正常に動作するようですが、rhs側はうまく動作しません。 ツールは、 "bitempがまだ宣言されていません"というエラーを表示します。マクロを使用してsystemverilogで信号名を連結します

"clno"パラメータに "0"というハードコードされた値を渡すと、lhsとrhsの両方で動作します。

enter code here 
`define strcat_assign_macro(lhs_prestr,lhs_poststr,rhs_prestr,rhs_poststr,clno) \ 
assign lhs_prestr``clno``lhs_poststr = rhs_prestr``clno``rhs_poststr; 

module tempmod; 
    wire a0temp,b0temp; 
    wire a1temp,b1temp; 
    wire a2temp,b2temp; 

    assign b0temp =1'b1; 

    genvar i; 
    generate 
    for(i = 0; i < 3; i++) 
    begin 
     `strcat_assign_macro(a,temp,b,temp,i) 
    end 
    endgenerate 


    initial begin 
    $display (a0temp); 
    end 

endmodule 
+0

拡張した後、あなたのマクロは次のようになります。 'aitemp = bitemp割り当てる;'それはlhs_poststrとrhs_poststrの代わりに 'temp'を代用します、私は、aとbは他の部分に置き換えられます。だから、あなたは別の計画が必要です。 – Serge

答えて

1

Verilog/SystemVerilog構文を解析する前にマクロが展開されます。ワイヤの配列を使用します。

+0

素早い対応のためにDaveに感謝します。残念ながら、 "rhs"は配列ではないDUT信号です。私はこれを達成できる他の方法を知っていますか? – rtmot

+0

ネイティブ構文を使用する必要がある場合は、あなたが悩んでいると思います。あなたはvppのルートに行くことを望んでいる場合でも、あなたが探しているものを達成することができます。最近のリンクを見つけるのは難しい(古いものだが)https://github.com/balanx/vbpp –

+0

にはモジュールが残っているようだ。すべての 'temps'はモジュール内部にあります。どのように現実に見えるのですか?また、ループには3回の繰り返ししかありません。これでしょうか? – Serge

0

`定義はコンパイル前に展開されているので、それらのエラーが発生しています。

これを回避する1つの方法は、スクリプトを使用して定義の使用を自動化し、Verilogファイルで同じ定義を使用することです。

ここでは、この目的のために作成したサンプルのシェルスクリプトを示します。基本的なスクリプトですが、私はあなたにその考えを伝えるのに十分だと思います。

#!/bin/csh 

set b='`' 
set a=`egrep -n "^ *${b}strcat_assign_macro" $2 | cut -d: -f1` 
set line=`egrep -n "${b}strcat_assign_macro" $2 | cut -d: -f2` 

foreach i (`seq $1`) 
    set c=`expr $a + $i` 
    sed -i "${c}i${line}" temp.ip 
    sed -i "${c}s/^\(.*\), *[0-9]* *)/\1, ${i})/g" temp.ip 
end 

スクリプト後のファイルは&です。

// Before 
karan 
shah 
    `strcat_assign_macro(b, temp, a, temp, 0) 
maheshbhai 

// ./temp.sh <Extra Define Lines> <FileName> 
./temp.sh 2 input.v 

// After 
karan 
shah 
    `strcat_assign_macro(b, temp, a, temp, 0) 
`strcat_assign_macro(b, temp, a, temp, 1) 
`strcat_assign_macro(b, temp, a, temp, 2) 
maheshbhai 
関連する問題