2012-05-02 14 views
3

私は整数比較を行う単純なCコードを持っています。case(In)等価演算子=== '&!==' C言語のVerilogが好き

void evaluate_comparison (int addr, int expected, int got) 
{ 
    if (got == expected) tunnel_pass (addr, got); 
    else     tunnel_fail (addr, expected, got); 
} 

expected & got実際に24ビットDSPコアに読み取る/書き込む値に対応する24ビットの値です。時々シミュレーションで

、(このC-コードをDSPコアにロードアセンブリ&にコンパイルされます)(一部addrがDSPによってサポートされていない場合、ESP)、DSPコアはgot = 24'hxxxxxx(未定義の24ビット値)を読み出します。この場合、上記の比較は合格しますが、私はそれを望んでいません。

=== & !== Case Equality演算子(Verilogに似ています)がコンパイルされません。 Cでこれを行う方法はありますか?

+0

Cには===はありません。整数の場合は、==で十分です。なぜなら、整数は表現するはずの値以外の整数ではないからです。あなたは、24ビットの値が上位8ビットにどんな迷惑メールも持たないと確信していますか?ちょうどの場合、あなたは余分な範囲チェックをすることができます。 –

+0

Cの 'int'のビットは未知の第3の状態を持たないので、Cの' === '(大文字/小文字の等価演算子)はありません。 –

+0

ええと、私は理論的なユースケースを考えました。もしあなたが1補完システムを持っていれば、intは+0か-0のどちらかになります。次に、それらを区別するために===演算子が必要です。しかし、私は普遍的な1補完システムが最近どのようになっているのかよく分かりません。しかし、とにかく、Cは===なので、それは問題ではありません。 –

答えて

1

たぶん、あなたのような何か書くことができます:私は知りませんが

if (IsSupported(addr) && got == expected) 
    tunnel_pass (addr, got); 
else 
    tunnel_fail (addr, expected, got); 

をそれはあなたのケースでIsSupported()機能を実装することが可能です。
少なくとも、サポートされているアドレス範囲を手作業でハードコーディングできます。

+0

あなたは正しいです、私は余分なチェックのためにそのようにすることができます。 'IsSupported'は、実際のアドレス制限がサポートされており、関数内でハードコードされていることが分かっている場合に実装できます。 しかし、私は実際にRAMのサポートされているアドレス制限を確認するテストを書いていました。意味、私はいくつかのユニークなデータ値をすべての可能な(4Kのようなより高い数の)RAMの場所に書きました。今、私はすべてのRAMの位置を連続的に読み込み、書かれたデータと比較しています( '期待されています ')。 私はaddr-limitを検出する必要があります。返された 'got'データが' expected'に正確にマッチするまで;その後に '得られる'は 'x'です。 – makontrack

関連する問題