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);
a
和 b
是一些 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?
若a
与b
符号相反,则a
只能小于b
且a
为负数
用伪代码表示:
if (a[31] XOR b[31]) {
result = a[31]
}
如果a
和b
符号相同,那么显然我们不能只看其中一个操作数的符号位。相反,我们检查 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,所以不行。
我试图理解这段代码,但我无法理解它
// 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);
a
和 b
是一些 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?
若a
与b
符号相反,则a
只能小于b
且a
为负数
用伪代码表示:
if (a[31] XOR b[31]) {
result = a[31]
}
如果a
和b
符号相同,那么显然我们不能只看其中一个操作数的符号位。相反,我们检查 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,所以不行。