#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
. В самоопределяемом контексте, то есть в отдельном литерале, они будут просто одной цифрой.