热度 7| |
声明,不得转载。
断言的英文是Assertion,就是对一些设计属性的推知。大型的硬件设计中会有各种各样的协议接口,这些协议都是时序的。这些协议接口定义中一般都会有include文件,这些include文件中包含了接口的断言描述,这些断言主要用于协议的时序检查。除了这种把断言语句放到接口协议里之外,还可以放到具体的design里面,也可以单独做成一个module的检查器,把module检验器和设计bind在一起。
断言可以用verilog实现,也可以用SystemVerilog Assertion(SVA)实现,也可以用C或者C++实现。由于要检查时序,过程性语言Verilog并不是很好的选择,一般会选择描述性语言SVA实现,SVA对时序的描述近乎完美。 本文讲介绍一下SVA的简单例子。如果想系统的学习SVA,建议购买一本书《SystemVerilog Assertions 应用指南》。
内推大公司:海光, AMD, 兆芯,苏州瑞晟微电子,苏州盛科网络,TI,杭州矽力杰等等。
招聘:上海,深圳,珠海,广州,成都,杭州,苏州,北京,西安,数字ic设计工程师,数字验证工程师,模拟ic设计工程师,DFT,FPGA,数字后端工程师,RFIC,射频工程师,ae,fae,sales。总有一款适合你,欢迎ICer自荐和推荐。
1、模拟IC设计工程师25-80W(电源方向:初级、高工、经理、总监)均有需求,坐标:深圳/上海/武汉/长沙/南京/苏州/昆山/杭州/成都/西安/北京/厦门。
2、资深模拟IC设计(混合信号),30-100W, 坐标:上海/南京/深圳/昆山/成都/重庆/西安/武汉/珠海/广州/昆山。
3、资深数字IC设计工程师-------苏州、上海、北京、杭州、武汉、成都、西安、四川、广州、深圳、珠海、昆山;
4、数字IC设计前端/后端 工程师-四川/武汉、上海、北京、广州、昆山;
5、FPGA-西安/上海;
6、RFIC资深/专家/VP,射频工程师 -杭州/上海、重庆、成都、深圳、西安、北京、。
7、FAE/AE-武汉/上海/深圳/昆山/厦门;
8、模拟版图设计工程师-武汉/上海/深圳/成都/厦门。
备注:初创型、成熟型、国企、外资企业、甚至合伙人岗位应有尽有。
另外,上海/苏州/成都/昆山分别有数字经理、模拟(ADC/DAC)(DC/DC)(AC/DC)经理
欢迎自荐和推荐(同学/朋友/同事)。谢谢啦!
方法1: 直接放到到design里面的方式如下。
文件dut.v , dut很简单,每个clk上升沿到来时对输入a取反。
`timescale 1ns/1ns
module DUT (clk,a,b);
input clk;
input a;
output b;
reg b;
always @ (posedge clk )
begin
b<=~a;
end
`include "assertion.svh"
endmodule
文件 test.v
`timescale 1ns/1ns
module TOP;
reg clk;
reg a;
wire b;
always
#5 clk=~clk;
initial
begin
clk <=0;
a <=1;
#30 $finish;
end
DUT dut(.clk(clk),
.a(a) ,
.b(b)
);
//bind TOP.dut dut_assertion dut_assertion_check(.a_(a),.b_(b),.clk_(clk));
endmodule
assertion.svh文件,每个clk上升沿,如果a=0,则是空成功,不满足第一个a=1的条件,b就不需要判断是否等于1,直接判断为成功。如果a=1,则对b进行判断,b为1则为成功,否则断言失败。
property check_p;
@(posedge clk) a |->b;
endproperty
check_a : assert property (check_p);
运行命令:irun -sv dut.v test.v
ERROR:ncsim: *E,ASRTST (./assertion.svh,6): (time 5 NS) Assertion TOP.dut.check_a has failed
ERROR现象符合预期。
方式2:单独定义一个module 检验器,然后通过bind实现。
注释DUT.v 中`include "assertion.svh",打开test.v中的bind。
Module检验器文件
module dut_assertion(a_,b_,clk_);
input logic a_,b_,clk_;
property check_p;
@(posedge clk_) a_ |->b_;
endproperty
check_a : assert property (check_p);
endmodule
运行命令:irun -sv dut.v test.v assertion_module.sv
ERROR:ncsim: *E,ASRTST (./assertion_module.sv,12): (time 5 NS) Assertion TOP.dut.dut_assertion_check.check_a has failed