欢迎来到半导体与芯片的世界 - 芯片验证
type: channel
link: http://bennyhe.cn/index.php/category/%E8%8A%AF%E7%89%87%E9%AA%8C%E8%AF%81/
items: UVM入门
items: CPU 系统级验证 —— 指令集验证 ——OpenHW core-v 验证环境及文件分析
items: 推荐一款好用的IC设计中生成register model的工具
items: Python在芯片中的应用：RTL自动生成、验证脚本、界面可视化等
items: systemverilog interface
items: 如何使用vsCode+Icarus verilog+GTKwave编写并仿真verilog
items: Vscode自动生成verilog例化
items: uvmgen的使用及其产生的UVM环境介绍
items: 后仿中$setup,$hold与$setuphold
items: 在verilog或者systemverilog中通过systemverilog获得环境变量setenv,getenv

UVM入门
type: item
date: 2026-01-08T11:10:51+08:00
description: 验证技术的发展历程这是我们作为一名合格验证人员装B必备，如下图所示:2000年：Verisity Design（现在的Cadence公司）引进了Verification Advisor（vAdvisor）采用了e语言，包含了激励的产生，自动比对的策略，覆盖率模型。e语言是面向对象语言，这是业界开始使用面向对象语言 进行测试平台的建立。2002年：Verisity公司公布了第一个验证库——e可重用方法学（eRM）。2003年：Synopsys公司公布了可重用验证方法学库（RVM），这个方法学采用了Synopsys公司的vera语言。2006年：Mentor公司公布了高级验证方法学（AVM）。这个方法学主要是采用了OSCI SystemC的事务抽象层方法学（TLM）标准，它是用SystemVerilog和SystemC两种语言实现的。2006年：Synopsys公司推出了验证方法学手册（VMM），这个是RVM从vera语言过度到SystemVerilog的方法学。2007年：Cadence公司推出了通用可重用验证方法学（URM），主要是从eRM从E语言过度到SystemVerilog的方法学，同时加入了TLM接口，工厂模式替换，配置机制，策励类等。2008年：Cadence公司和Mentor公司共同推出了OVM2010年：Synopsys公司推出了VMM1.2，基本上沿用了OVM的TLM通信机制，并采用了TLM2.0（OSCI最新的标准），采用OVM提出的implicit phase，并且将验证流程继续细化，工厂模式替换机制，建立类层次（建立parent关系）。并且在此基础上，提出了vmm_timeline的概念，方便各个phase之间实现跳转，增加phase或删除phase。增加了rtl_config等概念。Synopsys公司也随即宣布最新版本的VCS 同时支持UVM。2010年：ACCELLERA采用了OVM作为基础，推出了UVM验证方法学。同时引入了VMM的callbacks一些概念。作为业界方法学统一的一个雏形。2011年2月：Accellera通过了通用验证方法学1.0版，并得到三大厂商（Cadence，Synopsys和Mentor Graphics现英飞凌）的共同支持。此后Accellera陆续推出了UVM1.1, UVM1.1a,UVM1.1b,UVM1.1c,UVM1.1d这几个版本。2014年6月，Accellera有推出了通用验证方法学1.2版。目前UVM最新版是UVM-1800.2-2017-1.0（版本号命名都变了哈）UVM(Universal Verification Methodology) UVM几乎完全继承了OVM，同时又采纳了Synopsys在VMM中的寄存器解决方案RAL。UVM继承了OVM和VMM的优点，克服了各自的缺点，代表了验证方法学的发展方向。UVM介绍UVM是一个以SystemVerilog为主体的验证平台开发框架，验证工程师利用其可重用组件可以构建具有标准化层次结构和接口的功能验证环境。UVM是一个库，在这个库中，几乎所有的东西都是使用类(class)来实现的。类是面向对象编程语言中最伟大的发明之一，是面向对象的精髓所在。使用UVM的第一条原则是：验证平台中所有的组件都应该派生自UVM中的类。当要实现一个功能时，首先应该想到的就是从UVM的某个类派生出一个新的类，类中可以有成员变量，也可以有函数和任务，通过成员变量、函数或任务实现所期望的功能。对于验证方法学来说，分层的测试平台是一个关键的概念。虽然分层似乎会使测试平台变得更复杂，但它能够把代码分而治之，有助于减轻工作负担，而且重复利用效率提升。基于UVM的验证平台可以类似分为五个层次：信号层、命令层、功能层、场景层和测试层：如何学习UVMUVM1.2版本包含121个文件，311个类。从经验来说，我们搭建一个普通的UVM验证环境，大约需要编写10个文件，20个类左右。这里分享一下对初学者的个人建议：第一阶段-基础：学习UVM之前, 熟悉SV是必须的，关于SV的系统学习首推“绿皮书”。工作中“asic-world”这个网站可以作为我们的查询手册。第二阶段-学习：有了SV的基础和OOP的思想，我们就可以开始学习UVM了（很多人入门是看《UVM实战》-张强著 ）。这时我们需要了解UVM构架，各种component, phase管理机制等。最好配合实例代码一边看书一边敲代码做练习。第三阶段-应用：当然我们有的朋友会说："我现在的公司还没有用UVM来搭环境呀，怎么应用啊？" 但是，没有条件我们可以创造条件呀！ 网上这么多开源的IP，找一个自己感兴趣的，把自己当成验证主管，自己玩儿呗。或者把已经做过的项目再用UVM搭一遍（别说你没时间哦~第四…

