学习一下simulation 仿真中的x态仿真

X态Verilog行为

在RTL电路仿真中X态表示高低电平不确定的不定态,前仿产生x态的原因:

  1. 四态逻辑的初始值为x态,且在复位时没有将其复位掉。
  2. 数组取值时index越界。

    在verilog中规定了一系列x态与其他值(0、1、x、z)的逻辑运算结果,通常X具有较高的优先级,因此一旦出现了X态,如果没有做好逻辑保护的话,以X态信号作为输入信号的逻辑就会继续运算出x态,从而导致X态在整个电路中扩散。

X态与0/1/x/z的运算结果如下:
学习一下simulation 仿真中的x态仿真_第1张图片
这只是基本的,其他逻辑:

reg sel;
reg [1:0] a,b,d;
reg [1:0] out1, out2, out3, out4, out5;
``````cpp
always@(*) begin
  if(sel)
    out1 = a;
  else 
    out1 = b;
end
always@(*) begin
  out2 = (sel) ? a : b ;
end
always@(*) begin
  case(sel)
    1'b0: out3 = a;
    1'b1: out3 = b;
  endcase
end
always@(*) begin
  case(sel)
    1'b0: out4 = a;
    1'b1: out4 = b;
    default: out4 = 2'b00;
  endcase
end
always@(posedge clk_x)begin
  out5 <= c;
end

学习一下simulation 仿真中的x态仿真_第2张图片

可以看到Verilog behavior中:

  1. if(sel) a else b 逻辑: 如果sel为x态,选择的都是else 分支
  2. out = (sel)? a:b 逻辑:如果sel为x态,a,b 值不一致是会产生x态。
  3. case逻辑没有default: 如果sel为x态,则相当于没有选中任何逻辑,out 保持不变
  4. case逻辑带有default:如果sel为x态,选择default
  5. 最后的打拍逻辑,如果时钟sel为x态,在0->x, 1->x, x->0, x->1中,0->x,x->1, 会被视为上升沿
    ==以上的行为实际上不符合实际的电路行为, 其中一些逻辑中不一定会导致x态的传播,前仿不一定能发现这个问题,可能导致bug遗漏到后仿阶段。==因此EDA前仿工具中引入了XPROP工具, 当然Formal 工具也有XPROP的RAK可以发现这个问题。

两种X态模型

在介绍XPROP工具前,首先引入了2种X态模型,X-OptimismX-Pessimism

  • X-Optimism : 乐观模型,模拟在RTL仿真中,如果逻辑的输出结果未知则会被解析为X值。
  • X-Pessimism: 悲观模型,在gate-level仿真中,如果逻辑的输入中包含了X,那么输出结果会被解析为X,哪怕结果是确定的。
    举个离子:
    if(sel) out= a; else out = b;
    真值表:
sel a b out(Verlog) out (乐观) out(悲观)
x 0 0 0 0 x
x 0 1 1 x x
x 1 0 0 x x
x 1 1 1 1 x

可以看到真值表中,当a != b时 X-Optimism 会将仿真变为X态,而在X-Pessimism中所有的结果都为X态,哪怕结果是固定。

在Cadence工具中引入了2个对应的mode, 非常形象的
FOX mode --> Focus only X
CAT mode --> Compute as Ternary
VCS也有同样的对应,

X-mode Cadence VCS
Verilog行为 Deafult vmerge
X-Optimism CAT tmerge
X-Pessimism FOX vmerge

直接看不同的XPROP下对应的不同波形
Cat mode下
学习一下simulation 仿真中的x态仿真_第3张图片
FOX mode下
学习一下simulation 仿真中的x态仿真_第4张图片
对比三种模式下的真值表
学习一下simulation 仿真中的x态仿真_第5张图片
可以看到FOX模式下所有的输出值由于X态参与了逻辑,而全部输出了X态。而CAT模式下,只有在输出结果不确定的情况下才会输出X态。

数组的扩展

另外对于XPROP,除了逻辑上的X态扩散检查,对于数组的index越界的检查也是非常有效的。
考虑以下的场景:
一个深度为6‘d50的数组,期望读index=6’d20, 如果硬件电路设计错误的读了index=6’d60,那么rdata会被返回X态,但如果写了index=’d60的。那么写操作则不会生效,默认情况下将不会有任何行为,再次读index=6‘h20时,将会读到上次的值,如果不作回读,那么这个问题将会被漏掉。
XPROP支持:

  1. 如果写数组的index中包含X,Z,或者越界,工具将所有数组的值全部改写为X值。
  2. 读操作的index中包含X,Z,或者越界,工具不会改变行为,依然是X态,但数组的值不会被改写。
    ==Xcelium中需要定义额外的参数来打开这部分检查,而不是-xprop F/C就可以 ==

注意事项

XPROP在前仿的作用是便于验证工程师在更早的阶段找到bug,将原本只能在gate-level才会发现的问题提前到rtl仿真,更早的释放风险。但这并不表示使能XPROP后发现的行为都是bug,因为有些电路设计做了保护,尤其某些第三方IP,需要验证和设计工程师一起去定位,确认。
对于确认后不是问题的电路设计,可以使用 XRPOP自带的脚本功能来控制XPROP的范围,可以对不同的模块施加不同的XPROP 模式

你可能感兴趣的:(学习,fpga开发)