Verilog 实现 a<b ? 1 : 0

Verilog implementing a<b ? 1 : 0

我试图理解这段代码,但我无法理解它

// upper bits are always zero
assign slt[31:1] = 0;

xor (condition, a[31], b[31]);
yArith slt_arith (tmp, cout, a, b, 1);
yMux #(.SIZE(1)) slt_mux(slt[0], tmp[31], a[31], condition);

ab 是一些 32 位数字

代码正在尝试实现 (a < b) ? 1 : 0; 在 mips 中称为 slt

yArith 部分正在执行 (a-b) 并将结果放入 tmp,1 是减法的标志。

yMux 部分是 2x1 多路复用器,它需要一些条件(0 或 1)到 select 如果条件为 0 则 tmp[31] 或如果条件为 a[31] 1.

为什么这段代码可以实现 set on less 而不是 Verilog?

ab符号相反,则a只能小于ba为负数

用伪代码表示:

if (a[31] XOR b[31]) {
    result = a[31]
}

如果ab符号相同,那么显然我们不能只看其中一个操作数的符号位。相反,我们检查 a-b 是否为负数。

if (!(a[31] XOR b[31])) {
    result = (a-b)[31]
}

如果我们将这两者结合起来:

if (a[31] XOR b[31]) {
    result = a[31]
} else {
    result = (a-b)[31]
}

如果您想知道为什么我们不总是使用 (a-b)[31],请考虑 a = -2147483648 (0x80000000) 和 b = 1 的情况。很明显-2147483648小于1,但是(0x80000000-1)[31] == (0x7FFFFFFF)[31],也就是0,所以不行。