X态及Xprop解决策略

本文介绍了X态在模拟和设计中的概念,探讨了X态产生的原因,以及如何通过Xprop功能在VCS中进行低成本的debug仿真策略。重点讲解了Xprop选项的不同模式,何时使用X-prop进行检查,并提到了Debugtracex工具用于追踪X态源头的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

<think>好的,我现在需要帮助用户了解芯片中的X传播问题。首先,我得确认自己对X的理解是否正确。X,也就是未知状,通常在硬件描述语言(如Verilog或VHDL)中使用,表示信号的不确定值。这可能出现在未初始化的寄存器、多驱动冲突或者某些逻辑错误的情况下。 接下来,用户可能想知道X在仿真中的传播机制。我需要解释当某个信号为X时,它如何影响后续的逻辑门和电路模块。比如,与门的一个输入是X,另一个是0,那么输出应该是0,因为0与任何值都是0。但如果是或门,输入X和1,结果应该是1。不过,对于更复杂的逻辑,比如异或门,输入X和0,输出可能保持X,因为不确定另一个输入的值。这部分可能需要查证,避免错误。 然后,X传播对芯片设计的影响也很重要。用户可能关心如何避免X在仿真中的扩散,因为这会导致仿真结果不可靠,掩盖真正的问题。需要提到验证方法,比如在仿真前确保所有寄存器正确初始化,避免多驱动,使用同步复位而不是异步复位,以及使用X传播检查工具。 另外,实际硬件中X的行为可能与仿真不同,这可能让用户困惑。比如,在真实芯片中,未初始化的寄存器可能呈现随机0或1,而不是X。因此,仿真中的X传播问题可能不会直接对应到硬件故障,但可能隐藏设计缺陷,需要特别注意。 可能还需要举例子说明X传播的情况,比如一个未初始化的寄存器在仿真中导致后续逻辑全部为X,从而无法检测到实际功能错误。或者多驱动总线冲突导致X,影响整个系统的仿真结果。 需要确保用中文表达清晰,结构层次分明,分点说明。同时,按照用户的要求,行内公式用$...$,独立公式用$$...$$。不过目前的内容可能不需要太多数学公式,但如果有涉及逻辑运算的部分,可能需要用LaTeX表达,比如逻辑门的输出公式。 还要检查是否有遗漏的关键点,比如X在RTL设计和门级仿真中的不同表现,或者工具如何处理X优化。此外,可能提到形式验证在检测X传播中的应用,或者仿真器中的X优化选项。 最后,总结X传播的重要性,强调设计验证中处理X的必要性,以及如何有效避免由此引发的仿真错误,确保设计的正确性。</think>芯片设计中的**X(未知状)**传播是仿真验证中的一个关键问题,以下从概念、传播机制及影响三个方面逐步解析: --- ### 一、X的定义 X在硬件描述语言(如Verilog/VHDL)中表示信号值**未知或不确定**,常见于: - **未初始化的寄存器**(如未赋初值的触发器) - **多驱动冲突**(多个模块同时驱动同一信号) - **逻辑计算错误**(如除以零、未连接的输入) --- ### 二、X传播机制 当信号被赋予X时,其后续逻辑计算会基于**悲观原则**传播不确定性。例如: 1. **与门(AND)** 输入A=1,B=X → 输出Y= X $$ Y = A \cdot B = 1 \cdot X = X $$ 2. **或门(OR)** 输入A=0,B=X → 输出Y= X $$ Y = A + B = 0 + X = X $$ 3. **复杂逻辑** 若X经过多级逻辑(如加法器、状机),可能导致整个模块输出变为X,掩盖实际错误。 --- ### 三、X传播的影响 1. **仿真可靠性下降** X可能覆盖真实信号值,导致无法检测实际设计缺陷(如时序违例)。 2. **验证效率降低** 仿真波形中出现大量X,需额外时间定位根源。 3. **硬件行为差异** 实际芯片中X可能表现为随机0/1,而仿真中的悲观传播会夸大问题。 --- ### 四、解决方法 1. **初始化所有寄存器** 在复位阶段明确赋初值,避免未初始化状。 ```verilog always @(posedge clk or posedge reset) begin if (reset) reg <= 0; // 明确复位为0 else reg <= data_in; end ``` 2. **避免多驱动冲突** 确保同一信号仅被单一驱动源控制(如使用三总线需严格管理)。 3. **使用X检查工具** 工具如Synopsys VCS提供`xprop`模式,可模拟X传播并生成报告。 4. **同步复位优于异步复位** 异步复位易在释放时引入亚稳,导致X。 --- ### 五、实例分析 假设一个未初始化的计数器输出X: - **错误传播路径**: 计数器 → 地址生成器 → 存储器读写 → 系统崩溃 - **解决方法**: 在计数器代码中添加复位逻辑,确保仿真和硬件行为一致。 --- ### 总结 X传播是芯片验证中必须管控的问题,通过严格的初始化、代码规范及工具辅助,可显著提升仿真可信度,降低流片风险。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值