Verilog实现a<;B1 : 0
我试图理解这段代码,但我无法理解它Verilog实现a<;B1 : 0,verilog,mips,cpu,riscv,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); a和b是一些32位的数字 代码正在尝试实现(a,请考虑 A= -2147483648 (0x8
// 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在mips中称为slt
yArith
部件正在执行(a-b)并将结果放入tmp
,1是减法的标志
yMux
部分是2x1 mux,如果条件为0,则需要一些条件(0或1)来选择tmp[31]
,如果条件为1,则选择a[31]
为什么该代码在Verilog中实现小于的set?如果a
和b
有相反的符号,那么a
只能小于b
如果a
为负值
if (!(a[31] XOR b[31])) {
result = (a-b)[31]
}
以伪代码表示:
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]
}
如果您想知道为什么我们不总是使用<代码>(AB)[31 ] < /代码>,请考虑<代码> A= -2147483648 (0x8000)和<代码> B=1 < /代码>的情况。显然-2147483648小于1,但
(0x8000000-1)[31]
==(0x7FFFFFFF)[31]
,即0。所以那是行不通的。(a
和(a
,仅供参考。那么异或的意义是什么?它似乎处理a
和b
,就好像它们是2s补码形式的有符号32位整数一样。