【芯片前端】auto_testbench的大版本升级——加入简单预期与自动比对

前言

前文提要:

【芯片前端】一键生成简易版本定向RTL验证环境的脚本——auto_verification_rtl脚本_尼德兰的喵的博客-CSDN博客

【芯片前端】可能是定向验证的巅峰之作——auto_testbench_autotestbench_尼德兰的喵的博客-CSDN博客

工具路径:

auto_testbench: 用于自动生成verilog rtl的定向用例仿真平台的脚本

在上次完成自诩为“定向验证的巅峰之作”之后,我觉得这个工具应该是写到头了,不过最近的实践中我发现,对于auto_testbench的主要应用场景——CBB与UT的验证而言,如果能不依赖于方法学进行一些简单预期和比对,还是可以大幅收敛debug时间的。

本次升级针对握手接口(因为好久没写其他类型接口了),脚本的功能概述为:

  1. 对于握手接口单输出的模块,会进行符合协议的输入随机,会自动生成采样与比对task,而根据输入生成预期的task需要手动填充;
  2. 对于不满足单输出的其他握手接口模块,会进行符合协议的输入随机,此时如果想要进行比对需要对环境进行比较大的改动;
  3. 对于其他接口模块,会生成整套验证环境,对接口进行初始化和随机驱动;
  4. 如果不进行仿真只想编译模块,在tb.f中注释掉testbench.sv路径然后在sim路径执行make cmp;

其他优化包括:

  1. 优化了生成的tb.f文件;
  2. 修正了模块中有注释是可能误读的问题;
  3. 美化和对齐了一下生成文件;

效果亲测

作为一个负责人的工具发布者,发布前我先亲自验证了一下这个工具的正确性,于是翻出来了去年写的一个cbb bypass_fifo进行了下验证,然后发现这个cbb有BUG!不过放心,我相信这个cbb是没有在工程中使用的。

bypass_fifo的功能是这样,对于输入的data,如果power为1则正常输出,如果为0则丢弃。这个cbb听起来很奇怪不过其实他是另外一个cbb的一部分(一对多的场景,每个数据可能有不同的通道需要)。那么看下出错的log:

对着log找到波形的错误处:

然后分析下问题不是出现在'h57eadcc1这个数身上,而是出现在前一个数'hb985d7ad,RTL出口没有就把valid和数变了!奇怪的是对于类似的场景,其他的数据在出口时序就很正确:

那么这个问题如果通过波形是否能发现呢?不是太容易:

因此,这个工具的新功能我初步认为是有效的。

使用说明

就以bypass_fifo的验证环境生成为例,看一下如何使用。

第一步还是切换到bypass_fifo的路径,执行:

auto_testbench -f bypass_fifo.v
#如果没有设置全局路径,请完整输入auto_testbench的脚本路径

打印信息为:

##====================================================================##
Gen over! please cd ./bypass_fifo_verification/sim
You need modify ./bypass_fifo_verification/top/testbench.svlike cp ./bypass_fifo_verification_bak/top/testbench.sv ./bypass_fifo_verification/top/
You need modify ./bypass_fifo_verification/cfg/tb.flike cp ./bypass_fifo_verification_bak/cfg/tb.f ./bypass_fifo_verification/cfg/
##====================================================================##

这里说明一下,我的本意是如果已经有bypass_fifo_verification目录了,就把bypass_fifo_verification重命名为bypass_fifo_verification_bak,不过吧脚本写的好像是有点问题导致这个功能时灵时不灵。

第二步,切换到bypass_fifo_verification/cfg路径,打开tb.f文件,并按照需求修改:

+libext+.v
-y /home/ICer/gitee_path/auto_testbench/src/../ver/bypass_fifo_pkg.sv
/home/ICer/gitee_path/auto_testbench/src/bypass_fifo.v
../top/testbench.sv

第三步,切换到bypass_fifo_verification/ver路径,检查bypass_fifo_pkg.sv是否符合预期:

