12

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

D

4

2 回答 2

12

(^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
于 2013-07-01T20:34:52.543 回答
11

您可以使用$isunknown(参考 IEEE Std 1800-2017, section 20.9 Bit vector system functions):

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.

于 2013-07-01T20:33:30.117 回答