class clockGenerator;
logic wclk,rclk;
int period;
virtual fifoPorts itf;
event wclkKill,rclkKill;
function new (virtual fifoPorts itf);
this.itf=itf;
endfunction
task automatic clkActivate (input string clkName);
if (clkName=="wclk") begin
$display ("%0t:INFO:CAlling task wclkActivate",$time);
this.itf.wclk=1'b0;//将当前对象的接口中的wclk赋值为逻辑0
fork :clockGen//创建一个并行执行的分支clockGen
wait (this.wclk.triggered) begin:killclock
$display ("%0t INFO:KIlling the clk",$time);
end:killclock
forever begin :startclock
#this.period this.itf.wclk++;
end :startclock
join_any:clkGen
disable fork;
end
else begin
$display("%0t:INFO:Calling task rclkActivate",$time);
this.itf.rclk=1'b0;
fork:clkGen2
wait (this.rclkKill.triiggerrd) begin :killclock
$display ("%0t:INFO:KIlling the clk",$time);
end:killclock
forever begin:startclock
#this.period this.itf.rclk++;
end:startclock
join_any
end
endtask
task automatic clkGenerator (input string clkName,input int wclkPeriod);
$display("%0t:INFO:Calling task clkGenerator for %s",$time,clkName);
this.period=wclkPeriod/2;
fork
clkActivate(clkName);
join_none
endtask
task clkStop (input string clkName);
$display("%0t:INFO:Stopping clock %s",$time,clkName);
if (clkName=="wclk")
->wclkKill;
else
->rlkKill;
endtask
endclass
class clockGenerator;
logic wclk, rclk; // 逻辑信号 wclk 和 rclk,用于表示时钟信号
int period; // 时钟周期
virtual fifoPorts itf; // 虚拟接口 fifoPorts
event wclkKill, rclkKill; // 事件 wclkKill 和 rclkKill,用于控制时钟停止
function new(virtual fifoPorts itf);
this.itf = itf; // 构造函数,初始化虚拟接口
endfunction
task automatic clkActivate(input string clkName);
if (clkName == "wclk") begin
$display("%0t:INFO:Calling task wclkActivate", $time); // 显示调用信息
this.itf.wclk = 1'b0; // 将当前对象的接口中的wclk赋值为逻辑0
fork :clockGen // 创建一个并行执行的分支clockGen
wait (this.wclk.triggered) begin :killclock
$display("%0t INFO:KIlling the clk", $time); // 显示时钟停止信息
end :killclock
forever begin :startclock
#this.period this.itf.wclk++; // 以指定周期增加 wclk 信号
end :startclock
join_any :clkGen
disable fork; // 禁用并行分支
end
else begin
$display("%0t:INFO:Calling task rclkActivate", $time); // 显示调用信息
this.itf.rclk = 1'b0; // 设定 rclk 信号初始值
fork :clkGen2 // 创建第二个并行执行的分支clkGen2
wait (this.rclkKill.triggered) begin :killclock
$display("%0t:INFO:KIlling the clk", $time); // 显示时钟停止信息
end :killclock
forever begin :startclock
#this.period this.itf.rclk++; // 以指定周期增加 rclk 信号
end :startclock
join_any;
end
endtask
task automatic clkGenerator(input string clkName, input int wclkPeriod);
$display("%0t:INFO:Calling task clkGenerator for %s", $time, clkName); // 显示调用信息
this.period = wclkPeriod / 2; // 计算时钟周期
fork
clkActivate(clkName); // 调用时钟激活任务
join_none;
endtask
task clkStop(input string clkName);
$display("%0t:INFO:Stopping clock %s", $time, clkName); // 显示时钟停止信息
if (clkName == "wclk")
->wclkKill; // 触发 wclkKill 事件
else
->rclkKill; // 触发 rclkKill 事件
endtask
endclass