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