我正在尝试理解这段代码,但我无法理解它

// 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], tm,verilog,mips,cpu,riscv"/>
	














首页 > 解决方案 > Verilog 实现一个

我正在尝试理解这段代码,但我无法理解它

// 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], tm

问题描述

我正在尝试理解这段代码,但我无法理解它

// 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部分正在执行 (ab) 并将结果放入tmp, 1 是减法标志。

yMux部分是 2x1 多路复用器,需要一些条件(0 或 1)来选择tmp[31]条件为 0 或a[31]条件为 1。

为什么这段代码比在 Verilog 中实现 set on less 有效?


正则表达式通过删除部分 URL 来重定向 URL

我对 Wordpress 网站做了一些更改,一些 URL 过去采用以下格式: domain.com/question-sample-url 我想使用 Yoast 的正则表达式重定向将所有这些域重定向到:( domain.com/sample-url没有问题-)

现在,我已经能够使用以短语开头的正则表达式然后 * 将 URL 重定向到默认 URL。但是,现在我只需要删除该短语的一部分。谢谢

标签: verilogmipscpuriscv

解决方案


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


推荐阅读