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)
}
相关推荐
想你依然心痛20 分钟前
HarmonyOS 6(API 23)实战:基于悬浮导航、沉浸光感与HMAF的“鸿蒙代码导师“——PC端AI智能体沉浸式编程学习系统
人工智能·学习·harmonyos
玄米乌龙茶12322 分钟前
LLM 应用开发学习笔记:RAG 评估、参数调优与 Transformer 注意力机制
笔记·学习
吃好睡好便好40 分钟前
在Matlab中绘制三维直方图
开发语言·学习·算法·matlab·信息可视化
大志若愚YYZ43 分钟前
FreeRTOS中的两个Delay函数(vTaskDelay vs vTaskDelayUntil)
学习
程序员杰哥1 小时前
Python+requests+excel 接口自动化测试框架
自动化测试·软件测试·python·测试工具·测试用例·excel·接口测试
烤麻辣烫1 小时前
计算机思维--经典互联网应用
开发语言·学习·搜索引擎·数据库开发
wuxinyan1231 小时前
工业级大模型学习之路018:LangChain零基础入门教程(第一篇):LangChain架构与生态介绍
人工智能·python·学习·langchain
Jackyzhe1 小时前
从零学习Kafka:调优
分布式·学习·kafka
噜噜噜阿鲁~1 小时前
python学习笔记 | 11.0、面向对象高级编程
笔记·python·学习
暗冰ཏོ1 小时前
PHP 全栈开发学习手册:从基础到高级实战、Laravel、Redis、面试题完整版
学习·php·laravel