You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SystemVerilog如何实现支持任意位宽信号的数据速率检测任务

解决SystemVerilog测试台Task支持任意位宽信号频率检测的问题

核心思路

要支持任意位宽的logic信号,关键是利用SystemVerilog的参数化Task特性,将信号位宽作为可配置参数传入,让Task的形参类型与实际信号完全匹配,同时调整检测逻辑——从检测单bit边沿改为检测信号任意位的变化(即当前值与上一拍值不相等)。

实现方案

参数化Task代码

task automatic measure_signal_frequency #(
    parameter int WIDTH = 1,          // 默认位宽为1,兼容原有单bit场景
    parameter int SAMPLE_CYCLES = 1_000_000 // 采样周期数,可按需调整
)(
    input  logic clk,                 // 采样时钟
    ref    logic [WIDTH-1:0] sig,     // 待检测信号,支持任意位宽
    output real frequency_hz          // 输出检测到的变化频率(Hz)
);
    logic [WIDTH-1:0] sig_prev;
    int change_count = 0;
    real start_time, end_time, elapsed_time;

    // 同步到时钟并初始化前一周期值
    @(posedge clk);
    sig_prev = sig;
    start_time = $realtime;

    // 连续采样指定周期数,统计变化次数
    repeat(SAMPLE_CYCLES) @(posedge clk) begin
        if (sig !== sig_prev) begin  // 用!==避免X/Z状态干扰,若需忽略可改用!=
            change_count++;
            sig_prev = sig;
        end
    end

    // 计算频率
    end_time = $realtime;
    elapsed_time = (end_time - start_time) / 1e9; // 将时间单位转为秒
    frequency_hz = change_count / elapsed_time;

    // 打印结果(可选)
    $display("[Frequency Measure] %0d-bit signal changed %0d times in %.3f seconds | Frequency: %.2f Hz",
             WIDTH, change_count, elapsed_time, frequency_hz);
endtask

关键细节说明

  • 参数化设计:通过WIDTH参数动态匹配信号位宽,彻底解决形参与实参类型不匹配的问题;SAMPLE_CYCLES参数让采样时长可灵活调整。
  • 变化检测逻辑:对比当前信号值与上一拍值,只要不相等即判定为一次变化,覆盖多bit信号任意位跳变的场景;用!==可正确处理X/Z状态,若不需要可替换为!=。
  • 线程安全:添加automatic关键字,确保Task支持多线程并行调用(比如同时检测多个不同位宽的信号)。

调用示例

针对不同位宽的信号,只需在调用时指定对应的WIDTH参数即可:

logic        clk = 0;
logic [7:0]  data_8bit;
logic [31:0] data_32bit;
logic        clk_signal;
real         freq_8, freq_32, freq_clk;

// 生成时钟(示例)
always #5 clk = ~clk;

// 检测8位数据信号
measure_signal_frequency #(.WIDTH(8))(clk, data_8bit, freq_8);
// 检测32位数据信号
measure_signal_frequency #(.WIDTH(32))(clk, data_32bit, freq_32);
// 兼容原有单bit时钟信号检测
measure_signal_frequency #(.WIDTH(1))(clk, clk_signal, freq_clk);

扩展优化建议

  • 若需要支持非同步采样(比如异步信号),可调整采样逻辑为电平敏感而非时钟边沿触发,但需注意亚稳态问题。
  • 可添加参数配置是否忽略X/Z状态,或者统计X/Z状态的变化次数。
  • 封装成类或virtual interface,方便在不同测试环境中复用。

内容的提问来源于stack exchange,提问作者Damo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:47:34