Проверка того, все ли биты установлены в упакованном массиве в SystemVerilog

#system-verilog

Вопрос:

Я просматривал некоторый код SystemVerilog и наткнулся на это выражение для проверки того, были ли установлены все биты в упакованном массиве.

 logic [SIZE-1:0]                   array;

// Bool we are evaluating:
array == '1;
 

Может кто-нибудь объяснить мне, как это работает? Из того, что я прочитал, значение '1 обрабатывается как целое число со знаком, так что, возможно, оно расширено до всех 1? Просто пытаюсь разобраться в этом фрагменте кода у себя в голове.

Ответ №1:

Да, '1 обозначение — это удобный способ установить все биты равными 1, даже для сравнения, как в вашем коде. Вот небольшой пример для демонстрации:

 module tb;

parameter SIZE = 3;
logic [SIZE-1:0] array;

initial begin
    for (int i=0; i<8; i  ) begin
        array = i;
        if (array == '1) begin
            $display("true  %b", array);
        end else begin
            $display("false %b", array);
        end
    end
end

endmodule
 

С принтами:

 false 000
false 001
false 010
false 011
false 100
false 101
false 110
true  111
 

Стандарт IEEE Std 1800-2017, раздел 5.7.1 Целочисленные литеральные константы, обсуждает это:

Однобитовое значение без размера можно указать, поставив перед однобитовым значением апостроф ( ‘ ), но без базового спецификатора. Все биты безразмерного значения должны быть установлены на значение указанного бита.

Ответ №2:

'0 , '1 , 'x и 'z являются литералами заполнения (см. Раздел 5.7.1 Целочисленные литеральные константы в IEEE 1800-2017 SystemVerilog LRM). Используя правила для битовой ширины выражений (раздел 11.6.1), эти литералы заполняются до определенной ширины всеми 0,1, x или z. В этом случае до ширины array . В самоопределяемом контексте, то есть в отдельном литерале, они будут просто одной цифрой.