package bypass_fifo_pkg;parameter ERROR_DEBUG_CNT = 5;parameter DEPTH = 8;parameter WIDTH = 128;int error_cnt = 0;bit check_en  = 0;typedef struct{bit [WIDTH -1:0] data_in;bit  data_in_power;} data_in_valid_struct;data_in_valid_struct data_in_valid_bus_q[$];typedef struct{bit [WIDTH -1:0] data_out;} data_out_valid_struct;data_out_valid_struct rm_q[$];data_out_valid_struct data_out_valid_bus_q[$];endpackage

重点说bypass_fifo_pkg文件,在这个文档中脚本根据每个valid信号的名字“推测”其它信号是否为该valid“管辖”的信号,并将结果按valid分组为struct结构。然后顺便把每个数据结构的队列进行声明,如果是输出的valid,那么同时声明reference model的预期队列。因此如果有多路valid输出握手的话,这里的rm声明会重复,需要手动修改。

ERROR_DEBUG_CNT表示发生错误的次数,check_en表示是否进行自动比对默认为0,需要进行比对时手动将这个值改为1。

第四步,切换到bypass_fifo_verification/top路径,打开testbench.sv文件,还是如此的赏心悦目:

其他部分之前都讲过,只需说明下新增的auto_verification部分即可。展开这部分可以看到如下代码:

task in_queue_gain();while(1)begin@(negedge clk);if(data_in_valid && data_in_ready)begindata_in_valid_struct data_in_valid_dat;data_in_valid_dat.data_in = data_in;data_in_valid_dat.data_in_power = data_in_power;data_in_valid_bus_q.push_back(data_in_valid_dat);end//if-end end//while-end 
endtask: in_queue_gain

对输入进行采样,如果有多路输入,会在这个task里均进行采样;

task out_queue_gain();while(1)begin@(negedge clk);if(data_out_valid && data_out_ready)begindata_out_valid_struct data_out_valid_dat;data_out_valid_dat.data_out = data_out;data_out_valid_bus_q.push_back(data_out_valid_dat);end//if-end end//while-end 
endtask: out_queue_gain

对输出进行采样,如果有多路输出,会在这个task里均进行采样;

task rm_queue_gain();data_in_valid_struct data_in_valid_dat;data_out_valid_struct data_out_valid_dat;//while(1)begin//wait(data_in_valid_bus_q.size > 0);//data_in_valid_dat = data_in_valid_bus_q.pop_front();//rm_q.push_back(data_out_valid_dat);//end
endtask: rm_queue_gain

rm_queue_gain是一个空壳task,用于产生预期,里面预置了数据类型和队列操作方法;

task queue_check();while(1)begindata_out_valid_struct rm_data;data_out_valid_struct dual_data;wait(data_out_valid_bus_q.size() > 0);dual_data = data_out_valid_bus_q.pop_front();if(rm_q.size() == 0) begin$display("dual_data = %0p, rm_queue.size = 0", dual_data);error_cnt += 1;endelse beginrm_data = rm_q.pop_front();if(dual_data != rm_data)beginerror_cnt += 1;$display("dual_data(%0p) != rm_data(%0p) at %t", dual_data, rm_data, $realtime);endelse begin//$display("dual_data(%0p) == rm_data(%0p) at %t", dual_data, rm_data, $realtime);endendif(error_cnt >= ERROR_DEBUG_CNT) begin$display("Check Error!!!");$finish;endend
endtask: queue_check

对rm_q[$]和RTL输出接口queue[$]进行自动比对,同样需要注意,如果有多路进行输出,这里只会比对其中一路;

代码的最后是固定的initial函数:

initial beginforkin_queue_gain();out_queue_gain();rm_queue_gain();if(check_en == 1) queue_check();join_none
end

然后是关键点,根据bypass_fifo的功能对rm_queue_gain task进行改写,完成简单的功能预期:

