Разница между if(rdy) и if(rdy == 1)?

Есть ли разница между ними?

Я только что изменил if(rdy) на if(rdy == 1) в каком-то коде для проекта, и внезапно вывод ведет себя совершенно по-другому.

Предполагается, что rdy является 1-битным типом данных reg в Verilog.


person user3079006    schedule 08.12.2013    source источник
comment
Это вполне может быть так, я буду исследовать это немного дальше. Однако это может раздуть этот вопрос до невозможности, но при синтезе и загрузке на целевое устройство reg может быть только 1 или 0?   -  person user3079006    schedule 08.12.2013


Ответы (2)


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)

Первый, вероятно, будет синтезирован с использованием вентиля OR с 8 входами, а для второго потребуется вентиль NOR с 7 входами и вентиль AND с 2 входами.

person mcleod_ideafix    schedule 08.12.2013

Между ними нет никакой разницы.

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
person toolic    schedule 12.06.2020