Verilog реализует - PullRequest
       56

Verilog реализует

0 голосов
/ 21 ноября 2018

Я пытаюсь понять этот код и не могу обернуться вокруг него

// 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; Что известно как slt в mips

часть yArith выполняет (ab) и помещает результат в tmp, 1 - флаг для вычитания.

часть yMux имеет формат 2x1 mux, для которого требуется некоторое условие (0 или 1), чтобы выбрать либо tmp[31], если условие 0, либо a[31], если условие 1.

Почему этот код работаетреализовать набор на меньше чем в Verilog?

1 Ответ

0 голосов
/ 21 ноября 2018

Если 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. Так что это не сработает.

...