verilog中if(rdy)和if(rdy == 1)之间的区别?

时间:2013-12-08 02:38:14

标签: syntax verilog hdl

这两者有区别吗? 在项目的某些代码中,我刚刚从if(rdy)更改为if(rdy == 1),突然输出的行为完全不同。

假设rdy是verilog中的1位reg数据类型。

2 个答案:

答案 0 :(得分:1)

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门。

答案 1 :(得分:0)

两者之间没有区别。

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