HSPICE - Midiendo una serie de valores en simulación transitoria

0

Estoy haciendo una simulación transitoria en HSPICE con un archivo de vector de entrada de valores N (N > 100).

Me gustaría obtener en cada flanco ascendente del reloj (es decir, la sincronización de la forma kT, el período T, el entero k) una medida de un valor de la corriente. Mi objetivo es entonces procesar esos valores a través de un script.

¿Alguien sabe cómo hacerlo por favor? No puedo usar N veces las declaraciones .MEAS ya que N es realmente enorme ...

    
pregunta pierre

1 respuesta

1

Hspice .MEASURE Resultados continuos

Esto es de la referencia del comando Hspice 2014.09:

.MEASURE (Continuous Results)
Measures continuous results for TRIG-TARG, FIND-WHEN, Equation, and PARAM Evaluation functions.
Syntax
...

Ejemplos de la documentación:

Example 2 The .measure statement continuously reports the time when the voltage value of node a1 reaches 2.5V, starting from the second falling edge.
.measure tran_cont cont_vout1 when v(a1)=2.5 fall=2

Example 3 The following example shows a correct .measure statement.
.measure tran_cont PERIOD
+ TRIG v(out) VAL =VDD/2 RISE=1
+ TARG v(out) VAL =VDD/2 RISE=2
.measure tran_cont FREQUENCY PARAM=1/PERIOD

La salida estará en un archivo de medidas continuas separado

Hspice .MEASURE generation

Haga un script perl / python / any que genere una medida para cada borde. Incluye las declaraciones de .measure en tu mazo de hspice. La ventaja aparente de esto es que los resultados residirán en el resto de las mediciones.

Bloque VerilogA

Uno puede escribir un fragmento de código VerilogA que puede ser activado por bordes para generar el tiempo en un archivo. En Cadence debería haber una biblioteca de muestra con algunos widgets de VerilogA de muestra. El código VerilogA se debe incluir en la plataforma hspice con un comando .hdl y se debe instanciar como cualquier otro subcircuito. Posible código VerilogA (en este caso, conecte la señal de interés al 'en' de esta muestra:

'include "disciplines.vams"

module sampler(in);
input in; electrical in;

parameter real thres=0.5;

integer fh;

analog begin
  @(initial_step) begin
    fh = $fopen("times.txt","w");
  end
  @(final_step) begin
    $fclose(fh);
  end
  @(cross(V(in)-thres, +1, 10p)) begin
  //                   +1 means rising edge only
    $fstrobe(fh,"%g",$abstime);
  end
end
endmodule

post-procesamiento PyOPUS

Si está buscando un entorno Python posterior al proceso más general, utilice PyOPUS . PyOPUS abrirá Hspice POST_VERSION = 9601 datos binarios en numerosas estructuras de datos. Una secuencia de comandos de procesamiento posterior podría tener el siguiente aspecto:

import pyopus.simulator.hspicefile as hspf
import pyopus.evaluator.measure as meas

hspfObj = hspf.hspice_read( 'netlist.tr0' )
if hspfObj is None:
    raise Exception("Error opening hspice file")

results = hspfObj[0][0][2][0]  # dictionary of waveforms, keyed by name
time = results[hspfObj[0][1]]  # list of scale point (in this case time)

i_rises = meas.IatXval(results['out'], 0.5, slope='rising')
t_rises = meas.XatI(time, i_rises)
    
respondido por el aparatgraf

Lea otras preguntas en las etiquetas