我想创建一个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