【【Systemverilog学习参考 简单的加法器验证-含覆盖率】】

server/2025/2/27 0:25:05/

【【Systemverilog学习参考 简单的加法器验证-含覆盖率】】

adder.v

module  adder (input                    clk      ,input                    rst_n    ,input         [3 : 0]    in_0     ,input         [3 : 0]    in_1     ,input                    sel      ,   // 判断信号 output        [3 : 0]    out0     ,output        [3 : 0]    out1     ,output   reg  [4 : 0]    out2);always@(posedge clk or negedge rst_n )beginif(rst_n == 0)beginout2  <=  0    ;endelsebeginout2  <=  in_0 + in_1 ;endendassign  out1   = sel?  in_1 : 0  ;  assign  out0   = sel?  in_0 : 0  ; endmodule  

adder_tb.sv

// 这代码包含的部分是关于覆盖率的测试
class play;
static int count = 0;
int id;
logic [2:0] ina;
logic [5 : 0]   func_a;
int arr[6] = '{0, 1, 2, 3, 4, 5};// 构造函数 
function new();this.id = count++;
endfunction// 打印数组
task showk();foreach (arr[i])beginint k = arr[i];$display("%d", k);end
endtask// 功能函数
function int shown_a( int a) ;
func_a  = 6'(a + a) ; 
$display("function shown_a number is %d",func_a) ;
return func_a ;
endfunction 
endclass // transaction 类class  transaction ; 
rand bit [3 : 0]  ina ;
rand bit [3 : 0]  inb ; 
rand bit          sel ; 
constraint vaild_range{ina inside {[0:15]} ;inb inside {[0:15]} ;
};function new() ;
ina = 0 ;
inb = 0 ;
sel = 0 ;
endfunction 
endclass //定义覆盖率 
covergroup covport(ref transaction tr);cp_ina: coverpoint tr.ina {bins ina_values[] = {[0:15]}; // 明确覆盖所有值option.goal = 100;}cp_inb: coverpoint tr.inb {bins inb_values[] = {[0:15]}; // 明确覆盖所有值option.goal = 100;}cp_sel: coverpoint tr.sel;
endgroup// 定义一个虚的基类 用以适配回调函数 
virtual class driver_back ;
virtual task post_tx(ref transaction tr ) ;
endtask 
endclass 
// 这里先默认什么都不写 到下面做出适配class coveragecallback extends driver_back ;
covport cov ; // 初始化覆盖组
function void init_cov(ref transaction tr) ;
cov = new(tr) ;
endfunction // 回调函数的编辑
virtual  task post_tx(ref transaction tr ) ;
cov.sample() ; 
$display("coverage sampled : ina=%d ,inb=%d ,sel=%d",tr.ina,tr.inb,tr.sel) ;
endtask function void report_coverage() ;
real coverage_ina , coverage_inb , coverage_total ;
// 获取覆盖组覆盖率coverage_ina = cov.cp_ina.get_coverage();coverage_inb = cov.cp_inb.get_coverage();coverage_total = cov.get_coverage(); // 整体覆盖率$display("Coverage for ina: %0.2f%%", coverage_ina);$display("Coverage for inb: %0.2f%%", coverage_inb);$display("Total Coverage: %0.2f%%", coverage_total);endfunction
endclassmodule test ; 
logic                clk      ;
logic                rst_n    ;
logic     [3 : 0]    in_0     ;
logic     [3 : 0]    in_1     ;
logic                sel      ;
logic     [3 : 0]    out0     ;
logic     [3 : 0]    out1     ;
logic     [4 : 0]    out2     ; 
logic     [5 : 0]    result_a ;
logic     [5 : 0]    result_b ; transaction tr ; 
coveragecallback cb ;
play inst_a  , inst_b ;// 生成时钟 
initial begin clk = 0 ; forever #5 clk = ~clk ; 
end adder u_adder(.clk    ( clk    ),.rst_n  ( rst_n  ),.in_0   ( in_0   ),.in_1   ( in_1   ),.sel    ( sel    ),.out0   ( out0   ),.out1   ( out1   ),.out2   ( out2   )
);// 开始执行操作 
// 先将class内部的操作完成 
initial begin
$fsdbDumpfile("novas.fsdb"); // 指定波形文件名
$fsdbDumpvars(0, test);       // 指定波形文件的层次结构和信号范围
endinitial begin rst_n  =  0  ;in_0   =  0  ;in_1   =  0  ;sel    =  0  ;inst_a =  new()  ; inst_b =  new()  ;$display("inst_a id = %d", inst_a.id);$display("inst_b id = %d", inst_b.id);// 调用 showk 打印数组inst_a.showk();inst_b.showk();// 调用 shown_a 进行测试result_a = inst_a.shown_a(5); // 示例输入值为 5$display("inst_a.shown_a(5) result = %d", result_a);result_b = inst_b.shown_a(10); // 示例输入值为 10$display("inst_b.shown_a(10) result = %d", result_b);#100 ;rst_n = 1;@(posedge clk) ;tr = new()  ; cb = new()  ;cb.init_cov(tr) ;// 随机化 repeat(10) begin assert(tr.randomize()) ;in_0 = tr.ina ; in_1 = tr.inb ; sel  = tr.sel ; cb.post_tx(tr) ;#20 ;$display("DUT Outputs: out0=%0d, out1=%0d, out2=%0d", out0, out1, out2);end// 打印覆盖率报告cb.report_coverage();$finish ;end
endmodule

指令 : vcs divide.sv divide_test.sv -timescale=1ns/1ps -full64 -R +vc +v2k -sverilog -debug_access+ -kdb -fsdb -cm line+cond+fsm+tgl -l sim.log

指令2 : verdi verdi -ssf novas.fsdb -dbdir simv.daidir


http://www.ppmy.cn/server/170890.html

相关文章

WPS PPT插入各种线型形状(如画直线)的时候总是有箭头,如何还原成只画直线

WPS PPT插入各种线型形状&#xff08;如画直线&#xff09;的时候总是有箭头&#xff0c;如何还原成只画直线 文章目录 WPS PPT插入各种线型形状&#xff08;如画直线&#xff09;的时候总是有箭头&#xff0c;如何还原成只画直线一、问题出现的原因二、解决方法 在使用 WPS 演…

Python爬虫系统搭建教程,从0开始搭建爬虫系统(附安装包)

文章目录 前言一、Python环境搭建1.Python安装2.选择Python开发环境3. 安装必要库 二、基础爬虫构建1. 发送请求获取网页2. 解析网页提取数据 三、使用 Scrapy 框架搭建系统1. 创建 Scrapy 项目2. 生成爬虫3. 编写爬虫代码4. 运行爬虫 四、应对反爬虫机制1. 常见反爬虫手段2. 解…

【网络安全 | 漏洞挖掘】Stripe 子系统 TaxJar 的 ATO 漏洞挖掘之旅

未经许可,不得转载。 文章目录 正文在这篇文章中,我将带大家回顾我是如何在 Stripe 旗下的 TaxJar 发现一个账户接管(Account Takeover)漏洞的。 正文 进入 TaxJar 后,我花了一些时间四处探索,发现了一些零碎的小问题。然而,我的目标是以低权限用户的身份邀请一个新成员…

seacmsv9管理员账号+密码注入

Seacms v9 SQL 注入漏洞分析与利用 1. 漏洞概述 Seacms&#xff08;海洋 CMS&#xff09;是一款基于 PHP5.X MySQL 架构的视频点播系统&#xff0c;被广泛用于影视站点管理。在 Seacms v9 版本中&#xff0c;./comment/api/index.php 存在 SQL 注入漏洞&#xff0c;漏洞参数…

《Head First设计模式》读书笔记 —— 命令模式

文章目录 本节用例餐厅类比点餐流程角色与职责从餐厅到命令模式 命令模式第一个命令对象实现命令接口实现一个命令 使用命令对象NoCommand与空对象 定义命令模式支持撤销功能使用状态实现撤销多层次撤销 One One One …… more things宏命令使用宏命令 队列请求日志请求 总结 《…

网络安全防御:蓝队重保备战与应急溯源深度解析

课程目标 本课程旨在培养专业的网络安全蓝队成员&#xff0c;通过系统化的学习和实战演练&#xff0c;使学员能够掌握网络安全防御的核心技能&#xff0c;包括资产测绘、应急响应、系统安全应急溯源分析、网络层溯源分析以及综合攻防演练等。学员将能够熟练运用各种工具和技术…

20250224-代码笔记02-class CVRPTrainer

文章目录 前言一、__init__(self, env_params, model_params, optimizer_params, trainer_params)函数功能函数代码 二、run(self)函数功能函数代码 三、_train_one_epoch(self, epoch)函数功能函数代码问题批次与回合 四、_train_one_batch(self, batch_size)函数功能函数代码…

nginx 部署前端vue项目

?? 主页&#xff1a; ?? 感谢各位大佬 点赞?? 收藏 留言?? 加关注! ?? 收录于专栏&#xff1a;前端工程师 文章目录 一、??什么是nginx&#xff1f;二、??nginx 部署前端vue项目步骤 2.1 ??安装nginx 2.1.1 ??windows环境安装2.1.2 ??linux环境安装 2.2 …