X态及Xprop解决策略

X态及Xprop解决策略

  • 1 X态是什么
    • 1.1 X态产生原因
    • 1.2 X态设计上避免发生
  • 2 X-Propagation选项
    • 2.1 Xprop策略--即仿真选项
    • 2.2 什么阶段使用X-prop
    • 2.3 Debug trace x

xprop是VCS中的编译参数,在项目中用法

tree                     {tb_top}         {xpropoff}
instance             {tb_top.dut}    {tmerge}
instance             {tb_top.dut}    {xpropon}
instance             {tb_top.dut.serdes_pinmux_be_u0.xxx.xxx.xxx}  {tmergeoff}

越早的发现bug,所消耗的成本也越低的,故VCS的X-Propagation功能可以更接近Gate-level的X态传播行为,是一种在后仿之前debug的低成本仿真策略。

1 X态是什么

X是不定态,亚稳态,可能为0/1/Z,常见于未复位的寄存器,锁存器和Memory;
X态出现在仿真中(包括RTL前仿真,门级后仿真及低功耗仿真),若仿真过程中出现X态,表明会有极大的Bug风险,要竭力避免;

  • X态传播:指X态作为触发/控制条件或者逻辑输入时,引起其他逻辑输出为X态。

1.1 X态产生原因

X态导致原因大致如下:
1.无初始化:未初始化的变量,比如logic/reg,在被复位或确定的值被锁定之前,保持X态;
2.信号多驱或总线竞争:将多个输入驱动到同一个变量上,多个驱动存在冲突时,表现X态;
3.位选择或数组索引越界返回X态;
4.模块输入端口未连接(未赋值或tie)
5.setup/hold timing violation:跨时钟域逻辑;
6.testbench注入X态;

1.2 X态设计上避免发生

1.使用二态变量;这个指的是使用wire和reg类型;在设计上;
2.设计上进行复位操作,控制通路寄存器必选带复位,数据通路寄存器可以不带复位;
3.验证tb_top例化DUT时接口input信号赋初值,一般是在tb_top层直接定义wire信号,然后进行例化连接,最后比如激励打的都是这个中间wire信号;
4.仿真时利用initreg和inimem选项对reg和Memory进行初始化;
5.RTL model中添加针对X的assertion,及时发现X态上报并消除;
6.if-else或case使用确定写法,或者assign + 表达式来替代;
if-else/case VS assign
RTL仿真中,对if-else/case及assign对X态不同的行为:
if(x) 默认x=0,走else分支,不传播X态;
case(x),若存在default分支,则走default分支,否则不会匹配到任何分支;
assign c = sel ? a : b; 若sel = x,则输出x,从而将X态传播出去;
从上面来看,if-else和case不能传播X态,无法暴露X态传播问题;assign +表达式的方式能够传递X态;另外从时序和面积角度来看,if-else和case会被综合为带有优先级的选择电路,不利于时序和面积,在纯组合逻辑下,使用assign;

2 X-Propagation选项

在RTL前仿真阶段,属于X-optimism,导致X态的Bug;但是会在门级仿真时暴露出来;
VCS的X-propgation功能提供更接近gate_level的X态传播行为,是一种在后仿真之前debug的低成本策略;门级仿真netlist仿真速度慢,可读性差,不利于debug。VCS的X-prop是一种Shift-left左移方案,添加该选项来在RTL仿真阶段对X态进行检查;

2.1 Xprop策略–即仿真选项

xprop检查有三种模式,按照从乐观到悲观的顺序:Vmerge–>tmerge–>xmerge;
vmerge:遵守Verilog/VHDL对于X态处理行为;–等同于不添加该选项;
tmerge: 接近实际硬件行为或门仿; --最常用;
xmerge:最悲观,一直传递下去;
本质上,-xprop是为了扩散X态传播,把不传播不定态的情形,强制传播出去,从而尽早暴露Bug;

always @(*) begin
if(*) begin
r = a;
end else begin
r = b;
end
end

vcs‑xprop[=tmerge|xmerge|xprop_config_file]
其中,xprop_config_file(这是一个带具体路径的文件) 用以针对特定 instance 进行特定模式的 xprop 监测或开关特定 instance 的 xprop 检测,其示例用法如下:

tree{top}
instance{top.A}{xpropOn};
instance{top.B}{xpropOff};
module{C}{xpropOff};
merge=tmerge;

Notes:
1.-xprop 一般不能跟 +vcs+initreg+0/1/random 同时使用,因为 +vcs+initreg+0/1/random 会把 Verilog 的变量、寄存器及 Memory 初始值设置为 0 或 1 等非 X 状态,这样就测不到初始 X 态了。
2.若未指定 -xprop,默认为 vmerge,即默认不存在 X 态传播问题,也不进行检查。
3.若定义了 -xprop 但未指定具体模式,默认为 tmerge,即采用接近真实电路的 X 态传播模式并进行检查。
Xprop查看
一方面最直观的就是在查看波形的时候顺带就check出来了。是最直接也是最经常使用的方法; 另外通过查看相关report来查看。
vcs 在编译、仿真两个阶段均提供了相关手段来检查相关 instance 的 xprop 开关情况:
若在编译阶段使能了 xprop,编译完成之后会生成一个 xprop.log 来报告 if/case 状态、always 边沿触发等条件的 xprop 检查开关情况。
simv 仿真阶段添加仿真选项 -report=xprop[+exit] 能生成 xprop_config.report,便于在仿真后对 xprop 检查情况进行确认。若采用 -report=xprop+exit,在检测完 xprop 状态情况后后立即终止仿真。