CPU 系统级验证 —— 指令集验证 ——OpenHW core-v 验证环境及文件分析
type: item
date: 2026-01-08T11:07:05+08:00
description: 本文记录的相关源工程和文件为：core-v RISCV 核功能验证工程：https://github.com/openhwgroup/core-v-verifcore-v 验证策略：https://core-v-docs-verif-strat.readthedocs.io/en/latest/#core-v 系列核 cva6 工程：https://github.com/openhwgroup/cva6core-v 系列核 cv32e40p 工程：https://github.com/openhwgroup/cv32e40pLowRISCV Ibex 核工程：https://github.com/lowRISC/ibexcore-v RISCV 核相关说明文档：https://github.com/openhwgroup/core-v-docsRISCV ISA 指令流（instruction stream）生成器：https://github.com/openhwgroup/force-riscvcore-v 系列指令流（instruction stream）生成器：https://github.com/openhwgroup/core-v-isgsail 语言介绍：https://www.cl.cam.ac.uk/~pes20/sail/REMS 的 sail RISCV 开源项目：https://github.com/rems-project/sail-riscvopenHW 全称为 open-source hardware，是一个支持开源软件和硬件的非盈利组织。该组织开源的内容包括开源 CPU 核、相关 IP、工具和软件等。指令集验证指令集验证的需求能够使用操作数产生合法的基本整数运算指令在指令执行完成后能够检查通用寄存器的状态指令执行完成后能检查副效应，例如溢出等。指令集验证内容指令集的验证需要验证工程师思考该指令需要测试的特征是什么，为了确保指令的正确执行需要检查的内容是什么，为了确保该特征被测试需要进行哪些激励和配置等。验证的充不充分取决于验证人员对 CPU 微架构的理解和风险应对能力。（1）RISCV 基本指令定向测试设计出来的 CPU 首先需要兼容 RISCV 基本指令，即需要满足 RISCV 基本整数指令及相关标准指令集。主要测试的内容有：溢出检测及相关标志位下溢检测及相关标志位无指令执行的副效应，比如异常的通用处理寄存器变化，异常的条件代码使用 x0-x31 作为 rs1/rs2使用 x0-x31 作为 rdx0 寄存器的值始终为 0set/clear 所有立即数的比特位set/clear 源寄存器 rs1/rs2 的比特位根据 7/8 两条 set/clear 目的寄存器 rd 的比特位（2）自定义扩展指令定向测试对于自定义扩展指令集的验证，该验证需要修改相关的工具链并通过相关测试验证工具链的修改成功，再进行（1）中的测试。（3）随机约束测试对进行大量的随机指令测试指令集验证激励的种类指令集测试激励分为自检（self-checking）和预存（pre-existing）两种。自检测试激励运行时按照源文件中指令顺序依次，并同时将指令执行结果和参考值作检查，若出错则程序跳转到 fail，打断正常执行顺序，立即执行完成。类似的测试集有 riscv-tests、riscv-compilance-tests 等预存测试激励运行时不会打断执行顺序，执行的结果会和指令集模拟器（ISS）的结果作对比，最终统计对比的结果。类似的测试集有 riscv-dv 等指令集验证 pass/fail 的标志测试的 pass/fail 与上述激励的种类有关self checking：自检性质的测试激励在每条指令执行时就会同时将结果和参考值作对比，若失败则跳转到 failsignature check：特征检查，相对自检来说更加复杂深入。测试的结果将被用来计算该指令的某个特征，这将会和预先确定好的较标准特征作对比。采用该检查的为 riscv-complience-tests。check against ISS：与指令集模拟器对比检查。该情况下，testcase 并不知道测试的参考值，仅仅给 DUT 提供激励，testbench 会对比 DUT 和 ISS 的输出结果确定测试的 pass/fail。该检查较被经常使用，因为它是的 testcase 更加简单。采用该检查的如 riscv-dvcheck against RM：与参考模型对比检查，该检查方式与第三点类似，但相对 ISS 更加通用。通常用作 ISS 检测的补充。assertion check：通过断言判断是否执行出错。相关 CPU 核的验证工程cv32e40pCV32E40P (…

