Как я могу сгенерировать 2 такта в тестовой среде с помощью systemverilog?

Мне нужно 2 тактовых генератора, работающих на разных частотах. Я пытался:

forever
begin
 #5ns clk1=~clk1;
 #4ns clk2=~clk2;
end

С этим кодом clk2 будет генерироваться после того, как clk1 будет завершено, но они не будут генерироваться одновременно.

Как я могу написать код Verilog, чтобы гарантировать, что два тактовых генератора (clk1 и clk2) будут генерироваться одновременно?


person user2908111    schedule 22.10.2013    source источник


Ответы (3)


Один из способов - использовать 2 отдельных блока intital:

module tb;
    bit clk1, clk2;
    initial forever #5ns clk1 = ~clk1;
    initial forever #4ns clk2 = ~clk2;
endmodule

Другой способ - использовать один блок intital с _4 _ / _ 5_ вместо _6 _ / _ 7_.

person toolic    schedule 22.10.2013

Операторы в блоке begin / end оцениваются последовательно. Вам нужно создать два forever блока, чтобы они работали параллельно.

forever begin
  #5ns clk1 = ~clk1;
end

forever begin
  #4ns clk2 = ~clk2;
end
person dwikle    schedule 22.10.2013

Попробуйте использовать неблокирующее назначение

forever
begin
 #5ns clk1 <= ~clk1;
 #4ns clk2 <= ~clk2;
end
person DOS    schedule 22.10.2013
comment
Я был удивлен, узнав, что это работает (внутри блока initial). Это умно, но я бы не рекомендовал его использовать, потому что это не так просто, как 2 начальных блока или fork-join. - person toolic; 23.10.2013