-
property on2off_delay_3; @(posedge clock) disable iff (fw_clk_mode || clk_on2off_delay==10) $fell(gated_clk) -> (($past(delay_cnt),(11)) == 16'h1); endproperty assert property(on2off_delay_3);
disable iff:如果后面'()'中的内容成立,则关闭后面断言的执行。
$fell: 前一个值取样为'1'(或'x'或'z')而且当前值为'0'。
$past : 对某个信号过去某一时钟的状态断言。
-
property by_pass_mode(in_v,out_v); @(posedge clock) disable iff (!clkg_cfg_thre[0]) (inv_v) == (out_v); endproperty assert property(by_pass_mode(up2clkg_req,clkg2dp_req)); assert property(by_pass_mode(up2clkg_data,clkg2dp_data));
assertion 参数化使用
-
sequence wake_up; @(posedege clock) (!gated_clk)[*65] and (!dis_wakeup_tmr); endsequence property wake_up_1; @(posedege clock) wake_up |-> ##[1:3] (gated_clk)[*5]; endproperty assert property(wake_up_1);
sequence 可以嵌入 property 中;sequenct 中不能出现 '|->'.
[*65] : 重复65次。
##[1:3] : 1 ~ 3个 clock。
-
A_1 : assert property (upstr_req) else `uvm_error("upstr_req","fial");
A_1 : 可加可不加。
-
interface pap_if (input logic clk); ...... ...... ...... `include "add_assertion.sv" endinterface
-
##add_assertion.sv import uvm_pkg::* //bit clk_a ; //always @(*) begin // clk_a = #1 `CLOCK; //end 有时可以单独给assertion一个延迟的时钟。 task report_error; `uvm_error("pap_if","assertion error") endtask assert property(pf_off_en) else report_error;
interface 中可以加入task,assertion可以调用task。
-
property discard_done_1; @(posedge `CLOCK) if($test$plusargs("dma_mrd")) (pwr_fail) |-> ##2 (discard_done); endproperty assert property(discard_done_1) else report_error;
调用函数$test$plusargs 控制assertion是否执行。可以在run -tc=xxx +dma_mrd 控制。
-
property disc_pap_dda_cmd_2; bit [63:0] vf_id; @(posedge `CLOCK) ($rose(pap_dda_cmd),vf_id=pap_dda_cmd[35:28]) |-> if (discard_done_flr[vi_id] == 1) (pap_dda_cmd_vld ==0); endproperty
加入赋值语句,但必须前面有信号的断言。或者使用(1‘b1, xxx)
if () 条件语句的使用。
vf_id:声明的内部变量。
-
property disc_rdy_q; @(posedge `CLOCK) if($test$plusargs("targer_mrd")) $rose(pao_pci_data_vld) and (!discard_done) ##0 (pci_pap_tgt_data[126] == 0) |-> $rose(discard_rdy); endproperty
##0 使用。
-
参考uvm源码example用法: always @(negedge clock) #可以将等待时钟沿放在最外面,减少书写 begin #可以直接assert property,省略 property endproperty书写 assertAddrUnknown:assert property( disable iff(!has_checks) ($onehot(sig_grant) |-> !isunknown(sig_addr))) else $error(" ...."); assertResetFor3Clocks:assert property( disable iff(!has_checks) ($rose(sig_reset) |-> sig_reset[*2])) else $error(.....); end
- 判断信号中的 X/Z:
实际工作中写过的一些断言,留作以后复用。
assertion 学习链接:https://blog.csdn.net/zhajio/article/category/7506423