两者之间有区别吗?
我刚刚从 if(rdy)
到 if(rdy == 1)
在项目的一些代码中,突然间输出的行为完全不同。
假设 rdy
是一个1位 reg
Verilog中的数据类型。
reg rdy;
if (rdy) <---> if (rdy!=1'b0)
if (rdy==1) <---> if (rdy==1'b1)
对于合成来说,它们的工作原理可能是一样的。但要注意如果 rdy
有1个以上的位。
reg[7:0] rdy;
if (rdy) <---> if (rdy!=8'b00000000)
if (rdy==1) <---> if (rdy==8'b00000001)
第一个可能是用8个输入来合成的。OR
门,而第二种则需要一个7输入的 NOR
门和一个2输入 AND
门。
两者之间没有区别。
reg
是4态的。0,1,x,z. 只有当... rdy
是1将 if
条件为真,否则为假。
module tb;
reg rdy;
always @(rdy) begin
if (rdy) begin
$display($time, " rdy=%b if (rdy) TRUE", rdy);
end else begin
$display($time, " rdy=%b if (rdy) FALSE", rdy);
end
if (rdy==1) begin
$display($time, " rdy=%b if (rdy==1) TRUE", rdy);
end else begin
$display($time, " rdy=%b if (rdy==1) FALSE", rdy);
end
$display;
end
initial begin
#5 rdy = 1'b1;
#5 rdy = 1'bx;
#5 rdy = 1'bz;
#5 rdy = 1'b0;
end
endmodule
输出。
5 rdy=1 if (rdy) TRUE
5 rdy=1 if (rdy==1) TRUE
10 rdy=x if (rdy) FALSE
10 rdy=x if (rdy==1) FALSE
15 rdy=z if (rdy) FALSE
15 rdy=z if (rdy==1) FALSE
20 rdy=0 if (rdy) FALSE
20 rdy=0 if (rdy==1) FALSE