1

ModelSim では、次のコードは正常に機能します。

string r;
string s;
// ...assign some string to s...
integer i;
r = "";
for (i=s.len()-1; i>=0; i=i-1) begin
    if (s[i] != "\n") begin
        r = {s[i], r};
    end
end

Aldec Riviera では、これによりコンパイル エラーが発生しますIncompatible types at assignment: .r<string> <- s[i]<byte>

SystemVerilog LRM を読むと、中かっこはバイトではなく文字列を連結するためにのみサポートされているように見えます。そのため、ModelSim は LRM にそれほど厳密ではないか、暗黙的にs[i]バイトを 1 文字の文字列に変換します (このコンテキストでは理にかなっているようです)。Riviera では、s[i]手動でバイトを 1 文字の文字列に変換する必要があるようです。最も効率的で簡潔な解決策は何ですか (可能な場合、一時変数を導入する必要はありません)?

4

4 に答える 4

3

その通りです。ModelSim は無効なコードを受け入れています。仕様では、インデックス作成と代入に関連する型が明示的に定義されています。

文字列変数の 1 文字はバイト型です。

...

整数型の値は文字列変数に割り当てることができますが、キャストが必要です。

仕様では、オペランドに基づく連結演算子の結果がさらに詳しく説明されています。

各オペランドは、文字列リテラルまたは文字列型の式にすることができます。

キャストの使用:

string r;
string s;
// ...assign some string to s...
integer i;
r = "";
for (i=s.len()-1; i>=0; i=i-1) begin
    if (s[i] != "\n") begin
        r = {string'(s[i]), r};
    end
end
于 2012-11-06T02:33:40.287 に答える
1

次のコードがシミュレーターで 100% OK かどうかはわかりませAldec RivieraVCS。s の文字列型を返す必要がある場合は、文字列メソッドを試すことができますsubstr()

for (i=s.len()-1; i>=0; i=i-1) begin
    if (s[i] != "\n") begin
        r = {s.substr(i,i), r};
    end
end
于 2012-11-05T14:01:37.543 に答える
0

ASCII とバイナリ間の変換には、atobin()/bintoa() 関数を使用します。次に、連結演算子「{}」を文字列/バイナリ値で使用できます。

于 2015-09-30T10:16:18.387 に答える
0

ここにコードの小さな例があります:

まず、文字列からバイト動的配列を作成する例。バイトの動的配列には、各文字の ASCII コード番号表現が含まれています。利点は、これはたとえばランダム化できるが、文字列はランダム化できないことです。

(例えば作成

for(i=0;i<stringvar.len(); i++) begin 
byte_din_array = {byte_din_array ,stringvar[i]}; //stringvar[i] will return empty byte if  the index would be beyond the string length
//The advantage of using stringvar[i] instead of stringvar.atoi(i) is that 
//the string can have all ASCII characters and not just numbers.
//Disadvantage is that the byte contains the ASCII CODE "number" 
//representation of the character and that is not human readable
end

)。

バイトの動的配列を連結文字列に変換する例を次に示します。以前の動的配列を使用して、xfer 内で (制約付きで) 部分的にランダム化したか、post_randomize で変更した可能性があります。

function string convert_byte_array2string(byte stringdescriptionholder[]);
    automatic string temp_str="";
    automatic byte byte_temp;
    automatic string str_test;
    for ( int unsigned i = 0; i<stringdescriptionholder.size(); i++)  begin
        i=i;//debug breakpoint
        byte_temp = stringdescriptionholder[i];
        str_test = string'(byte_temp); //the "string cast" will convert the numeric ASCII representation in a string character
        temp_str = {temp_str,str_test};
    end
    return temp_str;
endfunction
于 2016-02-05T07:44:50.387 に答える