task rm_queue_gain();data_in_valid_struct data_in_valid_dat;data_out_valid_struct data_out_valid_dat;while(1)beginwait(data_in_valid_bus_q.size > 0);data_in_valid_dat = data_in_valid_bus_q.pop_front();if(data_in_valid_dat.data_in_power == 1)begindata_out_valid_dat.data_out = data_in_valid_dat.data_in;rm_q.push_back(data_out_valid_dat);endend
endtask: rm_queue_gain

至此CBB的简单验证环境就完成了。

切换到auto_verification/sim目录,执行:

make run wave=on

之后根据仿真结果和波形进行debug。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/37505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广告聚合平台能为APP开发者提供哪些帮助

应用变现平台是帮助开发者优化广告策略并最终获得更多收入的综合途径。在广告变现过程中,接入单一的广告联盟,变现效率不高,并且开发者需要花费许多精力进行筛选和管理,难免会应接不暇,而聚合广告平台的出现则一定程度…

GloVe、子词嵌入、BPE字节对编码、BERT相关知识(第十四次组会)

GloVe、子词嵌入、BPE字节对编码、BERT相关知识(第十四次组会) Glove子词嵌入上游、下游任务监督学习、无监督学习BERTGlove 子词嵌入 上游、下游任务 监督学习、无监督学习 BERT

springboot使用configtree读取树形文件目录中的配置

文章目录 一、介绍二、演示环境三、项目演示1. 配置文件2. 导入配置3. 检测配置属性 四、应用场景五、源码解析1. ConfigTreeConfigDataLocationResolver2. ConfigTreeConfigDataLoader 六、总结 一、介绍 相信绝大多数使用springboot开发项目的朋友们在添加配置时&#xff0c…

【从零学习python 】23. Python中集合(set)的使用方法和常见操作

文章目录 set的使用创建格式添加元素移除元素set常见方法列表练习 进阶案例 set的使用 集合(set)是一个无序的不重复元素序列,可以使用大括号 { } 或者 set() 函数创建集合。 注意:创建一个空集合必须用 set() 而不是 { }&#x…

母婴即时零售行业数据可视化分析

对新晋父母来说,很多母婴用品如同一位贴心的助手,为他们的宝宝提供温暖和呵护。从婴儿床垫到可爱的拼图玩具,每一件用品都是为宝宝的成长和发展量身定制。对于繁忙的父母们而言,这些用品不仅帮助照顾孩子,更是为他们减…

一百五十一、Kettle——Linux上安装的kettle8.2开启carte服务以及配置子服务器

