2015-05-06 2 views
0
class c2; 
    rand bit[1:0] a; 
    rand bit[1:0] b; 

    function void my_print(); 
    $display("a = %b", a); 
    $display("b = %b", b); 
    endfunction 
endclass 

class c1; 
    rand bit[1:0] i; 
    rand bit[1:0] j; 
    rand c2 o2; 

    function new(); 
    o2 = new(); 
    endfunction 

    function void my_print(); 
    $display("i = %b", i); 
    $display("j = %b", j); 
    endfunction 
endclass 

program p1; 
    c1 o1 = new; 
    c2 o2_local = new; 

    initial begin 
    if (o1.randomize() with {o2 == o2_local;}) begin 
    o1.my_print(); 
    o2.my_print(); 
    end 
endprogram 

В этой программе рандомизация становится неудачной для o1.randomize(). Если я беру отдельные переменные для o2 и использую встроенное ограничение с этим (например, o2.a == o2_local.a), то он работает.Рандомизация объекта класса внутри класса в SystemVerilog

Есть ли альтернативный способ сделать этот тип рандомизации, так как мой первоначальный класс содержит почти 38 переменных, а индивидуальные задания будут неприятными.

+1

«Вложенный класс» здесь не является правильной терминологией. Вложенный класс - это класс, определенный в другом классе. У вас есть объект-член другого класса. –

ответ

4

Оператор ==, когда применяется к объекту, не делает то, что вы думаете. Он сравнивает только ручки. Решатель не работает, потому что видит, что o1.o2 и o2_local - разные объекты и, следовательно, не являются «равными».

o2_local Если не предполагается изменять рандомизации, то вы можете просто сделать следующее:

o1.o2 = o2_local; 
o1.o2.rand_mode(0); 
if (o1.randomize()) begin 
    o1.print(); 
    o1.o2.print(); 
end 
o1.o2.rand_mode(1); 

Таким образом, вы назначили o2_local к o2 и если вы должны были иметь какие-либо ограничения, которые ссылаются поля o2 и o1 они будут решены.

Проблема с эквивалентностью объектов является симптоматичной для всех языков ООП. Вы должны были бы функция, которая принимает все поля объекта во внимание, чтобы определить, если два объекта равны:

class c2; 
    // ... 

    function bit equals(c2 obj); 
    return a == obj.a && b == obj.b; 
    endfunction 
endclass 

Эта функция отлично работает в процедурном коде, но это не поможет рандомизации, как с помощью функции в ограничениях сложнее.

Уродливым решением было бы также объявить макрос, который будет расширяться до тела функции equals(...), поскольку наличие развернутых операторов ==10 будет работать в ограничении.

+0

Да, я пробовал это решение, но одна проблема заключается в том, что после выполнения o1.o2.rand_mode (0) он не будет рандомизировать o2. Но если какие-либо ограничения присутствуют в классе c2, то эти ограничения также не будут решены. –

+1

Это именно то, что я сказал. Но почему вы хотите рандомизировать «o2»? Из приведенного вами примера кажется, что у вас есть объект раннего рандомизации типа 'c2', и вы просто хотите, чтобы поле' o2' содержало одни и те же значения. –

+0

Да, это кажется убедительным. Большое спасибо за ответ. –

0

Если все переменные в классе c2 должны быть рандомизированы, «с» не оказало большого влияния, поскольку «с» используется для ограничения только определенных значений. Простой метод будет выполнять всю переменную рандомизацию, я сомневаюсь, что из-за этого причина LRM не сильно говорить о встроенных ограничениях вложенных классов

initial begin 
    if (o1.randomize()) begin 
    if (o2_local.randomize()) begin 
     o1.my_print(); 
     o2_local.my_print(); 
    end 
    end 
    else $fatal ("Randomize failed"); 
    end 
endprogram 

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

+0

@Emmam: Я хочу, чтобы o2 o1 имел значения o2_local, потому что исходные данные находятся в o2, а o2_local - это просто дать данные o2. Поэтому я не могу использовать ваш код, так как он не будет делать o2 = o2_local –