Как программный блок управляет выводом часов в этом коде? - PullRequest
1 голос
/ 27 апреля 2020

Это простая SV-программа (я знаю, что арбитр гораздо сложнее, извините, я назвал его одним), но я не знаю, как строка repeat(4) @ar.cb; контролирует все часы, т.е. если я комментирую вне этой строки часы останавливаются, хотя я поместил их в блок «всегда» внутри верхнего модуля. Кажется, я не понимаю, как это работает.

testbench.sv

interface arb_if(input bit clk);
    logic [1:0] request;
    logic [1:0] grant;
    logic reset;
    clocking cb @(posedge clk);
        output request;
        input grant;
    endclocking

    modport DUT(input request,clk,reset,output grant);
    modport TB(clocking cb,output reset); endinterface

program automatic test(arb_if.TB ar);
    initial begin
        ar.reset <= 1;
        ar.cb.request<=$urandom;
        $display("[%0t]Request is sent",$time);
        repeat(4) @ar.cb;
        $display("[%0t]Grant=%0d",$time,ar.cb.grant);
    end endprogram

module top;
    bit clk;
    always #5 clk=~clk;
    arb_if arb(clk);
    test tb(arb);
    arbit a1(arb,clk); endmodule

design.sv

module arbit(arb_if.DUT arbiter,input bit clk);   always @(posedge clk)
      if(arbiter.reset==0)
        arbiter.grant<=2'bxx;
      else
        #1 arbiter.grant<=arbiter.request; 
endmodule

И в проекте грант не назначается до следующего цикла, даже если я использую блокирующее назначение (если я не даю #1, в этом случае это происходит, конечно, после задержки).

Я борюсь с пониманием синхронизации синхронных цепей, было бы очень полезно, если бы кто-то мог прояснить это для меня. Заранее спасибо!

Форма волны:

Без # 1

С # 1

1 Ответ

2 голосов
/ 27 апреля 2020

program завершает моделирование.

Из IEEE Std 1800-2017, раздел 24.3 Программная конструкция :

Когда все начальные процедуры в программа достигла своего конца, эта программа должна немедленно прекратить все нисходящие потоки начальных процедур в этой программе. Если в хотя бы одном программном блоке есть хотя бы одна начальная процедура, то все моделирование должно завершаться посредством неявного вызова системной задачи $ finish сразу после всех потоков и всех их дочерних потоков, происходящих из всех начальных процедур во всех программах. закончились.

С оператором repeat моделирование заканчивается в момент времени 35. Он ожидает 4 положительных фронта clk, затем неявно вызывает $finish.

Без оператора repeat моделирование заканчивается в момент времени 0. Он не ожидает каких-либо ребер clk, а затем неявно вызывает $finish.

...