Семантика Verilog >> оператор применяется к сетям - PullRequest
1 голос
/ 03 июня 2019

Я пытаюсь понять тонкую деталь семантики оператора >> в Verilog.Я не нашел ничего релевантного в LRM или любом другом онлайновом справочном / учебном материале.

В качестве примера, предположим, что я хочу преобразовать двоичный код в код Грея и обратно.Для двоичного кода в серый это довольно просто:

binary to gray logic

wire [3:0] bin;
wire [3:0] gray;

assign gray[3] =          bin[3];
assign gray[2] = bin[3] ^ bin[2];
assign gray[1] = bin[2] ^ bin[1];
assign gray[0] = bin[1] ^ bin[0];

Конечно, назначения можно уменьшить до

assign gray = bin ^ {1'b0, bin[3:1]};

Или даже просто

assign gray = bin ^ (bin >> 1);

Однако движение в противоположном направлении немного другое.Это включает в себя отношение повторения, в котором вычисление каждого бита основывается на предыдущем результате:

gray to binary logic

assign bin[3] =          gray[3];
assign bin[2] = bin[3] ^ gray[2];
assign bin[1] = bin[2] ^ gray[1];
assign bin[0] = bin[1] ^ gray[0];

Я могу записать это как

assign bin = gray ^ {1'b0, bin[3:1]};

Но могу ли я сделать последний шаг и написать

assign bin = gray ^ (bin >> 1);

Очевидно, что это никогда не сработает ни на одном языке программирования.Но для меня, как для разработчика аппаратного обеспечения, все они в точности соответствуют аппаратным соединениям, которые они описывают.Но каким образом инструменты моделирования и синтеза будут интерпретировать это?

Я собираюсь уйти и попробовать несколько симуляторов, чтобы посмотреть, что произойдет, но я был бы признателен за указатель на окончательную ссылку - даже если она заканчиваетсябудучи «неопределенным» или «зависящим от реализации».


Цифры заимствованы из здесь

1 Ответ

0 голосов
/ 03 июня 2019

Это должно работать в симуляции и синтезе. Рекурсия хороша, пока существует статически детерминированное количество рекурсий.

...