Я пытаюсь понять тонкую деталь семантики оператора >> в Verilog.Я не нашел ничего релевантного в LRM или любом другом онлайновом справочном / учебном материале.
В качестве примера, предположим, что я хочу преобразовать двоичный код в код Грея и обратно.Для двоичного кода в серый это довольно просто:
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);
Однако движение в противоположном направлении немного другое.Это включает в себя отношение повторения, в котором вычисление каждого бита основывается на предыдущем результате:
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);
Очевидно, что это никогда не сработает ни на одном языке программирования.Но для меня, как для разработчика аппаратного обеспечения, все они в точности соответствуют аппаратным соединениям, которые они описывают.Но каким образом инструменты моделирования и синтеза будут интерпретировать это?
Я собираюсь уйти и попробовать несколько симуляторов, чтобы посмотреть, что произойдет, но я был бы признателен за указатель на окончательную ссылку - даже если она заканчиваетсябудучи «неопределенным» или «зависящим от реализации».
Цифры заимствованы из здесь