Verilog实现了<b?=“” 1 =“”:=“” 0 =“”

时间:2018-11-21 19:27:21

标签: verilog mips cpu riscv

=“”

我正在尝试理解这一点代码,我无法将其包裹住

// 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,则需要某种条件(0或1)来选择tmp[31],如果条件是1,则选择a[31]

为什么此代码可以在少于Verilog的环境中实现set?

1 个答案:

答案 0 :(得分:3)

如果ab的符号相反,那么如果a为负,则b只能小于a

以伪代码表示:

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。所以这是行不通的。