Системное ограничение verilog: ограничение, что адрес чтения был записан ранее - PullRequest
0 голосов
/ 01 мая 2018

Я хочу написать ограничение, чтобы удостовериться, что 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

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Отличный ответ Дейва.

Вот еще один, который использует очередь вместо связанного массива.

class try;
rand int w_addr;
rand int r_addr;
int q[$];

function void post_randomize();
    int sz;
    int idx;
    q.push_back(w_addr);
    sz = q.size();
    idx = $urandom_range(0, sz-1);
    r_addr = q[idx];
endfunction
endclass

module test;

    try a;

    initial begin
       a=new;
       repeat(20) begin
           a.randomize();
          $display("sz=%0d w_addr=%x r_add=%x", a.q.size(), a.w_addr, a.r_addr);
       end
    end
endmodule
0 голосов
/ 01 мая 2018

Вы хотите использовать оператор inside.

class try;
    rand bit [31:0] w_addr;
    rand int [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

Примечания: вы должны использовать неподписанные типы для адресов. Ваша проверка на рандомизацию должна выдать ошибку.

...