数据Mux SVA比较

时间:2017-06-18 11:25:37

标签: system-verilog-assertions

我在为这种情况设计断言(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的任何建议?

感谢。

2 个答案:

答案 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());