使用$test$plusargs提高RTL验收速度

verilog仿真测试(一)$test$plusargs 和 $value$plusargs $ test $ plusargs和 $ value $ plusargs作为进行 Verilog 和 SystemVerilog仿真运行时调用的系统函数: 1、可以在终端仿真命令中直接赋值,避免了调换参数带来的频繁编译问题。 2、不局限于不同仿真器对于参数在仿真命令中定义格式的不同 (一)使用宏定义的条件编译有何缺点? 例如: initial begin `ifdef dumpon $du... 阅读详情

0 前言

这段时间在整合一个小ip,因为要验证每个feature是否可行,需要用testbench + C语言的方式进行仿真验证,由于每种feature不仅要在C语言中修改寄存器配置,还要再testbench修改寄存器的配置,这导致每验证一种feature既需要修改C语言,也需要修改testbench,非常繁琐

并且也不想把所有的feature写在一个testbench中(仿真时间会变长很多,尤其是需要dump波形的时候),如果验证完一个feature后,把调教好的testbench注释掉,一番注释下来,看着也恶心,并且等所有feature都搞好后,仿真的时间还是很长

于是就希望能有一种方式,在验证不同的feature时可以吃不同的 testbench,一番搜索下来,找到了$test$plusargs的方法

1 语法介绍

先捋清两个词:plusargs、plusargs_string

  • plusargs:仿真时添加的参数
  • plusargs_string:编译时提供的字符串

上面提到两个词,编译和仿真,以vcs为例,整个执行过程主要分为两步,编译和仿真(irun/xrun有三步,编译、细化elaborate、仿真)

编译的过程是检查语法、展开所有的参数、宏以及include的文件等等;仿真的过程我的理解就是打入设定的激励,验证功能是否符合预期

vcs成功编译后会生成一个可执行文件simv,如下图

在执行simv即可进行仿真

开始介绍主角,直接抄文档中的例子了

initial begin
    if ($test$plusargs("HELLO")) $display("Hello argument found.");	
	if ($test$plusargs("HE")) $display("The HE subset string is detected.");	
	if ($test$plusargs("H")) $display("Argument starting with H found.");
	if ($test$plusargs("HELLO_HERE"))$display("Long argument.");
	if ($test$plusargs("HI")) $display("Simple greeting.");
	if ($test$plusargs("LO")) $display("Does not match.");
end

在上面这段代码中,$test$plusargs("HELLO")中的HELLO是plusargs_string,也就是编译时提供的字符串,编译完成后,在进行仿真时(执行simv),+不同的plusargs会打印不同的内容

只有当plusargs_string的内容完全匹配plusargs的部分或全部内容时,$test$plusargs()会返回一个非0的整数

原文如下:

原文的plusargs是HELLO,并给出了执行结果

2 示例

做个实验测试一下,代码如下:

module tb;

   initial begin
      $display("*********************\n");
      
      if($test$plusargs("test"))
		$display("\t test found \n");
      if($test$plusargs("test_pattern"))
		$display("\t test_pattern found \n");
      if($test$plusargs("te"))
		$display("\t te found \n");
      if($test$plusargs("taa"))
		$display("\t taa found \n");

      
      $display("*********************\n");
      #10;
      $finish;
      
   end
   
endmodule

编译之后生成可执行文件 simv,然后执行simv +test

仿真结果如下

在上面的例子中,只有test和te部分或全部匹配test,因此只打印了这两个语句的内容

3 多种情况的testbench怎么写

就像开头说的情况,我需要多种testbench如何借助这种方法实现呢,思路如下:

  1. 针对不同的情况,写多份配置过程,并保存在不同的文本中,比如需要三种配置,可以写三份文本,并保存为test_1.sv, test_2.sv, test_3.sv
  2. 在testbench中,利用 t e s t test testplusargs include这三个文本

给出一个简单的模板

module tb;
    /*  此处省略tb中clk、dump等等内容  */
	initial begin
        if($test$plusargs("test_1"))
            `include "./test_1.sv";
        
        if($test$plusargs("test_2"))
            `include "./test_2.sv";
        
        if($test$plusargs("test_3"))
            `include "./test_3.sv";
    end	
