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)
}
相关推荐
OKay_J42 分钟前
在Windows下VSCodeSSH远程登录到Ubuntu
linux·笔记·vscode·学习·ubuntu
知识分享小能手1 小时前
CSS3学习教程,从入门到精通,CSS3 弹性盒子(Flexbox)布局全面指南(20)
前端·javascript·css·学习·css3·html5·前端开发
四夕白告木贞1 小时前
stm32week8
javascript·stm32·嵌入式硬件·学习
奕天者1 小时前
C++学习笔记(二十九)——list
c++·笔记·学习
虾球xz1 小时前
游戏引擎学习第187天
学习·游戏引擎
wakenprogram2 小时前
微服务管理 - NACOS学习
学习
计算机毕设定制辅导-无忧学长3 小时前
从入门到精通:HTML 项目实战中的学习进度(二)
前端·学习·html
百流3 小时前
scala基础学习-类(1.定义类)
开发语言·学习·scala
虾球xz3 小时前
游戏引擎学习第181天
c++·学习·游戏引擎
虾球xz3 小时前
游戏引擎学习第186天
c++·学习·游戏引擎