推荐一款好用的IC设计中生成register model的工具
type: item
date: 2026-01-07T14:07:00+08:00
description: 无意中发现一个开源的工具，使用systemRDL文件作为输入，可以生成寄存器相关的RTL module，UVM中使用的regmodel，C和verilog的头文件(包含寄存器某个字段的偏移以及mask bits)，以及html的文档。资源如下：https://github.com/zhajio1988/Open_RegModel生成的html文档示例如下：https://systemrdl.github.io/RALBot-html————————————————版权声明：本文为CSDN博主「XtremeDV」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。原文链接：https://blog.csdn.net/zhajio/article/details/102620859开源uvm reg model (UVM 寄存器模型)生成工具open-register-design-toolOrdt is a tool for automation of IC register definition and documentation. It currently supports 2 input formats:SystemRDL - a stardard register description format released by Accellera.orgJSpec - a register description format used within Juniper NetworksThe tool can generate several outputs from SystemRDL or JSpec, including:SystemVerilog/Verilog RTL code description of registersUVM model of the registersC++ models of the registersXML and text file register descriptionsSystemRDL and JSpec (conversion)Easiest way to get started with ordt is to download a runnable jar from the release area.Ordt documentation can be found here.注：nvdla中使用SystemRDL格式描述寄存器模型，并使用jar xxx ordt.jar ......生成uvm reg model————————————————版权声明：本文为CSDN博主「XtremeDV」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。原文链接：https://blog.csdn.net/zhajio/article/details/82870523

Python在芯片中的应用：RTL自动生成、验证脚本、界面可视化等
type: item
date: 2026-01-07T13:55:18+08:00
description: 今天还是这张图。最近一直在思考集成电路怎么与其它几个前沿领域相结合。今天来讲讲Python。Python其实不是人工智能、神经网络的专属语言，在芯片设计和验证领域也有非常多的应用。下面是一些的开源项目：RTL自动生成：https://github.com/nvdla/hw/blob/master/tools/bin/epython寄存器默型的自动生成：https://github.com/SystemRDL/systemrdl-compiler仿真脚本、回归脚本：https://github.com/zhajio1988/YASA自动生成UVM的方法：https://mp.weixin.qq.com/s/SvWRJBGggg0lqiD8YjEZ3QRISCV Core的仿真脚本：https://github.com/google/riscv-dv因为Python相对于其它语言如Perl，Tcl学习成本更低、资料更多、更容易上手，所以在实际项目中使用python的情况越来越多。当然并不是说Perl、Tcl不需要学了，老项目还需要继续维护。但是，打开大佬的代码后，却一脸懵逼。下面是Google RISCV Core验证项目的脚本run.py截图，大佬们都喜欢用Class来装逼，这个对于Python零基础或者初学者很不友好。函数还没学会，你叫我用class？整天看着UVM就已经够头疼的了，唉。连验证大佬炯哥的脚本也是。。。还有一大堆的import，望而生畏、望而却步。

