[SV]SystemVerilog数组参数传递及引用方法总结

              SystemVerilog数组参数传递及引用方法总结

 

一、将常数数组传递给task/function

  • 如下面的程序,将一个常数数组传递给function
module my_array_test();

  function array_test(int array[4]);
    foreach(array[i]) begin
      $display("array[%0d] = %0d", i, array[i]);
    end
  endfunction

  initial begin
    array_test('{0:5, 3:6, 1:2, 2:9});
  end

endmouule

传递常量数组给function的格式如下:

    '{数组索引:值, 数组索引: 值, 数组索引: 值};

 

二、传递关联数组给function/task

  • 如下面的function,其参数类型为关联数组。并且传递参数给他
module my_associative_array_test();

  function associative_array_test(int array[bit [1:0]]);
    foreach(array[i]) begin
      $display("array[%0d] = %0d", i, array[i]);
    end
  endfunction

  initial begin
    associative_array_test('{3:10});
  end

endmouule

备注:

       关联数组,即我们通常所说的哈希(Hash),它没有顺序,只是一系列的键-值(key-value)对。如本例中所传递的Hash,他里面只有1个元素。

 

三、传递数组的引用给function/task

  • 通关ref传递数组的引用给子函数,子函数可以修改数组的值,并且对外可见
module my_ref_array_test();

  int    array[4] = '{0, 1, 2, 3, 4};      //'

  function automatic ref_test(ref int array[5], input start);
    foreach(array[i]) begin
      array[i] = i + start;
      $display("[NOW]array[%0d] = %0d", i, array[i]);
    end
  endfunction

  initial begin
    foreach(array[i]) begin
      $display("[BFE]array[%0d] = %0d", i, array[i]);
    end

    ref_array_test(array, 5);

    foreach(array[i]) begin
      $display("[AFT]array[%0d] = %0d", i, array[i]);
    end
  end

endmouule

备注:

  1. 在使用ref修饰函数参数时(在module/program中),需要将function/task修饰为automatic,否则xrun编译不通过,VCS可以。严谨起见,还是记得加automatic。
  2. 通过ref传递参数是一个唯一的参数传递限定符,将ref与任何其他方向限定符(input/output/inout)组合应该是非法的。
  3. 对于具有静态生命的子程序,通过引用的方式传递参数是非法的。

 

 

四、传递数组的引用给function/task,但不希望子函数修改数组的值

  • 通关键词const修饰ref,传递常数数组给子函数,子函数就不能修改数组值
module my_ref_array_test();

  int    array[4] = '{0, 1, 2, 3, 4};     //'

  function const_ref_array_test(const ref int array[5], input start);
    foreach(array[i]) begin
      //array[i] = i + start;     //不允许修改,会有编译错误
      $display("[NOW]array[%0d] = %0d", i, array[i]);
    end
  endfunction

  initial begin
    foreach(array[i]) begin
      $display("[BFE]array[%0d] = %0d", i, array[i]);
    end

    const_ref_array_test(array, 5);

    foreach(array[i]) begin
      $display("[AFT]array[%0d] = %0d", i, array[i]);
    end
  end

endmouule

注意:

  1. 当用const修饰ref之后,子函数就不能修改数组值了,如果加了修改array元素的语句,将会出现编译错误。
  2. 为了保护引用传递的参数不被子程序修改,const 限定符可以与ref一起使用,表示参数虽然通过引用传递,但它是一个只读变量。
  3. 如果引用参数使用const修饰,那么该不允许子程序修改, 子程序尝试修改时编译器报错。

 

 

 

 

### SystemVerilog 中使用 `display` 函数获取动态数组大小的方法SystemVerilog 中,动态数组是一种可以在运行时调整其大小的数据结构。为了获取动态数组的大小,可以利用内置的任务 `$display` 和属性 `.size()` 来实现[^1]。 以下是具体方法和示例代码: #### 方法说明 `.size()` 是动态数组的一个成员函数,用于返回当前动态数组中已分配的元素数量。通过调用该函数并将结果传递给 `$display`,即可打印出动态数组的大小[^3]。 #### 示例代码 以下是一个完整的示例程序,展示如何使用 `$display` 打印动态数组的大小: ```systemverilog program dynamic_array_size; int dyn_arr[]; // 声明一个动态数组 initial begin dyn_arr = new[5]; // 初始化动态数组并设置初始大小为 5 $display("Initial size of the dynamic array is %0d", dyn_arr.size()); // 输出初始大小 dyn_arr = new[10](dyn_arr); // 调整动态数组大小到 10 并保留原有数据 $display("Updated size of the dynamic array is %0d", dyn_arr.size()); // 输出更新后的大小 end endprogram : dynamic_array_size ``` #### 解析 - **动态数组声明**: 使用 `int dyn_arr[];` 定义了一个未初始化的动态数组。 - **创建动态数组实例**: 利用 `new[size]` 创建指定大小的动态数组实例,并可选地传入旧数组以保留原数据[^4]。 - **访问大小**: 使用 `.size()` 属性读取动态数组的实际长度。 - **显示结果**: 将 `.size()` 的返回值作为参数传递给 `$display` 进行输出。 以上过程展示了如何在 SystemVerilog 中使用 `$display` 显示动态数组的大小。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元直数字电路验证

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值