2016-12-05 62 views
1

我有一個系統verilog比較如下。systemverilog中的重複操作符

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 

什麼我不明白的是打印報表Second 1FIRST Not equal 1110 and 1

爲什麼打印1,而不是1111?

+0

這很有趣,如果有4,而不是計數它會工作。我很好奇會''定義計數4',然後使用'\'計數'工作? –

+0

你使用什麼模擬器?它不是至少會產生警告信息嗎? – toolic

回答

2

我使用的一個模擬器工具會生成編譯器錯誤。據IEEE Std 1800-2012,節11.4.12.1複製操作者:

的複製操作(也稱爲多串聯)是 通過一個非負的,非X之前的級聯表達,並且 非z恆定表達,所謂的複製不變

有了複製,我認爲你需要使用數字常量,像4,或常量的類型,比如parameter

parameter count = 4; 

我用另一個仿真器會生成警告併產生你看到的結果。

+0

另一種通過移位執行操作的方法'(1 << count)-1' –

+0

返回一個32位值,而不是一個4位值,這可能會也可能不會有所作爲。 – toolic

+0

這種情況並沒有什麼不同,因爲所有的東西都會根據需要得到0擴展。但你可以做'(4'b1 << count)-4'b1) –