Вывод арбитра нестабилен

Я только что узнал об этой проблеме.

Предположим, я использую арбитр для арбитража вывода драйвера шины от нескольких инициаторов параллельных транзакций. Шина и инициаторы используют DecoupledIO. Известно, что Арбитр имеет приоритет в (0) над (1). Учитывая этот случай:

clock 1: in(0).valid = 0, in(1).valid = 1  -> out === in(1) out.valid = 1  out.ready = 0
clock 2: in(1).valid = 1, in(1).valid = 1  -> out === in(0) out.valid = 1  out.ready = 1

Таким образом, и часы 1, и часы 2 имеют bus.valid === 1 Если клиент на этой шине не может ответить в том же цикле, но в следующем цикле, out.ready, управляемый этим клиентом, фактически соответствует in(1), а НЕ in( 0) в часах 2.

Я ожидаю, что арбитр выберет in(0), если in(0) и in(1) станут действительными в один и тот же такт, но если in(1) становится действительным до in(0), арбитр продолжает выбирать in(1) ) до тех пор, пока не сработает in(1).

В этом случае LockingArbiter, RRArbiter ведут себя одинаково: ввод с более высоким приоритетом всегда может вытеснить ввод с более низким приоритетом до того, как ввод с более низким приоритетом будет заблокирован (когда count == 1, блокировки вообще нет).

Я как бы рассматриваю этот нестабильный вывод как проблему, похожую на ошибку Арбитра. Есть ли обходной путь для этого?


person Wei Song    schedule 25.08.2015    source источник
comment
Вы можете использовать LockingArbiter с аргументом needLock. Arbiter на самом деле является подклассом LockingArbiter, в котором needLock имеет значение None и count=1.   -  person ɹɐʎɯɐʞ    schedule 25.08.2015
comment
Прочитав ваш вопрос еще раз, я понял, что я не совсем понял вопрос! Почему вы ожидаете, что арбитр будет продолжать выбирать в (1)? in(0) имеет более высокий приоритет, и его необходимо обслуживать всякий раз, когда он становится действительным. Вот как я думал, что приоритетный арбитр должен вести себя в любом случае. Может, вам действительно нужен RR-арбитраж (Chisel.RRArbiter)?   -  person ɹɐʎɯɐʞ    schedule 25.08.2015
comment
Если вы видите определение Arbiter, это уже LockingArbiter(gen, n, 1, None). RRArbiter тоже не помогает. Арбитр дает (0) наивысший приоритет, RRArbiter дает входу, следующему за последним заблокированным входом, наивысший приоритет. Поэтому, если вход с более низким приоритетом действителен перед входом с наивысшим приоритетом, самый высокий всегда может его вытеснить.   -  person Wei Song    schedule 26.08.2015


Ответы (1)


Параметр «needsHold» добавляется ко всем арбитрам, чтобы включить это требование удержания. Эта функция отключена по умолчанию. Это включено в Chisel фиксацией 18ecaf8de4a5.

person Wei Song    schedule 12.04.2016