0

ザイリンクスSystemCを使用してVerilogコアに指定された整数の絶対値を見つけようとしていますが、Verilogは負の数を正の数として扱うことがわかりました。

私はすべてのデータ型を試しました: signed int、、。intXuint32

私のSystemCまたはザイリンクスCコードは次のとおりです。

signed int data,value;
data=-20;value=0;
putfsl(data,0);
getfsl(value,0);
signed int data1,value1;
data=20;value=0;
putfsl(data1,0);
getfsl(value1,0);

変数の値を取得した後、ハイパーターミナルに出力しました。

私のVerilog側では、コードは次のとおりです。

out <=(in<0)?-in:in;

私もこのコードを試しましたが、結果は似ていました

if(in<0)
out=-in;
else 
out=in;

親切に私を助けてください!

他のデータ型を試し、パラメータを変更しましたが、結果はうまくいきませんでした。常に入力したのと同じ数値を取得します。

in<0

ステートメントは真実ではありません、私も試しましたin<=0;

4

2 に答える 2

2

System C についてはお手伝いできませんが、あなたのコメントによると、Verilog コードは signal に unsigned 型を使用していますin

reg [31:0] in;
if(in<0) //This will always be false since reg is unsigned
  out=-in;
else 
  out=in;

これが機能するためinには、署名済みとして宣言する必要があります。

signed reg [31:0] in;

inMSB を調べることで、負の値の符号なし値をテストすることもできます (実際には 2 の補数値を保持していると仮定します)。

//If negative
if(in[31])
  out = -in;
else
  out = in;
于 2011-08-11T16:36:38.070 に答える
0

さて私はついに誰かが提案したように答えが本当にうまくいったことを知るようになりました。彼に感謝します(マーティン・トンプソン

答えは次のとおりです。Verilog-2001より前は、Verilogのすべてのベクトル演算は符号なしでした。

Verilog-2001では、符号付き演算を明示的に呼び出すことができるため、次のようにキャストする必要があると思います。

if ($signed(in) < 0)
 out = -$signed(in);
else
 out = in;

興味があるかもしれない読み物:

Verilog-2001の署名された算術-機会と危険

于 2011-08-12T04:47:42.617 に答える