【问题标题】:$size, $bits, verilog$size, $bits, verilog
【发布时间】: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


    【解决方案1】:

    $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() 将是同一件事。

    【讨论】:

      【解决方案2】:

      $size 应该返回维度中的元素个数,相当于$high - $low + 1。它与尺寸有关,而不仅仅是位数。如果类型是一维压缩数组或整型,则等于$bits

      $bits 系统函数返回将表达式保存为位流所需的位数。

      $bits ( [expression|type_identifier] )
      

      当使用当前为空的动态大小的类型调用时,它返回 0。直接将$bits系统函数与动态大小的类型标识符一起使用是错误的。

      我不知道你的问题,c &lt;= [($size(a)+$size(b)-1]-:$bits(b)];。它是 RHS 中的有效表达式吗?你说的是数组范围表达式[n +: m]还是[n -: m]

      【讨论】:

      • $size(a) = 10, $size(b) = 7, $bits(b) = 7: c &lt;= x[17-1-:7] 这些都是标准类型,所以$bits$size 是一样的。
      • 你是对的。但我只是没有意识到c &lt;= [17+7-1]-:7]; 是一个错字或真实意图
      • 啊,是的,错字 17+7-1。另请注意,问题没有变量,它只是一个范围,因此它不是有效的 verilog。
      • @jclin,是的。你说的对。我说的是数组范围,[n+:m] 和 [n-:m]。你能解释一下在这种类型中表示范围的意义吗?谢谢
      • 数组范围表达式[n +: m][n -: m]n为起始索引,+:-:为递增或递减方向。 m 是向上/向下计数的元素数。例如[4+:4] == [4:7], [3-:4] == [3:0]
      猜你喜欢
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多