我在为这种情况设计断言(SVA)时遇到了麻烦。 当一个mux sel被置位时,data_in预计会稳定2个时钟; mux sel被置位之前的时钟,以及当mux sel被置位时的当前时钟。
现在data_in是一个宽矢量/总线信号,因此在功能模式期间总线的某些位是Z和X(这是预期的),而这些位在非功能模式期间可能带有值。
这意味着,设计SVA的方法是在断言mux sel时逐位比较数据总线。
这是我的方法,但SVA失败了,我不知道为什么。
generate
for( genvar i=1 ; i<BUS_WIDTH ; i++ ) begin
always @ (posedge clk) begin
if(!$isunknown(data_in[i]) && reset) begin
data_in_temp_prev[i] <= data_in[i];
if (mux_sel==1 && reset==1 && i>0) begin
SVA_TEST: assert property (data_in[i] == data_in_temp_prev[i-1]) else `uvm_error("TRIAL_SVA",$sformatf("datain expected to be stable for 2 clks prior to mux sel"));
end //if
end //if isunknown
else begin
din0_temp_prev[i] <= 0;
end
end //always
end // for genvar
endgenerate
有关如何设计此SVA的任何建议?
感谢。
答案 0 :(得分:0)
如果我理解你的问题,你不需要所有这些结构来解决这类问题,请看下面的例子并告诉我是否有帮助。
property mux_compare;
disable iff(!reset)
@(posedge mux_sel)
!$isunknown(data_in)
|->
@(posedge clk)
$stable(data_in) [*2];
endproperty: mux_compare
答案 1 :(得分:0)
我对SVA检查器的处理方法是对属性使用标准结构,以避免各种问题。结构是始终使用带“ disable iff”的时钟属性,并始终使用蕴含运算符,其中左侧是触发器,右侧是我们要验证的东西。 这是来自LRM的示例:
property mux_compare;
disable iff(!reset) @(posedge clk)
mux_sel===1 |->
!$isunknown(data_in[i]) || $stable(data_in) && data_in[i] == $past(data_in[i],2);
endproperty: mux_compare
类似于上面的答案,我会这样做:
app.use(express.json());