¿Cómo afirmar múltiples aserciones concurrentes en el sistema verilog?

0

Quiero hacer algo como esto mediante aserciones concurrentes (quiero comprobar que cuando los cambios de from_clk to_clk deben cambiar y cuando los cambios to_clk from_clk deben cambiar):

($changed(from_clk) |-> $changed(to_clk)) &&
  ($changed(to_clk) |-> $changed(from_clk))

He escrito las siguientes afirmaciones pero no está dando el resultado correcto en la simulación.

property check_clock;
@(from_clk or to_clk) disable iff(reset || ~enable)
($changed(from_clk) |-> $changed(to_clk)) &&
 ($changed(to_clk) |-> $changed(from_clk));
endproperty

ASSERT_CHECK_CLOCK : assert property(check_clock)
                     else $error();

Por favor, sugiere cómo lograr esto.

    

1 respuesta

1

Estoy oxidado al escribir afirmaciones, pero, quizás esto ayude ... ¿Esperas que sean verdaderas en el mismo reloj? Si no, utilice ##[<value>:<value>] para expresar un rango de ciclos de reloj para que sea verdadero. p.ej. from_clk |-> ##[1:2] to_clk

Y, sin saber más acerca de los relojes, no estoy seguro si el && funcionará como aparentemente sucedió en el pasado (?). Podría ser más significativo usar || asumiendo que solo busca cualquiera de las dos condiciones. cualquier cruce de reloj dado (?) Tal vez, dos aserciones separadas ... en realidad, una propiedad a la que le pasa variables, y forme dos aserciones separadas (desde y hasta y desde) puede ser mejor.

También, un buen simulador (por ejemplo, Questa) tendrá un seguimiento de aserción que puedes usar para depurar visualmente la aserción a través del paso. Potente y útil, ya que las afirmaciones pueden complicarse y, a su vez, ser dolorosas para hacerlo bien.

Hay más detalles en el estándar IEEE-1800 (o www.accellera.org si no tiene acceso a IEEE). Pero, se puede encontrar un ejemplo y una explicación más directa y más rápida aquí: enlace

    
respondido por el CapnJJ

Lea otras preguntas en las etiquetas