什么是判断总线是否包含单个x verilog的最佳方法?

时间:2013-07-01 20:23:49

标签: verilog

我有一个监控公交车的测试台。总线内的一些信号可以是1'bx。由于各种原因,我需要知道总线内的任何信号是否为1'bx。如果总线包含任何x,那么测试的最佳方法是什么(不是用于综合 - 仅用于模拟目的)?我原本希望我可以使用减少或然后使用===,但这似乎不起作用。谢谢,

d

2 个答案:

答案 0 :(得分:9)

(^bus === 1'bX)

按位xor总线然后检查结果是否为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

答案 1 :(得分:6)

您可以使用$isunknown(在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

*/

请注意,这也会将z视为x