在Verilog中找到`define的MAX值

jka*_*ang 1 verilog system-verilog

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

`define MAXWIDTH $MAX(`WIDTH0,`WIDTH1,`WIDTH2)
Run Code Online (Sandbox Code Playgroud)

这在Verilog/SystemVerilog中是否可行?

Unn*_*Unn 5

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


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

$bits(v1 + v2 + v3 ...)
Run Code Online (Sandbox Code Playgroud)

使用该语言是有利的,注意向量的添加导致向量具有所有操作数向量宽度的最大宽度并用于$bits获得该大小.例:

logic [1:0] x;
logic [7:0] y;
logic [10:6] z;
...
max = $bits(x + y + z); // Result: max = 8
Run Code Online (Sandbox Code Playgroud)

您需要最多的一些数字

如果将数字放在数组或队列中,则可以使用该max方法获得最大值:

int x[] = '{n1, n2, n3, ...};
...
max = x.max;
Run Code Online (Sandbox Code Playgroud)

请注意,此方法的缺点是在编译时无法使用它来获取最大大小.例:

int _nums[] = '{13, 2, 17, 8, -1};
...
max = _nums.max; // Result: max = 17
Run Code Online (Sandbox Code Playgroud)

基本上任何其他时间

您只需要在宏中使用条件运算符或使用let:

`define max2(v1, v2) ((v1) > (v2) ? (v1) : (v2))
`define max3(v1, v2, v3) `max2((v1), `max2((v2), (v3)))
Run Code Online (Sandbox Code Playgroud)

要么

let max2(v1, v2) = (v1 > v2) ? v1 : v2;
let max3(v1, v2, v3) = max2(v1, max2(v2, v3));
Run Code Online (Sandbox Code Playgroud)

宏的优点是您可以在更广泛的工具中将它们用作编译时常量,而较旧的工具可能不支持let编译时常量(或根本不支持).例:

max = `max3(10, 2, 3); // Result: max = 10
Run Code Online (Sandbox Code Playgroud)

要么

max = max3(10, 2, 3); // Result: max = 10
Run Code Online (Sandbox Code Playgroud)