system verilog - ¿Cómo aleatorizar solo 1 variable en una clase?

CorePress2024-01-25  10

Tengo la siguiente clase

class ABC;


    rand bit[2 : 0] mode; 
    randc bit[2 : 0] mode_cylic;
    constraint range{

        mode >= 2;
        mode < 6;

    };

    constraint range_cylic{

        mode_cylic >= 2;
        mode_cylic < 6;

    };



endclass 

Tengo un objeto de prueba de la clase de prueba ABC y quiero aleatorizar solo la variable de modo en ese objeto. ¿Cómo puedo hacer eso?



------------------------------------

Debe tener cuidado al aleatorizar una clase y solo aleatorizar ciertas variables porque las restricciones se desactivan por separado de las variables. Todas las restricciones activas deben tener éxito para una aleatorización de clase.

Lo más sencillo de hacer cuando solo tienes una o unas pocas variables de un conjunto más grande de variables aleatorias para aleatorizar es usar el método incorporado std::randomize. Esto aleatoriza las variables.en sus argumentos independientemente de si son variables de clase y no utiliza ninguna restricción de clase.

std::randomize(obj.mode);

Cualquier restricción que desee utilizar debe agregarse mediante una restricción with {expressions}.

Otra cosa que puedes hacer es usar el método de aleatorización de clases, y también poner solo las variables que quieras aleatorizar.

obj.randomize(mode);

Sin embargo, todas las restricciones de clase aún deben tener éxito, por lo que mode_cylic ya debe tener un valor de 2 a 5, o debes desactivar la restricción usando

obj.range_cylic.constraint_mode(0);

Puedes hacer algo similar usando rand_mode() para desactivar las variables aleatorias que no deseas que sean aleatorias.

Usaría rand/constraint_mode() para desactivar una variable o restricción, en lugar de intentar desactivar todo excepto una. Se vuelve muy difícil de mantener a medida que comienzas a agregar máse variables/restricciones a su banco de pruebas.

Intenta usar std:randomize o, mejor aún, separa tus clases en objetos para que se aleatoricen por separado.

2

Excelente respuesta, ¿hay alguna manera de usar std::randomize() con restricciones definidas dentro de una clase o incluso cuando intento externarlo fuera de la clase, es factible?

- Ramy Osama

29 de marzo de 2021 a las 8:03

Si la única variable que desea aleatorizar es una variable de clase, entonces se considerarán las restricciones asociadas con ese objeto de clase. Podría resultar útil volver atrás, editar su pregunta y explicar cuál es la situación en la que solo desea aleatorizar una variable. Podría haber un enfoque alternativo. Consulte xyproblem.info

-dave_59

29/03/2021 a las 14:29



------------------------------------

Una forma es desactivar la aleatorización para la variable que no desea aleatorizar:

class ABC;
    rand bit[2 : 0] mode; 
    randc bit[2 : 0] mode_cylic;

    constraint range{
        mode >= 2;
        mode < 6;
    }

    constraint range_cylic{
        mode_cylic >= 2;
        mode_cylic < 6;
    }
endclass

module tb;
    ABC abc = new();
    bit result;
    initial begin
        abc.range_cylic.constraint_mode(0);
        abc.mode_cylic.rand_mode(0);
        repeat (10) begin
            result = abc.randomize();
            $display("mode=%0d mode_cylic=%0d", abc.mode, abc.mode_cylic);
        end
    end
endmodule

Consulte IEEE Std 1800-2017, sección 18.8 Desactivación de variables aleatorias con rand_mode().

Este es el resultado que obtengo:

mode=2 mode_cylic=0
mode=2 mode_cylic=0
mode=2 mode_cylic=0
mode=4 mode_cylic=0
mode=4 mode_cylic=0
mode=2 mode_cylic=0
mode=4 mode_cylic=0
mode=3 mode_cylic=0
mode=5 mode_cylic=0
mode=4 mode_cylic=0

O, si desea que mode_cylic tenga un valor específico dentro del rango range_cylic, utilícelo con:

initial begin
    repeat (10) begin
        result = abc.randomize() with { mode_cylic == 5; };
        $display("mode=%0d mode_cylic=%0d", abc.mode, abc.mode_cylic);
    end
end

Este es el resultado que obtengo:

mode=2 mode_cylic=5
mode=2 mode_cylic=5
mode=2 mode_cylic=5
mode=4 mode_cylic=5
mode=4 mode_cylic=5
mode=2 mode_cylic=5
mode=4 mode_cylic=5
mode=3 mode_cylic=5
mode=5 mode_cylic=5
mode=4 mode_cylic=5

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare