Постоянное заполнение в Verilog

Вот пример рассматриваемого поведенческого кода Verilog

module constant;
    reg [7:0] foo;
    initial begin
        foo = 1'bz;
        $display("%H", foo);
    end
endmodule

Икар Верилог дал мне

$ iverilog -o constant constant.v
$ ./constant
0Z

Однако, согласно этому веб-сайту (и лектору курса FPGA, который я беру) ,

Если число меньше константы размера, оно будет дополнено нулями слева. Если самый значимый бит указанного числа имеет неизвестное (x) или высокоимпедансное (z) значение, то это значение будет использоваться для дополнения влево.

В этом случае вывод должен быть ZZ вместо 0Z. Я почти уверен, что это связано с изменением спецификации (возможно, это ZZ в Verilog 1995 и 0Z в Verilog 2001, или что-то еще), но какие стандарты приводят к каждому поведению? Я попытался найти спецификацию в Интернете, но, похоже, они не доступны в свободном доступе, например этот, который требует покупки или подписки.

В качестве бонуса, где я могу найти сводку изменений в различных спецификациях Verilog?


person nalzok    schedule 20.04.2020    source источник


Ответы (2)


SystemVerilog IEEE 1800-2017 говорит:

Если размер беззнакового числа меньше размера, указанного для литеральной константы, беззнаковое число должно быть дополнено слева нулями. Если крайний левый бит в беззнаковом числе представляет собой x или z, то x или z должны использоваться для заполнения слева, соответственно. Если размер беззнакового числа больше, чем размер, указанный для литеральной константы, беззнаковое число должно быть усечено слева.

Однако здесь число не меньше константы размера - размер здесь «1» в 1'bz.

Что касается преобразования результатов выражений, стандарт гласит:

Автоматическое преобразование типа из меньшего количества битов в большее количество битов включает нулевые расширения, если без знака, или расширения знака, если они подписаны. Автоматическое преобразование типов из большего количества битов в меньшее количество битов включает усечение наиболее значимых битов (MSB).

Поскольку это беззнаковое выражение и результат, литеральное выражение 1'bz затем расширяется нулем, чтобы соответствовать 8-битному размеру foo.

IEEE 1800-2017 можно бесплатно загрузить с веб-сайта IEEE.

person gatecat    schedule 20.04.2020

Я считаю, что вы не понимаете, что происходит с числовыми литералами (например, 8'bz) по сравнению со значениями в выражении. Числовые литералы заполнят указанные z или z до указанной ширины. Но однажды в выражении беззнаковые значения дополняются 0, а подписанные значения дополняются, как сказал ваш лектор.

Необходимо приобрести только последнюю версию стандарта IEEE, более раннюю версию. На этом веб-сайте показаны последние изменения в стандарте SystemVerilog.

person dave_59    schedule 20.04.2020
comment
Просто любопытно, считается ли SystemVerilog последней версией Verilog или это отдельные языки? - person nalzok; 20.04.2020
comment
Да, IEEE 1800-2009 заменяет IEEE 1364-2005. За исключением новых ключевых слов и исправлений, SystemVerilog полностью обратно совместим с более ранними версиями Verilog. - person dave_59; 20.04.2020