clockGenerator.sv

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C4HCS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值