В чем разница между этими двумя счетчиками? - PullRequest
2 голосов
/ 16 июня 2020

В чем разница между этими двумя операторами, если они находятся внутри always_ff @(posedge clk)

if(~Intf.DataFull) begin
   rWrPageCntr                <= rWrPageCntr - 1;
end

vs

rWrPageCntr               <= rWrPageCntr - ~Intf.DataFull;

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Помимо функциональных различий, пример с условием включения позволяет инструменту выполнять синхронизацию. Другой пример потребует дополнительных logi c, что приведет к увеличению площади и энергопотребления.

0 голосов
/ 17 июня 2020

При следующих предположениях существует большая разница:

module tb;

bit DataFull, clk;
bit [2:0] rWrPageCntr;
bit [2:0] rWrPageCntr2;

always #5 clk++;

always_ff @(posedge clk)
    if(~DataFull) begin
        rWrPageCntr <= rWrPageCntr - 1;
    end

always_ff @(posedge clk)
        rWrPageCntr2 <= rWrPageCntr2 - ~DataFull;

always @(negedge clk) $display("full=%b %d %d", DataFull, rWrPageCntr, rWrPageCntr2);

initial begin
    DataFull = 1;
    #150;
    DataFull = 0;
    #150 $finish;
end

endmodule

Выводы:

full=1 0 2
full=1 0 4
full=1 0 6
full=1 0 0
full=1 0 2
full=1 0 4
full=1 0 6
full=1 0 0
full=1 0 2
full=1 0 4
full=1 0 6
full=1 0 0
full=1 0 2
full=1 0 4
full=0 0 6
full=0 7 7
full=0 6 0
full=0 5 1
full=0 4 2
full=0 3 3
full=0 2 4
full=0 1 5
full=0 0 6
full=0 7 7
full=0 6 0
full=0 5 1
full=0 4 2
full=0 3 3
full=0 2 4

Первый пример ведет себя так, как и следовало ожидать, но второй пример больше сложный.

Во втором примере перед вычитанием DataFull будет расширено до 3 бит, затем оно будет побитовое инвертирование, давая 7 и 6. Когда DataFull = 0, ~DataFull = 7. Когда DataFull = 1, ~DataFull = 6.

...