我正在尝试理解这一点代码,我无法将其包裹住
// 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,则需要某种条件(0或1)来选择tmp[31]
,如果条件是1,则选择a[31]
。
为什么此代码可以在少于Verilog的环境中实现set?
答案 0 :(得分:3)
如果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。所以这是行不通的。