当前位置: 首页 > news >正文

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

文章目录

  • 前言
  • 代码示例:
  • 运行方法:
  • 查看结果:
  • 关键功能说明:
  • 扩展功能建议:


前言

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


代码示例:

// filename: addr_gen_tb.sv
`timescale 1ns/1psmodule addr_gen_tb;// 声明时钟信号logic clk;// 声明随机地址生成类class RandomAddress;rand bit [15:0] addr;// 地址范围约束:0x1000 - 0xFFFFconstraint valid_range {addr inside {[16'h1000:16'hffff]};}endclass// 测试平台变量bit [15:0] current_addr;RandomAddress addr_gen = new();int error_count = 0;// 生成时钟(50MHz)initial beginclk = 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++;endelse begincurrent_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++;endend#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:
vcs -sverilog addr_gen_tb.sv
./simv
  1. 使用Cadence Xcelium:
xrun -sv addr_gen_tb.sv

查看结果:

  1. 日志输出示例:
=== Starting Test ===Generated address: 0x3a7bGenerated address: 0xf42cGenerated address: 0x8d01
...
=== Test Summary ===
Total errors: 0
TEST PASSED
  1. 查看波形(以VCS为例):
verdi -wave waves.fsdb &

关键功能说明:

  1. 随机约束类 RandomAddress

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

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

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

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

这个示例可以:

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

扩展功能建议:

添加覆盖率收集:

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

在类中实例化覆盖率对象

多约束组合:

constraint even_addr {addr % 2 == 0;  // 生成偶数地址[4](@ref)
}
http://www.lryc.cn/news/544092.html

相关文章:

  • VSCode轻松调试运行C#控制台程序
  • 内容中台是什么?内容管理平台解析
  • sqlmap:自动SQL注入和数据库接管工具
  • Python设置阿里云镜像源教程:解决PIP安装依赖包下载速度慢的问题
  • 基于专利合作地址匹配的数据构建区域协同矩阵
  • Java集合List快速实现重复判断的10种方法深度解析
  • List的模拟实现(2)
  • 如何使用SaltStack批量替换SSL证书方案
  • Golang快速上手01/Golang基础
  • [Web 安全] 反序列化漏洞 - 学习笔记
  • 【学习笔记】Google的Lyra项目:基于神经网络的超低比特率语音编解码技术
  • Unity Dedicated Server 控制台 输出日志LOg 中文 乱码
  • 【Excel】 Power Query抓取多页数据导入到Excel
  • 去耦电容的作用详解
  • HTTPS 与 HTTP 的区别在哪?
  • let、const【ES6】
  • openharmony5.0中hdf框架中实现驱动程序的动态加载和管理的技术细节分析
  • TVS管学习记录
  • 数据库表的各种设计
  • JWT使用教程
  • 【大模型系列篇】如何解决DeepSeek-R1结构化输出问题,使用PydanticAl和DeepSeek构建结构化Agent
  • 老旧android项目编译指南(持续更)
  • linux中安装部署Jenkins,成功构建springboot项目详细教程
  • AI开发利器:Anaconda
  • java网络编程--基于TCP协议的网络编程
  • PageHelper新发现
  • Redis 数据结构和使用详解(带示例)
  • 深度解读 Chinese CLIP 论文:开启中文视觉对比语言预训练
  • SpringBoot 2 后端通用开发模板搭建(异常处理,请求响应)
  • 【Oracle专栏】sqlplus显示设置+脚本常用显示命令