2.2 什么阶段使用X-prop

什时候打开Xprop检测:smoke–功能VO阶段完成;较后期收集覆盖率打开Xprop选项;
X态传播不能不做,但是也不宜早做;
一方面,验证初期datapath或sanity期间,并不想看到太多X态,影响功能debug,在这里默认不启用xprop;
另一方面,带有xprop是4态仿真,比不带xprop的2态仿真更慢;
RTL 仿真前期不开启 xprop,以尽快调通 sanity/smoke case 及主要 datapath。
RTL 仿真后期建议开启 xprop,提前排除部分 X 态。排除X态传播导致的芯片Bug,尤其是控制通路上的X态传播;

2.3 Debug trace x

trace X是指追踪X态产生的源头。利用Verdi自动追踪组合逻辑,锁存器,触发器等的X态传播源头。
Verdi Trace X有两种途径:一种是在Verdi GUI内Trace;一种是直接利用Verdi的TraceX工具直接Trace–不常用,可忽略。
Verdi GUI Trace
1.手动Trace X:
把出现 X 态的信号 A 拖到 nWave 窗口
nWave 窗口 Cursor 点在 X 态信号 0/1 -> X 跳变沿的地方
在源代码窗口左键双击该信号 A,追踪其 Driver
检查 A 的 Driver (控制信号、触发条件、逻辑输入等) 是否存在 X 态
重复以上步骤,直到找到 X 态产生的源头
2.自动Trace X
把出现 X 态信号 A 拖到 nWave 窗口
nWave 窗口Cursor 点在 X 态信号 0/1 -> X 跳变沿的地方
nWave 窗口右键单击该信号的波形,或源代码窗口右键单击该信号
选择 Trace X,弹出 Trace X Settings 窗口
窗口勾选所需的 Trace X 相关设置。默认 View Options 为 Flow View,此处我们也可以改为 nWave View
左键单击 Trace,开始 Trace X,Trace 结果一方面显示在 Flow/nWave 窗口内,一方面显示在 tTraceXRst 窗口内(Note 提示 X 的大致出现原因)
3.Verdi 的 traceX 工具
除了在 GUI 内进行 X 态追踪,Verdi 还提供了 traceX 工具来追踪 X 态。traceX 用法如下:
设置变量打开 traceX 工具,setenv VERDI_TRACEX_ENABLE
采用以下命令追踪 X 态
未提供 X 态信号列表:traceX -lca -ssf xxx.fsdb
提供了 X 态信号列表:traceX -lca -ssf xxx.fsdb -signal_file signal.list若需要手段加载 database,还需要添加选项 -dbdir simv.daidir
查看 trx_report.txt 查看 Trace 结果
X 态怎么处理?
如果 X 态没有传播,无需处理。
如果 X 态发生传播,但后续有 X 态保护电路,无需处理。
如果 X 态发生传播,且后续没有 X 态保护电路,需要从根源上消除 X 态。

Refer
【1】https://blog.csdn.net/Holden_Liu/article/details/117065321
【2】https://ic.coachip.cn/article/detail/383

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

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

相关文章

用户态与内核态切换

随笔记录 目录 1. 切换方式 2. 案例介绍 1. 切换方式 1. 用户态切内核态: 用户态切换到内核态的唯一途径——>中断/异常/陷入(陷入又可称作系统调用)2. 内核态切用户态: 内核态切换到用户态的途径——>设置程序状态字 PSW注:CPU中有…

使用curl命令在Linux上进行HTTP请求

在Linux系统中,curl是一个非常强大的命令行工具,用于发送各种类型的HTTP请求。通过简单的命令,你可以发送GET、POST、PUT、DELETE等请求,以及设置请求头、处理响应等。以下是一些使用curl进行HTTP请求的常见用法和示例。 1. 发送…

Unity中URP下实现深度贴花

文章目录 前言一、场景设置二、实现思路1、通过深度图求出像素所在视图空间的Z值2、通过模型面片的求出像素在观察空间下的坐标值3、结合两者求出 深度图中像素的 XYZ值4、再将此坐标转换到模型的本地空间,把XY作为UV来进行纹理采样 三、URP下实现1、通过深度图求出…

专业课120+总分380+海南大学838信号与系统考研经验分享-电子信息,信息与通信,人工智能,生物医学

今年专业课120,总分380顺利被海大录取,总结一下这一年来的复习经验,希望对大家复习有借鉴。特别提醒这两年专业课海南大学838信号与系统难度比较大,还考察了IDTFT,DTFT等,对离散域的考察颇多,不…