systemverilog interface
type: item
date: 2026-01-04T16:53:00+08:00
description: systemverilog interface普通的模块使用法：注意我们这里只实现了部分功能。。。。不是完全的读写模块。。。。module mem_core( input logic wen, input logic ren, output logic mrdy=1, input logic [7:0] addr, input logic [7:0] mem_din, //写进mem output logic [7:0] mem_dout, //从mem读出 output logic status, input logic clk);logic[7:0] mem [7:0]; //初始化一个meminitial $readmemh("d:/init.txt",mem); //d:/init.txt 文件中是 @01 10 。//或者 assign mem [2'h01]=8'b00000111; 注意这里一定要用 initial 或者assign等语句，不能直接=task reply_read(input logic [7:0] data, integer delay); #delay; @(negedge clk) mrdy=1'b0; mem_dout=data; //从图中可看出这两句话几乎同时执行。 @(negedge clk) mrdy=1'b1;endtaskalways@(negedge ren) reply_read(mem[addr],10);endmodulemodule cpu_core( output logic wen=1, output logic ren=1, input logic mrdy, output logic [7:0] addr=0, input logic [7:0] cpu_din, output logic [7:0] cpu_dout, output logic status=0, input logic clk);task read_memory(input logic [7:0] raddr, output logic [7:0] data); @(posedge clk); ren=1'b0; addr=raddr; @(negedge mrdy); @(posedge clk); data=cpu_din; ren=1'b1; endtaskinitial beginlogic[7:0] read_data; read_memory(2'h01, read_data); $display("Read Result", $time,read_data);endendmodulemodule top; logic mrdy,wen,ren; logic[7:0] addr,d1,d2; wor status; logic clk=0;mem_core mem(., .mem_din(d1), .mem_dout(d2)); //采用对同名的信号做默认连接 cpu_core cpu(.*, .cpu_din(d2), .cpu_dout(d1));initial for(int i=0;i<=255;i++) #1 clk=!clk;endmoduleSystemverilog interface另外，ＳｙｓｔｅｍＶｅｒｉｌｏｇ引入一个重要的数据类型：ｉｎｔｅｒｆａｃｅ。其主要作用有两个：一是简化模块之间的连接；二是实现类和模块之间的通信；随着复杂度的提高，模块间互联变得复杂，SV引入接口，代表一捆连线的结构，具有智能同步和连接功能的代码；接口（ｉｎｔｅｒｆａｃｅ）为硬件模块的端口提供了一个标准化的封装方式。用ｉｎｔｅｒｆａｃｅ来封装接口的信号和功能。ｉｎｔｅｒｆａｃｅ的定义是独立于模块的，通过关键字ｉｎｔｅｒｆａｃｅ和ｅｎｄｉｎｔｅｒｆａｃｅ包起来。此外，ｉｎｔｅｒｆａｃｅ里面还可以带时钟、断言、方法等定义。 一个interface 也可以有input,output或是inout端口。当interface例化时，只有当变量或是线网声明在一个interface的端口列表中才能通过名字或是位置来互连.一种新加的和interface有关系的构造体是Modport 。它提供了module的interface端口和在特定的module中控制task和function使用的方向性信息。这些端口的方向可以在module中可以看到。接口使用无信号的连接方式。Modport将接口中信号分组并指定方向。就像下图中的黑色矩形块里面一样，黑盒，我们从外面看并不关心Modport的定义，只需要考虑clk。Systemverilog interfaceinterface membus(input l…

如何使用vsCode+Icarus verilog+GTKwave编写并仿真verilog
type: item
date: 2025-12-31T11:44:52+08:00
description: 用VS Code + iverilog + GTKwave仿真Verilog【下载地址】用VSCodeiverilogGTKwave仿真Verilog分享用VS Code + iverilog + GTKwave仿真Verilog本资源文件提供了一个详细的教程，指导如何在VS Code中使用iverilog和GTKwave工具进行Verilog代码的仿真 项目地址: https://gitcode.com/Resource-Bundle-Collection/9dfab本资源文件提供了一个详细的教程，指导如何在VS Code中使用iverilog和GTKwave工具进行Verilog代码的仿真。通过本教程，您将学会如何配置VS Code环境，编写和编译Verilog代码，并使用GTKwave查看仿真波形。内容概述VS Code部分安装VS Code并配置Verilog插件。创建Verilog源代码文件并进行编辑。iverilog部分下载并安装iverilog编译器。使用iverilog编译Verilog代码生成VVP文件。GTKwave部分使用GTKwave查看仿真生成的VCD文件。调整波形显示以方便分析。使用步骤安装VS Code首先，下载并安装VS Code。安装完成后，打开VS Code并安装Verilog插件，以便在编辑Verilog代码时获得语法高亮和错误检查功能。编写Verilog代码在VS Code中创建一个新的Verilog文件，编写您的Verilog代码。您可以参考教程中的示例代码，编写一个简单的计数器模块。编写测试文件创建一个测试文件（testbench），用于测试您的Verilog模块。测试文件中应包含初始化代码、时钟生成代码以及仿真结束的控制代码。编译Verilog代码使用iverilog编译器将Verilog代码和测试文件编译成VVP文件。编译命令如下：iverilog -o "test_tb.vvp" test_tb.v test.v运行仿真在命令行中运行生成的VVP文件，生成VCD波形文件：vvp test_tb.vvp查看波形使用GTKwave打开生成的VCD文件，查看仿真波形。您可以通过调整波形显示来分析仿真结果。注意事项确保iverilog和GTKwave已正确安装并配置好环境变量。在编写Verilog代码时，注意模块的输入输出定义和时序逻辑的正确性。在仿真过程中，可以通过调整测试文件中的参数来验证不同条件下的仿真结果。通过本教程，您将能够熟练使用VS Code、iverilog和GTKwave进行Verilog代码的仿真，为硬件设计提供强大的支持。【下载地址】用VSCodeiverilogGTKwave仿真Verilog分享用VS Code + iverilog + GTKwave仿真Verilog本资源文件提供了一个详细的教程，指导如何在VS Code中使用iverilog和GTKwave工具进行Verilog代码的仿真 项目地址: https://gitcode.com/Resource-Bundle-Collection/9dfab————————————————版权声明：本文为CSDN博主「邱蒙励」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。原文链接：https://blog.csdn.net/gitblog_06576/article/details/143385319

Vscode自动生成verilog例化
type: item
date: 2025-12-31T11:40:08+08:00
description: 前言veirlog模块例化的时候，辣么多的信号端子，手动例化又慢又容易出错，葵花妈妈开课啦，孩子手残老犯错怎么办？当然是脚本一劳永逸，妈妈再也不担心手残党。流程（1）在vscode中安装如下插件。（2）在电脑中安装python3以上的环境。下载地址：https://www.python.org/downloads/release/python-373/安装记得一定要勾选添加路径，记得管理员安装。重启你的电脑。在cmd窗口输入python即可验证是否安装成功！（3）安装chardet。为确保插件可用，这个需要安装。参考链接：https://blog.csdn.net/sinat_28631741/article/details/80483064方式一 源码按照：第一步：下载压缩文件，例如： 'chardet-3.0.4.tar.gz'； 第二步：解压文件到python安装位置下的‘site-packages’目录下，例如：‘D:\python2.7\Lib\site-packages’； 第三步：打开终端命令窗口，进入解压的‘chardet’目录下，执行命令：python setup.py install （4）修改插件的原始py文件，觉得开发者的py有瑕疵，让帅气的同事重新整了个，把以下代码替换进原始py文件即可。在打开v文件的vscode下按ctrl+p，输入instance可出现下述界面。替换此py文件的代码即可。 #! /usr/bin/env python ''' vTbgenerator.py -- generate verilog module Testbench generated bench file like this: fifo_sc #( .DATA_WIDTH ( 8 ), .ADDR_WIDTH ( 8 ) ) u_fifo_sc ( .CLK ( CLK ), .RST_N ( RST_N ), .RD_EN ( RD_EN ), .WR_EN ( WR_EN ), .DIN ( DIN [DATA_WIDTH-1 :0] ), .DOUT ( DOUT [DATA_WIDTH-1 :0] ), .EMPTY ( EMPTY ), .FULL ( FULL ) ); Usage: python vTbgenerator.py ModuleFileName.v ''' import random import re import sys from queue import Queue import chardet def delComment(Text): """ removed comment """ single_line_comment = re.compile(r"//(.*)$", re.MULTILINE) multi_line_comment = re.compile(r"/\*(.*?)\*/", re.DOTALL) Text = multi_line_comment.sub('\n', Text) Text = single_line_comment.sub('\n', Text) return Text def delBlock(Text): """ removed task and function block """ Text = re.sub(r'\Wtask\W[\W\w]*?\Wendtask\W', '\n', Text) Text = re.sub(r'\Wfunction\W[\W\w]*?\Wendfunction\W', '\n', Text) return Text def findName(inText): """ find module name and port list""" p = re.search(r'([a-zA-Z_][a-zA-Z_0-9]*)\s*', inText) mo_Name = p.group(0).strip() return mo_Name def paraDeclare(inText, portArr): """ find parameter declare """ pat = r'\s' + portArr + r'\s[\w\W]*?[;,)]' ParaList = re.findall(pat, inText) return ParaList def portDeclare(inText, portArr): """find port declare, Syntax: input [ net_type ] [ signed ] [ range ] list_of_port_identifiers return l…

uvmgen的使用及其产生的UVM环境介绍
type: item
date: 2025-12-31T11:19:00+08:00
description: 前言UVM是IC验证的一种方法学，利用UVM搭建的验证环境基本框架都类似，因此，可以通过脚本来生成UVM的验证环境基本框架。本文主要介绍synopsys公司，在vcs工具中自带的一个脚本uvmgen，通过这个脚本，可以自动产生一整套UVM的验证环境，或者也可以只生成其中的一个UVM组件。一、uvmgen的使用首先利用uvmgen这个脚本，产生一个完整的UVM环境；然后运行这个环境，解决一些系统、工具、UVM环境之间的一些兼容性问题。1.1 uvmgen产生一个完整UVM环境这里展示一下，如何通过uvmgen这个脚本，产生一个完整的UVM环境。 hefei@ubuntu:~$ which uvmgen /opt/synopsys/vcs_vO-2018.09-SP2/bin/uvmgen hefei@ubuntu:~$ uvmgen ------------------------------------------------------------ WELCOME TO UVM TEMPLATE GENERATOR ------------------------------------------------------------ UVM templates compatible to UVM 1.1/1.2 used. Using template from /opt/synopsys/vcs_vO-2018.09-SP2/etc/uvm_template/shared/lib/templates/uvm 1) Enter 1 to Create Complete Environment 2) Enter 2 to Generate Individual Template Select [1-2]: 1 Do you want to create your own methods [Instead of UVM shorthand macros] ? Select [ y/Y/n/N ][Default: n]: n Would you be associating UVM REG models in your environment class? enter (y/n) [Default: n]:y Enter Name of RAL Adapter:ral_ad1 Enter the environment name: top_env Do you want to create Agents? Select(y/Y/n/N) [Default: n]:y Enter Master agent data Enter name of master agent: mst Enter name of sequencer: sqr1 Enter name of driver: drv1 Enter name of monitor: mon1 Enter name of interface: intf1 Enter name of the transaction: tr1 Is this transaction class extended from a BU class? enter (y/n): n Enter Slave agent data Enter name of slave agent: slv Enter name of sequencer: sqr2 Enter name of driver: drv2 Enter name of monitor: mon2 Enter name of interface: intf2 Do you want to use same transaction class for master and slave agents ? enter (y/n):y Choose one of the following ral bfm: 1) RAL sequence adapter, single domain 2) RAL sequence adapter, multiplexed domains select [1-2]:2 Enter Name of second RAL Adapter:ral_ad2 Enter Driver information for the slave agent slv :: Choose one of following driver available 1) Driver, PUSH DRIVER (uvm_push_driver) 2) Driver, PULL DRIVER (uvm_driver) Select [1- 2] [Defau…

后仿中$setup,$hold与$setuphold
type: item
date: 2025-12-30T13:50:50+08:00
description: 在sdf2.1版本中，只能用$setup，$hold和$recovery，$hold。在sdf3.0版本中，增加了$setuphold，$recrem，$removal。分开描述的$setup、$hold、$recovery、$removal不支持negative value。如果要标注负值只能用合起来的$setuphold和$recrem。某工艺的verilog仿真库 $hold(posedge T &&& (shcheckTDlh=== 1'b1), posedge D &&& (shcheckTDlh=== 1'b1),1.0); $hold(posedge T &&& (shcheckTDlh=== 1'b1), negedge D &&& (shcheckTDlh=== 1'b1),1.0); $setup(posedge D &&&(shcheckTDlh === 1'b1), posedge T &&& (shcheckTDlh=== 1'b1),1.0); $setup(negedge D &&&(shcheckTDlh === 1'b1), posedge T &&& (shcheckTDlh=== 1'b1),1.0); $recovery(posedge S,posedge T,1.0); $removal(posedge S,posedge T,1.0);对应3.0版本的SDFTIMINGCHECK (WIDTH (negedge S) (0.103::0.103)) (REMOVAL (posedge S) (posedge T)(0.140::0.140)) (RECOVERY (posedge S) (posedge T)(0.000::0.000)) (WIDTH (negedge T) (0.078::0.078)) (WIDTH (posedge T) (0.094::0.094)) (SETUP (posedge D) (COND shcheckTDlh===1'b1(posedge T)) (0.000::0.000)) (SETUP (negedge D) (COND shcheckTDlh===1'b1(posedge T)) (0.016::0.028)) (HOLD (posedge D) (COND shcheckTDlh===1'b1 (posedgeT)) (0.043::0.049)) (HOLD (negedge D) (COND shcheckTDlh===1'b1 (posedgeT)) (0.009::0.010)) )另一个工艺的verilog仿真库 $setuphold (posedge CP, posedge D, 0, 0,notifier,,, delayed_CP, delayed_D); $setuphold (posedge CP, negedge D, 0, 0,notifier,,, delayed_CP, delayed_D); $recovery (posedge SDN, posedge CP, 0,notifier); $hold (posedge CP, posedge SDN, 0,notifier);对应的2.1版本的SDF： (TIMINGCHECK (WIDTH (negedge SDN) (1.404::1.404)) (HOLD (posedge SDN) (posedge CP)(-0.198::-0.198)) (RECOVERY (posedge SDN) (posedge CP)(0.267::0.267)) (WIDTH (negedge CP) (0.425::0.425)) (WIDTH (posedge CP) (0.440::0.440)) (SETUP (posedge D) (posedge CP)(0.057::0.057)) (SETUP (negedge D) (posedge CP)(0.082::0.082)) (HOLD (posedge D) (posedge CP)(-0.048::-0.048)) (HOLD (negedge D) (posedge CP)(-0.013::-0.013)) )对比两个版本的SDF可以看出3.0的SDF用$removal代替了$hold。第一个verilog仿真库，采用了分开的$setup和$hold，$recovery和$removal。第二个库采用了合起来的$setuphold，但$recovery和$hold还是分开的。所以，第一个库不支持负值的标注；第二个库$setup和$hold支持负值，而$recovery和$hold不支持负值。在SDF…

