verilog - 在 Verilog 中查找 `define 的 MAX 值
问题描述
我想创建一个define constant that is assigned to one of multiple other
具有最大值的定义常量。就像是:
`define MAXWIDTH $MAX(`WIDTH0,`WIDTH1,`WIDTH2)
这在 Verilog/SystemVerilog 中可行吗?
解决方案
根据您的具体需要,有几种方法可以做到这一点(没有像其他语言那样内置的最大调用):
你有一些向量,你需要得到一个新向量的最大宽度
$bits(v1 + v2 + v3 ...)
使用该语言对您有利,注意添加向量会产生一个向量,该向量具有所有操作数向量宽度的最大宽度,并用于$bits
获得该大小。例子:
logic [1:0] x;
logic [7:0] y;
logic [10:6] z;
...
max = $bits(x + y + z); // Result: max = 8
你有几个数字,你需要最多
如果将数字放入数组或队列中,则可以使用该max
方法获得最大的:
int x[] = '{n1, n2, n3, ...};
...
max = x.max;
请注意,这种方法的缺点是它不能在编译时用于获取最大大小。例子:
int _nums[] = '{13, 2, 17, 8, -1};
...
max = _nums.max; // Result: max = 17
基本上其他时间
您只需在宏中或使用条件运算符即可let
:
`define max2(v1, v2) ((v1) > (v2) ? (v1) : (v2))
`define max3(v1, v2, v3) `max2((v1), `max2((v2), (v3)))
或者
let max2(v1, v2) = (v1 > v2) ? v1 : v2;
let max3(v1, v2, v3) = max2(v1, max2(v2, v3));
宏的优点是您可以在更广泛的工具中将它们用作编译时常量,而旧工具可能不支持let
(或根本不支持)编译时常量。例子:
max = `max3(10, 2, 3); // Result: max = 10
或者
max = max3(10, 2, 3); // Result: max = 10
推荐阅读
- computer-vision - 在opencv中的acceptanceRatio 0:0感到困惑
- arrays - 如何将制表符分隔的字段读入数组
- sql - 创建无参数过程
- sql - 在postgresql中查找每天每小时每行的列数据总和
- c++ - 为什么函数返回0?
- graphviz - Graphviz:控制子图中节点的最小等级
- firebase - React Native Firestore (8.5.0):无法访问 Cloud Firestore 后端。后端在 10 秒内没有响应
- python - 使用 Matplotlib 绘制长方体,并使用 Flask 中的用户输入
- javascript - AES - 将 Javascript 解密算法转换为 Python
- c - CLion 中的重音符号问题