Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Verilog实现a<;B1 : 0_Verilog_Mips_Cpu_Riscv - Fatal编程技术网

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位整数一样。