Как лучше всего узнать, содержит ли шина один x в Verilog?

У меня есть тестовый стенд, который следит за автобусом. Некоторые сигналы внутри шины могут быть 1'bx. По разным причинам мне нужно знать, имеет ли какой-либо из сигналов на шине значение 1'bx. Как лучше всего проверить (не для синтеза - только для целей моделирования), содержит ли шина какие-либо x? Я надеялся, что смогу использовать сокращение или затем использовать ===, но это, похоже, не работает. Спасибо,

D


person Doov    schedule 01.07.2013    source источник


Ответы (2)


(^bus === 1'bX)

Побитовое сканирование шины, затем проверьте, является ли результат X. Если какой-либо бит равен X или Z, то результатом будет X.

Чтобы узнать, какой бит на шине имеет ошибку:

always @* begin
  for(integer i=0; i<$size(bus); i++) begin
     if(bus[i]===1'bX) $display("bus[%0d] is X",bus[i]);
     if(bus[i]===1'bZ) $display("bus[%0d] is Z",bus[i]);
  end
end
person Greg    schedule 01.07.2013
comment
Поразрядный xor проверит всю шину, но не скажет, где в шине находятся X или Z. Это полезно, если вам не нужно знать расположение X или Z. - person Greg; 02.07.2013

Вы можете использовать $isunknown (см. IEEE Std 1800-2017, раздел 20.9 Системные функции битовых векторов):

module tb;

reg [3:0] data;

initial begin
    #5 data = 4'b0101;
    #5 data = 4'b000x;
    #5 data = 4'b1111;
    #5 data = 4'b0x0x;
    #5 data = 4'b0x1x;
    #5 data = 4'bzzzz;
    #5 $finish;
end

always @(data) begin
    if ($isunknown(data)) $display($time, " data=%b has x's", data);
end

endmodule

Выходы:

                  10 data=000x has x's
                  20 data=0x0x has x's
                  25 data=0x1x has x's
                  30 data=zzzz has x's

Обратите внимание, что это также рассматривает z как x.

person toolic    schedule 01.07.2013