制造企业实施WMS仓储管理系统后的变革与挑战

随着市场竞争的日益激烈,制造型企业对于提高生产效率和降低运营成本的需求愈发迫切。在这一背景下,WMS仓储管理系统解决方案逐渐成为制造业企业的必备工具。然而,实施WMS仓储管理系统不仅意味着企业将迎来一系列的变革,还将面临一…

解决MySQL8.0本地服务器连接不上的问题

MySQL在同一个内网内,但是他人链接你的MySQL时候提示: Host xxx is not allowed to connect to this MySQL server 这通常是MySQL限制了用户允许访问的IP导致的,我们可以按照下面的步骤来接触这个限制。 办法一 进入mysql的bin目录&#xff…

Java 并发性和多线程2

四、如何创建并运行 java 线程 Java 线程类也是一个 object 类,它的实例都继承自 java.lang.Thread 或其子类。 可以用如下方式用 java 中创建一个线程: Tread thread new Thread(); 执行该线程可以调用该线程的 start()方法: thread.start(); 在上…

国内镜像源配置方法(包括临时和永久方法)

国内镜像源: 阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/豆瓣 http://pypi.douban.com/simplePython官方 https://pypi.python.org/simple/v2ex http://pypi.v2ex.com/simple/中国科学院 http://pypi.mi…

【算法题】50. Pow(x, n)

题目 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。 示例 1: 输入:x 2.00000, n 10 输出:1024.00000 示例 2: 输入:x 2.10000, n 3 输出:9.…

【算法题】49. 字母异位词分组

题目 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat&q…

git 提交符号

emojiemoji代码commit说明🎨 (调色板):art:改进代码结构/代码格式⚡️ (闪电):zap:提升性能🐎 (赛马):racehorse:提升性能🔥 (火焰):fire:移除代码或文件🐛 (bug):bug:修复 bug🚑 (急救车):ambulance:重要补丁✨ (火花…

PyTorch GPU利用率为0%(很低)

一、确保Pytorch与TorchVision是CUDA(GPU)版本 参考链接:【Xiang哥避坑指南】YOLOV5只在CPU跑不在GPU跑的问题。 在Python终端下操作: 1、Pytorch import torch print(torch.__version__) #上方的_是两个 杠杠2、TorchVision import torchvision prin…

flutter在windows环境搭建

下载flutter https://flutter.cn/docs/development/tools/sdk/releases 下载相应的版本 我放在C盘下: 环境变量 再加系统变量: PUB_HOSTED_URLhttps://pub.flutter-io.cn 如图 FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn 完成

在Ubuntu系统中,要优化文件句柄数、线程和网络

在Ubuntu系统中,要优化文件句柄数、线程和网络,通常涉及到系统限制和内核参数的调整。下面是一些常见的优化步骤,它们可以通过重启来应用: 优化文件句柄数(File Descriptors): 编辑 /etc/security/limits.c…

使用nginx+HTML2canvas将任意html网页转为png图片自定义张数

文章目录 概述网页的转换html2canvas的使用导入导入HTML2canvas库函数定义 nginx部署编写控制截图网页代码iframe 网页控制代码 测试说明 概述 本文简述如何使用nginxhtml2canvas将任意网页html转为png图片 网页的转换 如果是本地网页,直接进行nginx反向代理就行…

【springboot】sprinMVC练习

Spring MVC练习 1. 加法计算器练习 前端页面&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><t…

Go语言中的同步原语:ErrGroup、Semaphore和SingleFlight

1. 并发基础 并发是同时发生多个计算或事件的能力。并发通常通过同时执行多个任务或进程来实现&#xff0c;这些任务或进程共享相同的资源&#xff08;例如内存或处理器&#xff09;。并发使用的基本机制被称为锁。在Go语言中&#xff0c;锁是一个类型变量&#xff0c;它包含一…

ubuntu nginx安装部署

上传nginx-1.18.0.tar.gz mv nginx-1.18.0.tar.gz /usr/local/ #解压 tar -zxvf nginx-1.18.0.tar.gz #安装 cd nginx-1.18.0 #安装依赖包apt-get install build-essential zlib1g-dev libpcre3 libpcre3-dev libssl-dev libxslt1-dev libxml2-dev libgeoip-dev openssl libgd…

【开源】基于JAVA+Vue+SpringBoot的医院门诊预约挂号系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2 科室医生档案模块2.1.3 预约挂号模块2.1.4 医院时政模块 2.2 可行性分析2.2.1 可靠性2.2.2 易用性2.2.3 维护性 三、数据库设计3.1 用户表3.2 科室档案表3.3 医生档案表3.4 医生放号…

【目标检测】YOLOv5算法实现(七):模型训练

本系列文章记录本人硕士阶段YOLO系列目标检测算法自学及其代码实现的过程。其中算法具体实现借鉴于ultralytics YOLO源码Github&#xff0c;删减了源码中部分内容&#xff0c;满足个人科研需求。   本系列文章主要以YOLOv5为例完成算法的实现&#xff0c;后续修改、增加相关模…