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

news/2025/2/25 8:14:38
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> svg>

文章目录

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


前言

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


代码示例:

// 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:
vcs -sverilog addr_gen_tb.sv
./simv
  1. 使用Cadence Xcelium:
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
  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.niftyadmin.cn/n/5865239.html

相关文章

sailwind 安装提示找不到mfc140.dll安装Visual C++ Redistributable for Visual Studio 2015

sailwind 安装提示找不到mfc140.dll安装Visual C Redistributable for Visual Studio 2015 下载&#xff1a; https://www.microsoft.com/zh-cn/download/details.aspx?id48145&751be11f-ede8-5a0c-058c-2ee190a24fa6True) 如果链接失效就直接搜&#xff0c;有个微软官…

your HTTP request connection start duration too long

If your HTTP request connection start duration is taking more than 7 seconds, here are some possible causes and troubleshooting steps: Possible Causes: Network Latency – Slow internet or network congestion.DNS Resolution Delay – Slow DNS lookup affecti…

前端面试-webpack篇

Webpack的构建流程 Webpack 的构建流程可以总结为以下几个关键步骤&#xff1a; 初始化参数&#xff1a; 从配置文件和命令行参数中读取并合并配置&#xff0c;得到最终的构建参数。 开始编译&#xff1a; 初始化 Compiler 对象&#xff0c;加载所有配置的插件&#xff0c;执行…

基于SpringBoot + Vue的共享汽车(单车)管理系统设计与实现+毕业论文+开题报告+指导搭建视频

本系统包含管理员、用户两个角色。 管理员角色&#xff1a;个人中心管理、用户管理、投放地区管理、汽车信息管理、汽车投放管理、汽车入库管理、使用订单管理、汽车归还管理。 用户角色&#xff1a;注册登录、汽车使用下单、汽车归还。 本共享汽车管理系统有管理员和用户。管…

Vi 编辑器基本使用指南

一、Vi 编辑器的启动与退出 启动 Vi 编辑器 在终端中&#xff0c;输入vi加上要编辑的文件名&#xff0c;如vi example.txt&#xff0c;如果example.txt存在&#xff0c;Vi 编辑器会打开该文件&#xff1b;若不存在&#xff0c;则会创建一个新的空文件并打开。如果只输入vi&am…

Linux学习笔记之文件

1.文件 1.1文件属性 当我们创建文件时&#xff0c;文件就有了对应的属性&#xff0c;可以用mkdir创建目录&#xff0c;touch创建普通文件。用ls -al查看文件属性。 从上图可以看出目录或者文件的所有者&#xff0c;所属组&#xff0c;其他人权限&#xff0c;创建时间等信息。由…

前端防重复请求终极方案:从Loading地狱到精准拦截的架构升级

&#x1f525; 事故现场还原&#xff1a;疯狂点击引发的血案 凌晨1点23分&#xff0c;监控系统突然告警&#xff1a; &#x1f4c9; 服务器CPU飙升至98% &#x1f5c3;️ 数据库出现3000脏数据 &#x1f4a5; 用户端弹出上百个错误弹窗 事故原因&#xff1a;黑产脚本通过0.5秒…

科普:HTTP端口80和HTTPS端口443

你会发现&#xff0c;有的网址不带端口号&#xff0c;怎么回事&#xff1f; HTTP协议默认端口&#xff1a;HTTP协议的默认端口是80。当用户在浏览器中输入一个没有指定端口的以http://开头的网址时&#xff0c;浏览器会自动使用80端口与服务器建立连接&#xff0c;进行超文本数…