4. 示例:创建带约束的随机地址生成器(范围0x1000-0xFFFF)

文章目录


前言

以下是一个完整的SystemVerilog测试平台示例,包含约束随机地址生成、日志输出和波形生成功能:


代码示例:

c 复制代码
// filename: addr_gen_tb.sv
`timescale 1ns/1ps

module addr_gen_tb;
    // 声明时钟信号
    logic clk;
    
    // 声明随机地址生成类
    class RandomAddress;
        rand bit [15:0] addr;
        
        // 地址范围约束:0x1000 - 0xFFFF
        constraint valid_range {
            addr inside {[16'h1000:16'hffff]};
        }
    endclass

    // 测试平台变量
    bit [15:0] current_addr;
    RandomAddress addr_gen = new();
    int error_count = 0;

    // 生成时钟(50MHz)
    initial begin
        clk = 0;
        forever #10 clk = ~clk;
    end

    // 波形记录初始化
    initial begin
        $dumpfile("waves.fsdb");
        $dumpvars(0, addr_gen_tb);
    end

    // 主测试程序
    initial begin
        $display("=== Starting Test ===");
        
        repeat (20) begin
            @(negedge clk);
            if (!addr_gen.randomize()) begin
                $error("Randomization failed!");
                error_count++;
            end
            else begin
                current_addr = addr_gen.addr;
                $display("[%0t] Generated address: 0x%h", $time, current_addr);
                
                // 验证地址范围
                if (!(current_addr >= 16'h1000 && current_addr <= 16'hffff)) begin
                    $error("Address out of range: 0x%h", current_addr);
                    error_count++;
                end
            end
            #5; // 添加少量延迟用于波形观察
        end

        $display("\n=== Test Summary ===");
        $display("Total errors: %0d", error_count);
        if (error_count == 0) $display("TEST PASSED");
        else $display("TEST FAILED");
        
        $finish;
    end
endmodule

运行方法:

  1. 使用Synopsys VCS:
bash 复制代码
vcs -sverilog addr_gen_tb.sv
./simv
  1. 使用Cadence Xcelium:
bash 复制代码
xrun -sv addr_gen_tb.sv

查看结果:

  1. 日志输出示例:

    === Starting Test ===
    Generated address: 0x3a7b
    Generated address: 0xf42c
    Generated address: 0x8d01
    ...
    === Test Summary ===
    Total errors: 0
    TEST PASSED

  2. 查看波形(以VCS为例):

bash 复制代码
verdi -wave waves.fsdb &

关键功能说明:

  1. 随机约束类 RandomAddress

    • 使用rand关键字声明随机变量
    • inside约束确保地址在0x1000-0xFFFF之间
  2. 测试平台特性:

    • 自动生成时钟信号(50MHz)
    • 每次生成地址后自动验证范围
    • 错误计数和最终测试结果统计
    • 详细的时序日志输出(包含时间戳)
  3. 波形生成:

    • 使用$dumpfile$dumpvars生成VCD格式波形
    • 记录所有层次信号(参数0表示记录所有层次)
  4. 验证机制:

    • 自动检查随机化成功状态
    • 二次验证地址范围
    • 错误计数器自动累加

这个示例可以:

  • 生成符合要求的随机地址
  • 自动验证地址有效性
  • 输出带时间戳的详细日志
  • 生成可用于调试的波形文件
  • 提供清晰的测试结果总结

扩展功能建议:

添加覆盖率收集:

c 复制代码
xcovergroup addr_cg;
	xcoverpoint gen.addr {
		xbins low  = {[16'h1000:16'h7FFF]};
		xbins high = {[16'h8000:16'hFFFF]};
	}
xendgroup

在类中实例化覆盖率对象

多约束组合:

c 复制代码
constraint even_addr {
  addr % 2 == 0;  // 生成偶数地址[4](@ref)
}
相关推荐
The_cute_cat14 分钟前
JavaScript的初步学习
开发语言·javascript·学习
Binary_ey2 小时前
超表面重构卡塞格林望远镜 | 从传统架构到新型光学系统
学习·软件需求·光学软件·超表面
草履虫建模2 小时前
Postman - API 调试与开发工具 - 标准使用流程
java·测试工具·spring·json·测试用例·postman·集成学习
roman_日积跬步-终至千里2 小时前
【学习线路】机器学习线路概述与内容关键点说明
人工智能·学习·机器学习
小叶爱吃鱼4 小时前
软件测试-测试用例,举例说明
功能测试·测试用例
天水幼麟4 小时前
python学习笔记(深度学习)
笔记·python·学习
you45804 小时前
小程序学习笔记:使用 MobX 实现全局数据共享,实例创建、计算属性与 Actions 方法
笔记·学习·小程序
测试者家园5 小时前
基于DeepSeek和crewAI构建测试用例脚本生成器
人工智能·python·测试用例·智能体·智能化测试·crewai
Brookty5 小时前
【MySQL】JDBC编程
java·数据库·后端·学习·mysql·jdbc
DKPT5 小时前
Java设计模式之结构型模式(外观模式)介绍与说明
java·开发语言·笔记·学习·设计模式