$ size, $bits, verilog

В чем разница между оператором $size и $bits в verilog.? если у меня есть переменные, [9:0]a, [6:0]b, [31:0]c.

c <= [($size(a)+$size(b)-1]-:$bits(b)];

Каким будет вывод в 'c' из указанного выше выражения?

Ответ 1

$size должно возвращать количество элементов в размерности, что эквивалентно $high - $low + 1. Это относительно измерения, а не только количество бит. Если тип представляет собой 1D упакованную массив или интегральный тип, он равен $bits.

$bits Системная функция возвращает количество бит, необходимое для хранения выражения в виде потока бит.

$bits ( [expression|type_identifier] )

Он возвращает 0 при вызове с типом динамического размера, который в настоящее время пуст. Ошибка использования системной функции $bits напрямую с идентификатором типа динамического размера.

Я не знаю вашего вопроса, c <= [($size(a)+$size(b)-1]-:$bits(b)];. Является ли это допустимым выражением в RHS? Вы говорите о выражении диапазона массива, [n +: m] или [n -: m]?

Ответ 2

$size() дает количество бит для одного измерения. $bits() дает количество бит для полного представления переменной.

Например:

reg [9:0] a;
reg [9:0] b [5:0];

initial begin
  $display("a Size ", $size(a));
  $display("a Bits ", $bits(a));
  $display("b Size ", $size(b));
  $display("b Bits ", $bits(b)) ;
end

Дает:

a Size          10
a Bits          10
b Size           6 // Depth of memory
b Bits          60 // Width * Depth

В вашем случае у вас есть только одномерные массивы, а не воспоминания или структуры, поэтому $size() и $bits() будут одинаковыми.