resetGenerator.sv

文章描述了一个名为resetGenerator的类,用于生成读复位(rrst)和写复位(wrst)信号,根据输入的名称和周期长度,通过逻辑操作控制复位信号的激活和释放,同时初始化FIFO接口变量。
class resetGenerator;
    // 定义名为 resetGenerator 的类

    logic rrst,wrst;
    // 声明两个逻辑类型(logic type)的变量 rrst 和 wrst,分别表示读复位和写复位信号

    int period;
    // 声明一个整型变量 period,表示复位信号的周期长度(in clock ticks)

    virtual fifoPorts itf;
    // 声明一个虚拟接口变量 itf,用于与 FIFO 数据结构进行交互

    event rrstKill,wrstKill;
    // 使用 event 类型的变量声明两个事件,分别用于停止读复位和写复位信号

    function new (virtual fifoPorts itf);
        // 定义任务 new,用于初始化对象
        this.itf=itf;
        // 将 itf 参数赋值给类成员变量
    endfunction

    task automatic rstActivate (input string rstName);
        // 定义任务 rstActivate,用于激活复位信号
        if (rstName=="rrst") begin
            // 如果 rstName 等于 "rrst",则表示激活读复位信号
            $display("%0t:INFO:Calling task rrstActivate",$time);
            // 在控制台打印调试信息
            this.itf.rrst_n=1'b1;
            // 设置读复位信号为高电平
            repeat (this.period) @(posedge this.itf.rclk);
            // 等待周期结束,并等待下一个读时钟上升沿
            this.itf.rrst_n=1'b0;
            // 设置读复位信号为低电平
            repeat(this.period) @(posedge this.itf.rclk);
            // 等待下一个周期结束,并等待下一个读时钟上升沿
            this.itf.rrst_n=1'b1;
            // 设置读复位信号为高电平
        end
        else begin
            // 如果 rstName 不等于 "rrst",则表示激活写复位信号
            $display ("%0t:INFO:Calling task wrstActivate",$time);
            // 在控制台打印调试信息
            this.itf.wrst_n=1'b1;
            // 设置写复位信号为高电平
            repeat (this.period) @(posedge this.itf.wclk);
            // 等待周期结束,并等待下一个写时钟上升沿
            this.itf.wrst_n=1'b0;
            // 设置写复位信号为低电平
            repeat(this.period) @(posedge this.itf.wclk);
            // 等待下一个周期结束,并等待下一个写时钟上升沿
            this.itf.wrst_n=1'b1;
            // 设置写复位信号为高电平
        end
    endtask

    task automatic rstGenerator (input string rstName,input int rstPeriod);
        // 定义任务 rstGenerator,用于生成复位信号
        $display ("%0t:INFO:Calling task task clkGenerator for %s",$time,rstName);
        // 在控制台打印调试信息
        this.period=rstPeriod;
        // 将 rstPeriod 参数赋值给 period 变量
        init();
        // 调用 init 函数,初始化 FIFO 接口变量
        rstActivate(rstName);
        // 调用 rstActivate 函数,激活复位信号
    endtask

    extern function automatic void init();
    // 声明一个外部函数 init,用于初始化 FIFO 接口变量
endclass

function automatic void resetGenerator::init();
    // 定义函数 init,用于初始化 FIFO 接口变量
    this.itf.winc=0;
    // 初始化写指针为 0
    this.itf.rinc=0;
    // 初始化读指针为 0
    this.itf.wdata='0;
    // 初始化写数据为 0
endfunction

### 使用 `wildcard` 函数匹配 `corev_apu` 模块中的 SystemVerilog 文件 在 Makefile 中,`wildcard` 函数用于匹配文件系统中的文件名模式。它返回与指定模式匹配的文件列表,通常用于自动收集源文件,例如 `.sv` 文件。在构建 `corev_apu` 模块时,可以使用 `wildcard` 函数来获取所有相关的 SystemVerilog 文件。 假设 `corev_apu` 模块的源文件位于 `corev_apu/rtl` 目录下,并且所有文件以 `.sv` 为扩展名,可以使用如下方式定义变量 `SV_SRCS` 来收集这些文件: ```makefile SV_SRCS = $(wildcard corev_apu/rtl/*.sv) ``` 该语句将匹配 `corev_apu/rtl` 目录下所有以 `.sv` 结尾的文件,并将其路径存储在 `SV_SRCS` 变量中。此方法适用于自动识别模块的源文件列表,而无需手动列出每一个文件[^1]。 ### 示例:构建 `corev_apu` 模块时使用 `wildcard` 以下是一个完整的 Makefile 示例,展示了如何使用 `wildcard` 函数匹配 `corev_apu` 模块中的 SystemVerilog 文件,并执行编译命令: ```makefile # 定义源文件路径 RTL_DIR = corev_apu/rtl # 使用 wildcard 函数匹配所有 .sv 文件 SV_SRCS = $(wildcard $(RTL_DIR)/*.sv) # 编译目标 all: compile # 编译规则 compile: @echo "Found SystemVerilog files:" @echo "$(SV_SRCS)" # 假设使用 vlog 进行编译 vlog -f $(addprefix +incdir+,$(RTL_DIR)) $(SV_SRCS) ``` 上述 Makefile 中,`$(wildcard $(RTL_DIR)/*.sv)` 会动态匹配 `corev_apu/rtl` 目录下的所有 `.sv` 文件,并将其传递给 `vlog` 工具进行编译。这种方式在管理大型项目时非常高效,能够自动识别源文件的变化[^1]。 ### 注意事项 - `wildcard` 函数仅匹配当前文件系统中存在的文件,因此在 Makefile 执行前必须确保相关文件已经存在。 - 如果目录结构较深,可以使用递归通配符匹配,例如 `$(wildcard corev_apu/rtl/**/*.sv)`(取决于 Make 版本是否支持)。 - 在调试时,可以结合 `$(info ...)` 函数输出 `SV_SRCS` 的内容,以确认匹配结果是否正确: ```makefile $(info SV_SRCS = $(SV_SRCS)) ``` 该语句将在 Makefile 解析阶段输出 `SV_SRCS` 的值,便于检查是否遗漏了某些文件或路径错误[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C4HCS

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

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

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

打赏作者

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

抵扣说明:

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

余额充值