2016-12-05 11 views
1

私は以下のようにシステムのVerilogの比較をしています。システムの反復演算子

module m(); 
    int count = 4; 
    logic [3:0] first = 14; 
    logic [3:0] second = 15; 
    initial begin 
    $display("Second %b\n", {count{1'b1}}); 
    if(first == {count{1'b1}}) $display("FIRST Equals\n"); 
    else $display("FIRST Not equal %b and %b\n", first, {count{1'b1}}); 
    if(second == {count{1'b1}}) $display("SECOND Equals\n"); 
    else $display("SECOND Not equal %b and %b\n", second, {count{1'b1}}); 
    end 
endmodule 

これは私が理解していなかった何を出力

Second 1 

FIRST Not equal 1110 and 1 

SECOND Equals 

ですが、なぜそれが代わりに1111年の1を印刷しているprint文Second 1FIRST Not equal 1110 and 1

のですか?

+0

興味深いことに、数が4であればそれが機能するはずです。私は '' 'count 4'を定義し、' '' 'count''の働きを使うのは興味がありますか? –

+0

どのようなシミュレータを使用していますか?それは少なくとも警告メッセージを生成しませんか? – toolic

答えて

2

私が使用するシミュレータツールは、コンパイラエラーを生成します。 IEEE Std 1800-2012によれば、セクション11.4.12.1複製演算子:

複製演算子は(また、複数の連結とも呼ばれる) 非負、非Xが先行連結、及び 非Z定数で表されます。複写定数と呼ばれる複写定数

複写では、4のような数値定数やparameterのような定数型を使用する必要があると思います。

parameter count = 4; 

私が使用する別のシミュレータでは、警告が生成され、表示される結果が生成されます。

+0

シフト '(1 << count)-1'を実行するもう1つの方法 –

+0

これは、4ビット値ではなく32ビット値を返します。これは違いをもたらす場合もありません。 – toolic

+0

この場合は、必要に応じてすべてが0になるため、違いはありません。しかし、あなたは '(4'b1 << count)-4'b1) –