system verilog的常用系统函数

本文介绍了SystemVerilog中的数学函数$clog2(n)$,强调了处理浮点数时需要进行类型转换(如int(n)四舍五入),并讨论了$ceil(x)$和$floor$的向上取整和向下取整操作。作者还提到了这些概念在UVM(统一验证模型)中的应用背景,特别是在测试平台设计中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

$clog2(n)

  1. $clog2(n)的参数n必须为整数,否则会报错,所以我们用的时候如果n是浮点型的,需要使用int’(n)转换一下,然后转换的规则是四舍五入;
  2. n=0时,得到的结果是0,这个算是强制规定,因为log2(x) 的定义域x>0,正常是取不到0的
  3. n=1时,得到的结果是0,这个是合理的
  4. n=2时,得到的结果是1
  5. n=3~4时,得到的结果是2
  6. n=5~8时,得到的结果是3

$ceil(x)

是向上取整,x可以是浮点型, $ceil(1.1)=2.0, $ceil(1.8)=2.0

$floor 

向下取整;


参考:systemverilog基础 - Dylan 


UVM:

https://www.cnblogs.com/Alfred-HOO/articles/16182598.html

### 关于 SystemVerilog 数组函数的使用 #### 动态数组和队列的操作 在 SystemVerilog 中,`shuffle` 是一个系统函数,用于对动态数组或队列进行随机打乱(洗牌)操作[^2]。下面展示如何定义并使用 `shuffle` 函数来处理动态数组: ```systemverilog module shuffle_example; int dynamic_array[]; initial begin // 初始化动态数组 dynamic_array = new[5]; dynamic_array = '{1, 2, 3, 4, 5}; // 打印原始数组 $display("Original array:"); foreach (dynamic_array[i]) $write("%0d ", dynamic_array[i]); $display(); // 随机打乱数组顺序 dynamic_array.shuffle(); // 打印打乱后的数组 $display("Shuffled array:"); foreach (dynamic_array[i]) $write("%0d ", dynamic_array[i]); $display(); end endmodule : shuffle_example ``` 这段代码展示了创建一个整数类型的动态数组,并对其进行初始化;接着调用了 `shuffle()` 方法对该数组进行了原地随机排列。 #### 定长数组的基础操作 对于定长数组,在 SystemVerilog 中可以执行更复杂的操作相比早期版本的 Verilog。例如支持批量赋值以及多种维度的支持等特性被引入到了新标准之中[^1]。这里给出一段简单的例子说明怎样声明与初始化一个多维固定大小数组: ```systemverilog module fixed_array_operations; logic [7:0] matrix [3][4]; // 声明了一个8位宽、3行4列的二维逻辑矩阵 initial begin // 利用大括号语法完成整个数组的同时赋初值 matrix = '{{'hFF,'hAA,'hBB,'hCC}, {'hDD,'hEE,'hFF,'hGG}, {'hHH,'hII,'hJJ,'hKK}}; // 访问单个元素 $display("matrix[1][2] = %h", matrix[1][2]); // 修改特定位置上的数值 matrix[2][3] = 'hLL; // 输出修改后的全部数据 foreach(matrix[row,col]) { $write("(%d,%d):%h ", row, col, matrix[row][col]); } $display(); end endmodule : fixed_array_operations ``` 上述模块中不仅体现了多维静态数组的声明方式及其成员访问模式,还包含了整体性赋值语句的应用实例。 #### 关联数组的功能扩展 除了传统的线性存储外,SystemVerilog 还允许通过哈希表或其他非连续内存布局实现高效的数据检索机制——即所谓的关联数组[^4]。这类特殊形式的集合能够依据键值快速定位到对应的记录项而无需遍历整个序列。下述片段描述了一种基于散列表结构建立起来的大容量映射关系: ```systemverilog module associative_arrays_usage; bit [63:0] rom [bit [63:0]]; // 构建关联数组 bit [63:0] idx; // 对应索引变量 function automatic void print(bit [63:0] pos, ref bit [63:0] rom [bit [63:0]]); $display("rom[%d]=%d", pos, rom[pos]); endfunction : print initial begin idx = 1; repeat(64) begin rom[idx] = idx; idx = idx << 1; end if (rom.first(idx)) begin print(idx, rom); while (rom.next(idx)) print(idx, rom); end end endmodule : associative_arrays_usage ``` 该案例里实现了向关联数组插入一系列条目并将它们逐一打印出来的过程,同时也演示了迭代器样式的便利接口如 `first()`, `next()` 的运用技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值