【问题标题】:What's the best way to tell if a bus contains a single x in verilog?判断总线是否在 verilog 中包含单个 x 的最佳方法是什么?
【发布时间】:2013-07-01 20:23:49
【问题描述】:

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

D

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    (^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
    

    【讨论】:

    • 按位异或将检查整个总线,但不会说明 X 或 Z 存在于总线的哪个位置。如果您不想知道 X 或 Z 的位置,这很有用。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 2021-03-20
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      相关资源
      最近更新 更多