在verilog或者systemverilog中通过systemverilog获得环境变量setenv,getenv
type: item
date: 2025-10-22T19:43:00+08:00
description: 在芯片验证的仿真中，有时候需要从文件中加载一些数据，比如激励、初始化数据、code等等，这些文件路径可以用绝对路径，当然为了其他人也可以用，最好用相对路径，这就需要用到环境变量来做路径的前半段。在module中得到或设置系统环境变量需要用到systemverilog的DPI-C，import C函数，然后在module中的块语句中调用C函数。步骤如下：在要获得环境变量的文件中 import setenv和getenv如下所示，把这两个函数import进去，不需要定义对应的C函数import "DPI-C" function int setenv(input string env_name, input string env_value, input int overwrite);import "DPI-C" function string getenv (input string env_name);直接使用getenv, setenv来获得和设置环境变量module mem read( input [8*200-1: O] mem_file )； initial begin $display("mem_file is %Os", mem_file); end endmodule module dut ( input clk, input wire [31:0]addr, output [31:0] rdata, input [31:0] wdata, input wire wr ); string path; initial begin setenv("PRJDIR", "/project/uart", 1); path = getenv( "PRJDIR"); $display("PRJDIR is %Os", path); setenv( "PRJDIR", "/project/sp", 1); path = getenv( "PRJDIR"); $display("PRJDIR is %0s", path); end mem_read u_mem_rd(.mem_file(path)); endmodule————————————————版权声明：本文为CSDN博主「甲六乙」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。原文链接：https://blog.csdn.net/m0_38037810/article/details/126136552