在 Verilog 中查找"定义"的 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

最新更新