Это простая 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