作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图理解这段代码,但我无法理解它
// 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 mux,它需要一些条件(0 或 1)来选择 tmp[31]
如果条件为 0 或 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。所以那行不通.
关于Verilog 实现 a<b ? 1 : 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53419259/
我是一名优秀的程序员,十分优秀!