Могу ли я назначить 2 состояния из связанных битов доступа к 4 переменным состояния?

Должно ли это привести к x или 0 и, таким образом, результат будет полностью x или 0? Точность. к LRM, если мы получим доступ к 2 переменным состояния вне границ, тогда это должно быть 0. Правильно ли присвоить 0 для r2.

module top;
    reg [1:0] r;
    bit [1:0] b;

    assign  r2= b[2:1] + b[3:2]; 
    initial begin
       $monitor(r2);
    end
endmodule

1 ответ

Чтение из IEEE 1800-2012 Раздел 11.5.1:

Бит может быть адресован с использованием выражения, которое должно оцениваться в самоопределенном контексте. Если адрес битовой выборки недействителен (он выходит за границы или имеет один или несколько битов x или z), то значение, возвращаемое ссылкой, должно быть x для 4 состояний и 0 для значений 2 состояний. Выбор битов или частичный выбор скаляра или реальной переменной или реального параметра должны быть недопустимыми.

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

В руководстве по миграции VCS 2017 также есть исправления ошибок для выбора битов для параметров. Я опробовал следующий код и нашел удовлетворительные результаты с последним симулятором:

module top;
    reg [1:0] r2;
    bit [1:0] b;

    assign  r2= b[2:1] + b[3:2]; 
    initial begin
      b = 1;
      #1;
      $display("r2 = %b b[3:2] = %b", r2,b[3:2]);
    end

endmodule

Обратите внимание, что пример запускается на разных версиях симулятора. Другие симуляторы могут вести себя по-другому.

Выход VCS 2017:

бит [1:0] r2; бит [1:0] b; // -> r2 = 00 b[3:2] = 00

рег [1:0] r2; бит [1:0] b; // -> r2 = 00 b[3:2] = 00. В VCS 2014 возникла ошибка, когда он решает это уравнение со значением 4 состояния.

бит [1:0] r2; рег [1: 0] б; // -> r2 = 00 b[3:2] = xx. Здесь х оптимизируется до значения по умолчанию бит.

рег [1:0] r2; рег [1: 0] б; // -> r2 = xx b[3:2] = xx

Обратите внимание, что результат всегда ожидается как "x", когда мы используем part-select как "x".

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

Вышеприведенный снова из того же раздела от LRM.

Другие вопросы по тегам