2016-12-05 5 views
1

У меня есть сравнение версий системы следующим образом.Оператор повторения в 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 1 печати и FIRST Not equal 1110 and 1

Почему печать 1 вместо 1111?

+0

Это интересно, если бы 4 было вместо счета, это сработало бы. Мне любопытно, будет ли '\' определять счет 4', а затем использовать '' 'count'? –

+0

Какой симулятор вы используете? Разве это не порождает предупреждающие сообщения? – toolic

ответ

2

Один инструмент моделирования, который я использую, генерирует ошибки компилятора. В соответствии с IEEE Std 1800-2012, разделом оператор 11.4.12.1 репликации:

Оператор репликации (также называется кратное конкатенации) является выражается конкатенация предшествует неотрицательным, не-х, а не-г постоянная выражение, называемое константой репликации

С репликацией, я думаю, вам нужно использовать числовую константу, например 4 или постоянный тип, например parameter.

parameter count = 4; 

Другой симулятор, который я использую, генерирует предупреждения и дает результаты, которые вы видите.

+0

Другой способ сделать это со сдвигом '(1 << count) -1' –

+0

Это возвращает 32-битное значение, а не 4-битное значение, которое может или не может иметь значение. – toolic

+0

В этом случае это не имеет значения, потому что при необходимости все будет увеличиваться до 0. Но вы можете сделать '(4'b1 << count) -4'b1) –

Смежные вопросы