group-telegram.com/enginegger/63
Create:
Last Update:
Last Update:
По поводу соблюдения стандартов. Не первый раз замечаю, что iverilog строже следует стандартам, чем другие симуляторы. Вот ещё один пример - присвоение значения enum'у.
Вот такой код не проходит компиляцию в iverilog, тогда как verilator и modelsim/questa не выдают ни ошибок ни предупреждений:
typedef enum {
ST_ONE,
ST_ZERO
} state_t;
state_t state;
logic a;
always_comb
state = a ? ST_ONE : ST_ZERO;
Ошибка состоит в том, что переменной
state
потенциально может быть присвоено значение X, потому что тернарный оператор "пропускает" иксы из условия на выход (такое поведение называется X-pessimism). Но иксы не являются допустимым значением для типа state_t
. Согласно стандарту (раздел 6.19.3) такая ситуация является ошибкой.Есть два очевидных пути исправления:
1. Использовать
if/else
, т.к. это X-оптимистичный оператор2. Явно привести тип тернарного выражения к
state_t
Менее очевидное решение - использовать тип
bit
для сигнала a
. Этот тип не может принимать неопределенного значения, по этому и нарушений при присвоении перечислению не будет.А вот с верилятором "не всё так однозначно" - у него же в принципе нет иксов, по этому стандарт он как бы и не нарушает вовсе :)
BY Arnold Enginegger
Warning: Undefined variable $i in /var/www/group-telegram/post.php on line 260
Share with your friend now:
group-telegram.com/enginegger/63