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

SystemVerilog测试框架示例

这里是一个完整的SystemVerilog测试框架示例,包括随机化测试和详细注释。

顶层模块 (Top Module)

module top;// 信号声明logic clk;logic rst_n;// 接口实例化dut_if dut_if_inst(.clk(clk), .rst_n(rst_n));// DUT实例化 (假设DUT模块名为'dut')dut u_dut(.clk(dut_if_inst.clk),.rst_n(dut_if_inst.rst_n),.data_in(dut_if_inst.data_in),.data_out(dut_if_inst.data_out),.valid(dut_if_inst.valid),.ready(dut_if_inst.ready));// 时钟生成initial beginclk = 0;forever #5 clk = ~clk;end// 复位逻辑initial beginrst_n = 0;#20 rst_n = 1;end// 实例化并运行测试initial beginTest test_inst = new(dut_if_inst);test_inst.run();#1000 $finish; // 延长仿真时间以观察更多的随机事务end
endmodule

接口 (Interface)

interface dut_if(input logic clk, input logic rst_n);logic [31:0] data_in;logic [31:0] data_out;logic valid;logic ready;
endinterface

事务 (Transaction)

class Transaction;rand logic [31:0] data_in;rand bit valid;function new();endfunction// 添加约束:valid 只能为0或1,data_in 为32位任意值constraint valid_c { valid inside {0, 1}; }constraint data_in_c { data_in inside {[32'h0:32'hFFFFFFFF]}; }// 打印事务内容function void display();$display("Transaction: data_in=%h, valid=%0b", data_in, valid);endfunction
endclass

驱动器 (Driver)

class Driver;virtual dut_if vif;function new(virtual dut_if vif);this.vif = vif;endfunctiontask drive();Transaction tr;forever begin// 生成随机事务tr = new();if (!tr.randomize()) begin$display("Randomization failed!");endtr.display();// 发送事务到DUTvif.data_in <= tr.data_in;vif.valid <= tr.valid;if (tr.valid) beginwait(vif.ready);end@(posedge vif.clk); // 等待下一个时钟周期endendtask
endclass

监视器 (Monitor)

class Monitor;virtual dut_if vif;function new(virtual dut_if vif);this.vif = vif;endfunctiontask monitor();forever begin@(posedge vif.clk);if (vif.valid && vif.ready) begin$display("Data: %h", vif.data_out);endendendtask
endclass

代理 (Agent)

class Agent;virtual dut_if vif;Driver drv;Monitor mon;function new(virtual dut_if vif);this.vif = vif;drv = new(vif);mon = new(vif);endfunctiontask run();forkdrv.drive();mon.monitor();joinendtask
endclass

环境 (Environment)

class Env;virtual dut_if vif;Agent agent;function new(virtual dut_if vif);this.vif = vif;agent = new(vif);endfunctiontask run();agent.run();endtask
endclass

测试用例 (Test Case)

class Test;Env env;function new(virtual dut_if vif);env = new(vif);endfunctiontask run();env.run();endtask
endclass

这个完整的SystemVerilog测试框架包括顶层模块、接口、事务、驱动器、监视器、代理、环境和测试用例,并使用随机化功能生成输入信号。每个模块和类都有详细注释,解释其功能和作用。可以根据具体的DUT和测试需求对代码进行进一步的扩展和修改。

http://www.lryc.cn/news/366637.html

相关文章:

  • 每天一个数据分析题(三百五十六)-图表决策树
  • Prism 入门06,发布订阅(入门完结)
  • 2. pytorch环境安装
  • 力扣爆刷第148天之贪心算法五连刷(区间合并)
  • JSON及Python操作JSON相关
  • [ 网络通信基础 ]——网络的传输介质(双绞线,光纤,标准,线序)
  • Android 高德地图API(新版)
  • LeetCode---二叉树
  • 从0开发一个Chrome插件:核心功能开发——弹出页面
  • AIGC笔记--Stable Diffusion源码剖析之UNetModel
  • Linux文件系统与日志分析
  • 【SkyWalking】使用PostgreSQL做存储K8s部署
  • 详解大模型微调数据集构建方法(持续更新)
  • 自制植物大战僵尸:HTML5与JavaScript实现的简单游戏
  • Istio_1.17.8安装
  • [数据集][目标检测]室内积水检测数据集VOC+YOLO格式761张1类别
  • 17_Vue高级监听器生命周期Vue组件组件通信
  • 【ROS使用记录】—— ros使用过程中的rosbag录制播放和ros话题信息相关的指令与操作记录
  • Laravel 富文本内容
  • Spark Python环境搭建与优化:深入剖析四个方面、五个方面、六个方面及七个关键要点
  • 【微信小程序开发】小程序中的上滑加载更多,下拉刷新是如何实现的?
  • 从 Android 恢复已删除的备份录
  • 如何使用Python中的random模块生成随机数
  • AI大数据处理与分析实战--体育问卷分析
  • C++第二十五弹---从零开始模拟STL中的list(下)
  • STM32/keil把多个c文件编译为静态库lib
  • L45---506.相对名次(java)--排序
  • 跨网段路由
  • HO-3D 数据集
  • Elasticsearch 认证模拟题 - 8