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