随着设计的进行,越接近最后的产品,修正一个设计缺陷的成本就会越高。
不同设计阶段修正一个设计缺陷所需费用示意图
在IC设计与制造领域,通常所说的验证(Verification)和测试(Test)是两种不同的事
验证
测试
功能验证
功能验证一般是指设计者通过各种方法比较设计完成的电路和设计文档规定的功能是否一致,保证逻辑设计的正确性。
通常不包括面积、功耗等硬件实现的性能检测。
SoC功能验证的挑战
发展趋势
仿真为基本出发点的功能验证方法
功能验证开发流程制订验证计划
验证开发
功能验证开发流程
行为级功能验证
测试数据控制流,包括初始化和关闭I/O设备、验证软件功能、与外界的通信,等等
性能验证
通过性能验证可以使设计者清楚地知道整个系统的工作速度、功耗等性能方面的指标。
协议验证
根据总线协议对各个模块的接口部分进行验证
系统级的测试平台
系统级的测试平台标准
激励的生成
可以快速、准确地产生大量的与实际应用一致的输入向量
检测到测试者没有想到的一些系统缺陷带约束的随机测试激励是指在产生随机测试向量时施加一定的约束,使所产生的随机测试向量满足一定的设计规则。
带约束的随机激励生成的例子
x1和x2为系统的两个输入,它们经过独热码编码器编码之后产生与被验证设计(DUV)直接相连的输入
输入约束:in[0] + in[1] + in[2] <= 1
这样产生的随机向量就可以保证它们的合法性。
用SystemVerilog语言写的带约束随机激励生成例子
输入data的数量限制在1~1000
program automatic test;
// define constraint
class Transaction;
rand bit [31:0] src, dst, data[]; // Dynamic array
randc bit [2:0] kind; // Cycle through all kinds
constraint c_len
{ data.size inside {[1:1000]}; } // Limit array size
Endclass
// instantiation
Transaction tr;
// start random vector generation
initial begin
tr = new();
if(!tr.randomize()) $finish;
transmit(tr);
end
endprogram
响应的检查
覆盖率的检测
可细化为:
限状态机覆盖率(FSM Coverage) 表达式覆盖率(Expression Coverage) 交叉覆盖率(Cross Coverage) 断言覆盖率(Assertion Coverage)
用SystemVerilog语言写的覆盖率检测的例子
program automatic test(busifc.TB ifc);
class Transaction;
rand bit [31:0] src, dst, data;
rand enum {MemRd, MemWr, CsrRd, CsrWr, I
oRd, IoWr, Intr, Nop} kind;
endclass
covergroup CovKind;
coverpoint tr.kind; // Measure coverage
endgroup
Transaction tr = new(); // Instantiate transaction
CovKind ck = new(); // Instantiate group
initial begin
repeat (32) begin // Run a few cycles
if(!tr.randomize()) $finish;
ifc.cb.kind <= tr.kind; // transmit transaction
ifc.cb.data <= tr.data; // into interface
ck.sample(); // Gather coverage
@ifc.cb; // Wait a cycle
end
end
endprogram
形式验证(Formal Verification)
静态形式验证(Static Formal Verification)和半形式验证(Semi-Formal Verification)
相等性检查(Equivalent Check)
半形式验证(Semi-Formal Verification)
仿真和形式验证形结合,如混合模型检查(Model Checking)或属性检查(Property Checking)的方法。
仿真验证面临的问题:可观测性和可控制性
采用断言描述设计的行为,在仿真时起到监控作用,当监控的属性出现错误时,立刻触发错误的产生,增加了设计在仿真时的可观测性问题。
也可以用在形式属性检查中作为要验证的属性。属性检查(Property Check)时,是对整个状态空间进行搜索,能够控制到每一个信号并能指出错误的具体位置,解决了设计验证时的可控制性和可观察性问题。
验证实现所花费的时间与验证的质量
断言的作用
断言语言及工具的使用
断言语言
C or SystemC SystemVerilog Assertion (SVA) Property Specification Language (PSL) (IBM, based on Sugar) Open Verification Library (OVL) Verilog, VHDL
SVA(SystemVerilog Assertion)例子
用Verilog实现的检查器:
always @ (posedge A)
begin repeat (1) @ (posedge clk);
fork: A_to_B
begin @ (posedge B)
$display (“SUCCESS: B arrived in time\n”, $time);
disable A_to_B;
end
begin
repeat (1) @ (posedge clk)
@ (posedge B)
display (“SUCCESS: B arrived in time\n”, $time);
disable A_to_B;
end
begin
repeat (2) @ (posedge clk)
display (“ERROR: B didn’t arrive in time\n”, $time);
disable A_to_B;
end
end
用SVA实现的检查器:
assert property
( @(posedge clk )A|->##[1:2]B);
基于断言的验证
在属性检查中使用断言
在属性检查中,最重要的就是属性描述。
在仿真中使用断言