2013-07-01 7 views
6

Mam stanowisko testowe, które monitoruje autobus. Niektóre sygnały w magistrali mogą wynosić 1'bx. Z różnych powodów muszę wiedzieć, czy którykolwiek z sygnałów w autobusie wynosi 1'bx. Jaki jest najlepszy sposób na testowanie (nie do syntezy - tylko do celów symulacji), jeśli autobus zawiera jakieś x? Miałem nadzieję, że mogę użyć redukcji lub, a następnie użyć ===, ale to nie działa. Dzięki,Jaki jest najlepszy sposób, aby stwierdzić, czy autobus zawiera jedno x w verilog?

D

+0

Dlaczego to pytanie zostało odrzucone na głosowanie? – Doov

Odpowiedz

7

(^bus === 1'bX)

bitową xor autobus następnie sprawdzić, czy wynik jest X. Jeżeli którykolwiek bit jest X lub Z, to wynik będzie X.

Aby wiedzieć, które nieco w autobusie ma błąd:

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 
+0

Ah, rozumiem. Lubię to. Dzięki! – Doov

+0

Bitowy xor sprawdzi całą magistralę, ale nie powie, gdzie w magistrali X lub Z istnieje. Jest to przydatne, jeśli nie zależy ci na lokalizacji X lub Z. – Greg

5

Można użyć $isunknown (wprowadzone w IEEE Std 1800-2005):

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 

*/ 

Zauważ, że ten traktuje również z jak x.

+1

bitowy "lub" nie wykryje X, jeśli jakikolwiek bit jest 1 – Greg

+0

@Greg: Masz rację. Zmodyfikowałem swoją odpowiedź. Szkoda, że ​​PO nie dostarczył pewnych danych wejściowych. – toolic

+0

Redukcja lub działa, jeśli nie mieszałeś 1s i xs. Jeśli spróbujesz czegoś takiego jak 4'b010x, to się nie uda. – Doov