use*_*435 3 cpu verilog mips 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);
Run Code Online (Sandbox Code Playgroud)
a是b一些 32 位数字
该代码试图实现(a < b) ? 1 : 0;在 mips 中被称为 slt
该yArith部分正在执行 (ab) 并将结果放入 中tmp,1 是减法标志。
该yMux部分是 2x1 多路复用器,需要一些条件(0 或 1)来选择tmp[31]条件为 0 或a[31]条件为 1。
为什么这段代码可以在 Verilog 中实现小于设置?
如果a和b具有相反的符号,则a只能小于bifa为负数。
用伪代码表示:
if (a[31] XOR b[31]) {
result = a[31]
}
Run Code Online (Sandbox Code Playgroud)
如果a和b具有相同的符号,那么显然我们不能只看其中一个操作数的符号位。相反,我们检查是否a-b为负。
if (!(a[31] XOR b[31])) {
result = (a-b)[31]
}
Run Code Online (Sandbox Code Playgroud)
如果我们将这两者结合起来:
if (a[31] XOR b[31]) {
result = a[31]
} else {
result = (a-b)[31]
}
Run Code Online (Sandbox Code Playgroud)
如果您想知道为什么我们不总是使用,请考虑(0x80000000) 和 的(a-b)[31]情况。显然 -2147483648 小于 1,但==为 0。所以这是行不通的。a = -2147483648b = 1(0x80000000-1)[31](0x7FFFFFFF)[31]
| 归档时间: |
|
| 查看次数: |
2839 次 |
| 最近记录: |