首页 > 解决方案 > SystemVerilog 约束:约束之前已经写入的读地址

问题描述

我想编写一个约束以确保r_addr仅在使用与以前相同的地址时才允许使用w_addr,但以下约束不起作用。你有什么建议吗?

class try;
    rand int w_addr;
    rand int r_addr;
    int ua[$];
    int aa[int];
    constraint unique_addr_c{
        aa.size() == 0 || aa.exists(r_addr);
    }
endclass


module test;

    try a;

    initial begin
        a=new;
        repeat(20) begin
            if(a.randomize);
            $display("add=%0d", a.w_addr);
            $display("add=%0d", a.r_addr);
            a.ua.push_back(a.w_addr);
            a.aa[a.w_addr] = 1;
        end
    end

endmodule

标签: constraintssystem-verilog

解决方案


您想使用inside运算符。

class try;
    rand bit [31:0] w_addr;
    rand bit [31:0] r_addr;
    bit [31:0] ua[$];
    constraint unique_addr_c{
       ua.size() >0 -> r_addr inside {ua};
    }
    function void post_randomize();
       ua.push_back(w_addr);
       endfunction
endclass


module test;

    try a;

    initial begin
        a=new;
        repeat(50) begin
            if (!a.randomize) $error("randomization failed");
            $display("wadd=%0d", a.w_addr);
            $display("radd=%0d", a.r_addr);
        end
    end

endmodule

注意:您应该使用无符号类型的地址。您对 randomize 的检查应该会产生错误。


推荐阅读