首页 > 解决方案 > 在 Verilog 中查找 `define 的 MAX 值

问题描述

我想创建一个define constant that is assigned to one of multiple other具有最大值的定义常量。就像是:

`define MAXWIDTH $MAX(`WIDTH0,`WIDTH1,`WIDTH2)

这在 Verilog/SystemVerilog 中可行吗?

标签: verilogsystem-verilog

解决方案


根据您的具体需要,有几种方法可以做到这一点(没有像其他语言那样内置的最大调用):


你有一些向量,你需要得到一个新向量的最大宽度

$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

推荐阅读