endmodule

在仿真时,通过+不同的plusargs就可以执行不同testbench了

交互系统函数$test$plusargs()与$value$plusargs ——字符串函数 $sformatf()与$sformat()的区别与用法 字符串在验证平台中是经常被使用的,今天我们来说说在SystemVerilog中非常重要和常用的sformatf()/sformatf()/sformatf()/sformat()函数,他们是什么含义?如何用?如何妙用? 01 首先Jerry和大家解释下这两个函数什么含义。看下这段代码: string jerry_string; string jerry_string_r; $sformat(jerry_string , “jerry_face_score==%0d” , 100); $di 阅读详情

相关推荐

Verilog仿真与调试实战:从语法陷阱到跨时钟域处理

硬件描述语言(HDL)是数字电路设计的核心工具,它通过代码描述硬件行为,最终映射为FPGA或ASIC中的实际电路。其工作原理在于将抽象的逻辑描述转化为门级网表,再通过综合与布局布线实现物理连接。掌握HDL不仅关乎功能实现,更直接影响电路的时序、面积和功耗等关键指标。在数字系统设计中,跨时钟域处理、时序约束和仿真验证是工程师必须面对的技术挑战,它们直接决定了设计的可靠性与性能。本文聚焦Verilog开发中的常见陷阱,深入解析阻塞赋值与非阻塞赋值的本质区别、锁存器推断的成因与危害,并探讨仿真时间片、Delta

weixin_34211761的博客 765

Verilog之“$test$plusargs和$value$plusargs用法小结“

Abstract testtesttestplusargs和valuevaluevalueplusargs作为进行Verilog和SystemVerilog仿真运行时调用的系统函数,可以在仿真命令中直接通过进行赋值的方式将参数传递进入到设计中,并且不局限于不同仿真器对于参数在仿真命令中定义格式不同的限制,也避免了调换参数带来的频繁编译等问题。使用这两条函数对于搭建测试平台有一定的便利,同时对于理解Factory中用例是如何传递进ProxyClass有一定的帮助。 本文将对testtesttestplusar

coachip的博客 1712

VCS仿真选项深度解析:从新手到高手的效率提升指南

在数字芯片设计与验证领域,仿真工具是验证工程师的核心生产力工具。其工作原理在于通过编译和运行两个阶段,将硬件描述语言转化为可执行的仿真模型,从而预测芯片在实际硅片上的行为。掌握仿真工具的高级配置能力,对于提升验证效率、缩短项目周期具有关键的技术价值。尤其在处理大规模SoC设计时,合理的仿真选项配置能显著优化仿真速度、内存占用和调试体验。本文聚焦于Synopsys VCS这一业界标准仿真器,深入剖析其核心仿真选项的分类、设计逻辑与实战配置技巧,涵盖调试访问、性能优化、覆盖率收集等关键场景,帮助工程师从被动使用

weixin_33868027的博客 438

verilog仿真测试中的参数传递——$test$plusargs和$value$plusargs

