【发布时间】:2012-11-12 08:19:35
【问题描述】:
verilog.中$size和$bits运算符有什么区别?
如果我有变量,[9:0]a,[6:0]b,[31:0]c。
c <= [($size(a)+$size(b)-1]-:$bits(b)];
上述表达式在“c”处的输出是什么?
【问题讨论】:
标签: arrays verilog system-verilog
verilog.中$size和$bits运算符有什么区别?
如果我有变量,[9:0]a,[6:0]b,[31:0]c。
c <= [($size(a)+$size(b)-1]-:$bits(b)];
上述表达式在“c”处的输出是什么?
【问题讨论】:
标签: arrays verilog system-verilog
$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() 将是同一件事。
【讨论】:
$size 应该返回维度中的元素个数,相当于$high - $low + 1。它与尺寸有关,而不仅仅是位数。如果类型是一维压缩数组或整型,则等于$bits。
$bits 系统函数返回将表达式保存为位流所需的位数。
$bits ( [expression|type_identifier] )
当使用当前为空的动态大小的类型调用时,它返回 0。直接将$bits系统函数与动态大小的类型标识符一起使用是错误的。
我不知道你的问题,c <= [($size(a)+$size(b)-1]-:$bits(b)];。它是 RHS 中的有效表达式吗?你说的是数组范围表达式[n +: m]还是[n -: m]?
【讨论】:
$size(a) = 10, $size(b) = 7, $bits(b) = 7: c <= x[17-1-:7] 这些都是标准类型,所以$bits 和$size 是一样的。
c <= [17+7-1]-:7]; 是一个错字或真实意图
[n +: m]或[n -: m],n为起始索引,+:或-:为递增或递减方向。 m 是向上/向下计数的元素数。例如[4+:4] == [4:7], [3-:4] == [3:0]