一、目的 kettle8.2在Linux上安装好可以启动界面、并且可以连接MySQL、Hive、ClickHouse等数据库后,准备在Linux上启动kettle的carte服务 二、实施步骤 (一)carte服务文件路径 kettle的Linux运行的carte服务文件是carte.sh (二…

手机两个卡槽的正确使用方法,您用对了吗?

手机上有两个卡槽,该如何搭配才能使话费降到最低?你又是怎么搭配的? 这篇文章小编就来告诉你,如何在不换号的情况下,将自己的话费降到最低。 首先卡槽一我们就用8元保号套餐。 卡槽二,我们就可以办理一张…

【C语言】每日一题(寻找数组的中心下标)

寻找数组的中心下标,链接奉上 方法 暴力循环前缀和 暴力循环 ​​​​​​​思路: 依旧是我们的老朋友,暴力循环。 1.可以利用外层for循环,循环变量为数组下标,在循环内分别求出下标左边与右边的sum 2.在边界时讨论&…

JAVA 鼠标控制与键盘输入控制

核心类:java.awt.Robot 该类是JDK定义的电脑系统的抽象类,可以用来模拟实现鼠标点击与键盘输入等信息 简单实现一个自动抢票代码: Robot rt new Robot();//可以认为是操作间隔的停歇时间,比如等待页面加载,等弹框内容展示等 r…

vue tree禁用和多选变为单选

禁用的话和后台协调一下&#xff0c;参数中多返回一个disabled 多选变单选 在tree结构中加入一个方法 <el-treeaccordion:data"deptOptions":props"defaultProps"show-checkbox:expand-on-click-node"false":filter-node-method"filte…

windows bat 脚本实现FTP自动下载上传

windows bat 脚本实现FTP自动下载上传 1. 自动下载 # 示例&#xff1a;实现自动下载 echo Off echo open 192.168.137.102>>ftp.txt echo admin>>ftp.txt echo admin12345>>ftp.txt echo lcd D:\>>ftp.txt echo cd /admin/1>>ftp.txt echo bin…

k8s整合istio配置gateway入口、配置集群内部服务调用管理

一、 istio gateway使用demo kubectl apply -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata:name: ngdemo-gatewaynamespace: ssx spec:selector:istio: ingressgateway # use Istio default gateway implementationservers:- port:numbe…

码银送书第五期《互联网广告系统:架构、算法与智能化》

广告平台的建设和完善是一项长期工程。例如&#xff0c;谷歌早于2003年通过收购Applied Semantics开展Google AdSense 项目&#xff0c;而直到20年后的今天&#xff0c;谷歌展示广告平台仍在持续创新和提升。广告平台是负有营收责任的复杂在线平台&#xff0c;对其进行任何改动…

Mysql—修改用户密码(重置密码)

Mysql—修改用户密码&#xff08;重置密码&#xff09; 1、登录mysql 1 2 [rootlocalhost ~]# mysql -uroot -p123456 [rootlocalhost ~]# mysql -hlocalhost -uroot -p123456 如果忘记密码&#xff0c;则跳过MySQL的密码认证过程。步骤如下&#xff1a; 修改Mysql配置文件…

TypeScript教程(三)变量声明

一、变量声明 变量是一种使用方便的占位符&#xff0c;用于引用计算机内存地址&#xff0c;可以将变量看做存储数据的容器 命名规则&#xff1a; 1.变量名称可以包含数字和字母 2.除了下划线_和美元$符号外&#xff0c;不能包含其他特殊字符&#xff0c;包括空格 3.变量名…

使用GUI Guider工具在MCU上开发嵌入式GUI应用 (1) - GUI Guider简介及安装

使用GUI Guider工具在MCU上开发嵌入式GUI应用 (1) - GUI Guider简介及安装 受限于每篇文章最多只能贴9张图的限制&#xff0c;这个教程被拆分成了多篇文章连载发布&#xff0c;完整目录结构如下图x所示。后续会发布完整教程的pdf文件&#xff0c;敬请期待。 图x 完整教程文档…

机器学习 | Python实现KNN(K近邻)模型实践

机器学习 | Python实现KNN(K近邻)模型实践 目录 机器学习 | Python实现KNN(K近邻)模型实践基本介绍模型原理源码设计学习小结参考资料基本介绍 一句话就可以概括出KNN(K最近邻算法)的算法原理:综合k个“邻居”的标签值作为新样本的预测值。更具体来讲KNN分类过程,给定一个训…

网络安全(自学)

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全…

无服务器架构发布啦!

导读Serverless 1.15.2 已发布。The Serverless Framework (无服务器架构&#xff09;允许你自动扩展、按执行付费、将事件驱动的功能部署到任何云。 目前支持 AWS Lambda、Apache OpenWhisk、Microsoft Azure&#xff0c;并且正在扩展以支持其他云提供商。 Serverless 降低了…

nodejs+vue+elementui电影订票网站系统_wqc3k

电影订票系统在国内有很多值得借鉴的例子&#xff0c;功能也都趋于完善&#xff0c;因此此次电影订票系统将轻量化开发&#xff0c;要完成以下功能&#xff1a; &#xff08;1&#xff09;要支持完整的用户注册&#xff0c;登录功能&#xff0c;账号的管理通过管理员来实现。 &…