我们在进行verilog仿真时,经常喜欢采用宏定义,来做条件判断,但是通过宏定义做条件判断的这种方法,存在很大的弊端,就是条件改变的时候,需要重新编译,这样会导致,在项目后期进行回归测试和后仿的时候,很多时间都浪费在重复编译上面,效率非常低下。为了提高仿真效率,建议采用系统函数 $test$plusargs和$value$plusargs来实现,仿真命令到仿真环境之间的,条件判断和参数的传递。`endifend。

hh199203的博客 8186

VCS仿真命令实战指南:从编译优化到调试技巧

数字芯片验证是确保集成电路功能正确的关键环节,其核心原理是通过仿真工具模拟设计在特定激励下的行为。仿真器的性能与调试能力直接影响验证效率与项目周期。在工程实践中,Synopsys VCS作为业界主流编译型仿真器,其丰富的命令行选项为性能调优与问题定位提供了强大支持。通过精细控制编译选项(如-debug_access与-fast)、合理配置覆盖率收集(-cm)以及运用交互式调试(UCLI),工程师能在仿真速度、内存占用与调试可见性之间取得最佳平衡。这些技术对于处理数亿门级网表仿真、定位异步时序问题等复杂场景具

weixin_30458043的博客 409

Verilog $readmemb/$readmemh 在ModelSim中的实战应用与避坑指南

在数字电路仿真与FPGA验证中,存储器初始化是连接软件数据与硬件行为的关键环节。其核心原理是通过系统任务将外部数据文件加载到设计的寄存器或存储器模型中,从而构建准确的测试激励或初始化内容。这项技术的核心价值在于极大地提升了验证效率与可靠性,避免了手动编写海量测试向量的繁琐与易错。在实际工程中,它广泛应用于仿真测试激励生成、Block RAM初始化、以及系统级的内存映射验证等场景。本文将聚焦于Verilog中两个最常用的系统任务——$readmemb和$readmemh,结合ModelSim/QuestaSi

weixin_30411819的博客 463

VCS后仿真中delay_mode_zero指令的原理与应用

在数字芯片验证领域,时序仿真是确保设计功能正确性的关键技术。Verilog仿真器通过处理不同的延迟模型(包括分布式延迟、模块路径延迟和零延迟模式)来模拟电路行为。其中,零延迟模式通过忽略时序参数显著提升仿真效率,特别适用于大型SoC验证和算法迭代场景。Synopsys VCS工具的delay_mode_zero编译选项正是实现这一优化的核心技术,它能在保持非阻塞赋值语义的同时,通过消除延迟计算开销来加速验证流程。工程实践表明,该技术可提升仿真速度30%-50%,常与SDF反标技术配合使用,形成高效的两阶段验

weixin_30932215的博客 447

#systemverilog# $test$plusargs与$value$plusargs 的使用

1、$test$plusargs(string) 在对verilog代码进行编译时,我们会在代码中引入`ifdef, `elsif, `endif等条件编译指令,然后在编译时指定宏来对编译代码范围进行控制。系统函数$test$plusargs的目的就是用来替换这些条件编译指令的。 在使用时,该函数会判断参数string是否定义,从而返回0或非0。VCS User Guide上例子如下: initial if ($test$plusargs("postprocess")) ...

那么菜的博客 3453

SystemVerilog调试必备:$display打印格式控制全解(含%m、%p、%t等高级用法)

本文深入解析SystemVerilog中$display的高级格式化技巧,包括%m、%p、%t等特殊字符的用法,帮助工程师在复杂验证环境中快速定位问题。通过模块层次追踪、复合数据类型可视化和精确时间控制等场景化应用,显著提升调试效率。掌握这些技巧可以大幅减少调试代码量,优化日志可读性。

weixin_30414305的博客 334

一文搞懂 RC Correlation Scale Factor 的生成与应用

pre-route 用的是统计估算模型,post-route 用的是详细布线提取,signoff 用的是第三方 QRC 或 StarRC——三个工具,三套参数体系,结果自然天差地别。不同 RC corner(rc_worst/rc_best/rc_typical)对应不同的工艺角和温度环境,每个 corner 的 R/C 偏差比例不同,必须分别生成和应用各自的 scale factor。别被名字骗了,这个工具专门干一件事——统计拟合两组 SPEF 之间的偏差,自动推荐最优 scaling factor。

weixin_47770727的博客 561

命名管道和匿名管道

