Могу ли я назначить 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

person subh    schedule 13.07.2018    source источник
comment
Я пробовал это на 4 симуляторах. 3 вернуть 0; 1 возвращает X. Я не знаю, что правильно: LRM дает пример с использованием типа logic, но не типа bit, насколько я вижу.   -  person Matthew Taylor    schedule 13.07.2018
comment
Я говорю, что не знаю, как правильно, потому что в LRM это кажется неясным (но я не читал все 1275 страниц!). Я учу, что индекс вне допустимого диапазона в массиве возвращает значение по умолчанию для типа, делая 0 правильным, а X неверным.   -  person Matthew Taylor    schedule 13.07.2018


Ответы (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] б; // --> r2 = 00 b[3:2] = 00

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

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

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

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

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

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

person sharvil111    schedule 13.07.2018