我们知道进程间是可以通信的。可以达到数据传输、资源共享、事件通知、进程控制等目的。进程间通信主要包括管道、系统IPC,套接字等。 管道分为三种: 普通管道:一是单工,只能单向传输 ,二是仅能在父子进程或者兄弟进程中使用。 流管道:去除了第一种限制,为半双工,可以双向传递, 命名管道:去除了第二种限制 ,可以在很多并不相关的进程 中进行通信。 1、普通管道 int pipe(int f...

ffsiwei的博客 1万+

避开SystemVerilog打印的那些‘坑’:从%z处理X/Z值到域宽设置的实际避坑指南

本文深入探讨SystemVerilog打印中的常见问题,从X/Z值的正确处理到文件I/O的数据完整性,再到域宽设置和转义字符的隐藏风险。通过实际代码示例和最佳实践,帮助开发者避开打印陷阱,提升调试效率和验证质量。特别关注数据格式控制和特殊字符处理等关键技巧。

weixin_30825199的博客 413

【Educoder作业】※ 数字图像——绿幕抠像

这次作业比上一篇博客基本得多,大多都是基础函数的运用。没啥说的,就整个sizesizesize即可。 T2 获取一个像素 T3 图像反色 T4 修改透明度 ′RGBA′'RGBA'′RGBA′也是一种图像格式 T5 抠图 T6 添加场景 这个主要是pastepastepaste函数里面的maskmaskmask参量没整明白,转载一篇博客供参考。...

JZYshuraK的博客 7571

系统函数$test$plusargs() 、$value$plusargs()

系统函数$test$plusargs() 、$value$plusargs()

weixin_44910619的博客 830

CH32V IAP跳转避坑指南:为什么你的APP跳不过去?从mstatus寄存器配置到函数属性详解

本文深入解析CH32V系列MCU的IAP跳转机制,从mstatus寄存器配置到函数属性优化,详细讲解如何避免APP跳转失败。文章涵盖地址准备、模式切换、跳转执行等关键步骤,并提供调试技巧与实战案例,帮助开发者快速解决CH32V IAP跳转中的常见问题。

weixin_30955617的博客 141

从业务角色到工作台:一步步创建 SAP Fiori Launchpad Space 与 Page

SAP S/4HANA Launchpad 配置优化指南:从业务角色出发构建高效工作台 本文针对S/4HANA项目中用户普遍反映的"入口难找"问题,提出基于Spaces和Pages的系统化解决方案。通过"以工作岗位为中心"的设计理念,将Launchpad信息架构重构为:一个业务角色对应一个Space,每个Space包含1-5个Page,Page内按任务划分2-5个Section,每个Section放置3-7个Tiles。文章详细阐述了从Business Role入手配

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 230

$test$plusargs 和 $value$plusargs

$test$plusargs 和 $value$plusargs

m0_49911637的博客 1346

Open-Sora代码详细解读(1):解读DiT结构

目前开源的DiT视频生成模型不是很多,Open-Sora是开发者生态最好的一个,涵盖了DiT、时空DiT、3D VAE、Rectified Flow、因果卷积等Diffusion视频生成的经典知识点。本篇博客从Open-Sora的代码出发,深入解读背后的原理。

沉迷单车的追风少年 2265

认识系统函数$test$plusargs与$value$plusargs

说明:系统函数的介绍我参考的是VCS User Guide和IEEE Verilog-2005标准,不同编译器可能不太一样。1、$test$plusargs(string)    在对verilog代码进行编译时,我们会在代码中引入`ifdef, `elsif, `endif等条件编译指令,然后在编译时指定宏来对编译代码范围进行控制。系统函数$test$plusargs的目的就是用来替换这些条件编...

kevindas的博客 1万+

什么是 SAP ABAP AMDP?

SAP HANA是SAP开发的一种内存数据库管理系统,它具有出色的性能和处理大规模数据的能力。为了充分利用SAP HANA的性能,SAP引入了AMDP技术,以便将数据库操作推送到数据库服务器执行,从而减少数据传输和处理时间。AMDP方法通常需要输入参数和输出参数。输入参数用于传递数据到SQLScript代码,而输出参数用于接收SQLScript代码的结果数据。ENDMETHOD.ENDCLASS.我们定义了一个输入参数来传递销售订单数据,以及一个输出参数来接收计算结果。ENDMETHOD.

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 908

微信小程序 - 最新图片组拖拽排序更换位置功能,类似微信朋友圈九宫格图片的拖动排序效果,微信小程序实现九宫格图片拖拽调换位置,小程序详细实现图像拖曳拖动切换位置排序功能(详细示例代码,一键复制开箱即用

微信小程序,wechat,小程序,图片排序,图像排序,九宫格拖拽排序,拖曳,拖动,拖拽,仿微信朋友圈,朋友圈宫格图片排序,微信朋友圈图片拖动排序效果,实现九宫格图片拖拽,图像拖拽排序组件插件,小程序实现拖拽图片切换图片位置,图片拖动互换位置,图像拖拽切换位置,九宫格图片组合拖动排序,交换九宫格图片的位置,小程序上传图片后,如何实现拖拽排序功能,小程序怎么实现图片拖拽排序,微信小程序图片上传,九宫格拖拽组件,选择图片并拖动_微信小程序图片拖拽,微信小程序长按拖拽排序,图像的拖拽移动,多图拖拽排序功能,实现九宫

✅ 精选推荐文章 4455

verilog $test$plusargs和$value$plusargs

我们在进行verilog仿真时,经常喜欢采用宏定义,来做条件判断,但是通过宏定义做条件判断的这种方法,存在很大的弊端,就是条件改变的时候,需要重新编译,这样会导致,在项目后期进行回归测试和后仿的时候,很多时间都浪费在重复编译上面,效率非常低下。

2301_76563419的博客 1326

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

$test$plusargs(),$value$plusargs()

如果验证平台是人类的宠物,他们就是人与宠物之间沟通的钥匙。

weixin_44526273的博客 1292

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

$test$plusargs(),$value$plusargs()使用注意,学习笔记

$test$plusargs(),$value$plusargs()使用注意,学习笔记 在项目开发中,遇到了一个问题,我们的共用文件中有一个parameter类型的变量,用来定义时钟周期,由于这个文件是通用的时序信号生成文件,所以不建议直接在这里修改这个变量的值。 最直接的办法是,通过宏来定义这个parameter的值,在运行我自己的test的时候,有我自己的宏来控制这个值。 我在想有没有什么办法能够不修改这个文件,而通过编译时在编译指令里加一些东西来修改这个值,一番讨论后,虽然没有找到合适的方法,不

meow_shi的博客 1306

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

verilog $test$plusargs和$value$plusargs的使用

使用宏定义也可以达到上述目的.但使用宏定义的缺点是: 修改DEL_A和DEL_B的设置时, 需要重新编译, 直接修改simv参数无效.module tb;logic clk;#0 clk = 0;reg b0, b1;a0 = 1'b0;a1 = 1'b1;b1 = 1'b1;

编程驴子的博客 827

systemverilog系统函数$test$plusargs和$value$plusargs

摘要:IC验证中,$test$plusargs和$value$plusargs是两个关键系统函数,用于运行时参数传递。$test$plusargs用于检测命令行是否存在特定字符串(前缀匹配),作为开关使用;$value$plusargs则能解析并存储参数值,支持多种格式转换(%d、%h、%s等)。两者区别在于前者仅判断存在性,后者可传递具体数值。VCS中"-"参数面向仿真器配置,"+"参数供用户代码调用。参数类型由代码中的格式说明符决定,仿真器根据格式强制转换字符串值

IC验证及芯片SOC知识分享 1188
上一篇: pullup和pulldown在verilog中的使用方法
下一篇: 分享一个RS触发器的趣味介绍
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值