¿Cómo funciona la fuerza en Verilog?

2

Quiero crear una asignación que se ocupe de las extracciones desde un pin de puerto. Escribí lo siguiente:

module test5;

reg value;
reg output_enable;
reg pullup_enable;

wire pullup_helper;
wire value_helper;
wire outp;


assign (highz0, pull1 ) pullup_helper = pullup_enable;
assign                   value_helper = output_enable ? value : 1'bz;
assign                           outp = value_helper  + pullup_helper;


always @(pullup_helper) $display ( "pullup_helper %b", pullup_helper );
always @(value_helper) $display ( "value_helper %b", value_helper );
always @(outp) $display ( "outp %b", outp );

initial begin
    $display ("Start");
    pullup_enable = 0;
    output_enable = 0;
    value = 0;
    #1
    $display ("1");
    output_enable = 1;
    #1
    $display ("2");
    value = 1;
    #1
    $display ("3");
    value = 0;
    #10
    $display("End");
end


endmodule

Tengo el resultado:

Start
pullup_helper z
value_helper z
1
value_helper 0
2
value_helper 1
3
value_helper 0
End

P: ¿Por qué outp nunca cambia?

EDITAR: Debido a que la respuesta completa está relacionada con algunos comentarios sobre las respuestas proporcionadas, resumiré los resultados:

Al igual que con el apoyo de Greg, la respuesta al problema se realiza en dos pasos:

La instalación predeterminada en Fedora 22 es Icarus 0.9.6. Esta versión es buggy. Como Greg probó también la versión 0.9.7 tiene el mismo error. Instalé la última versión lanzada v10 (¿ha cambiado las convenciones de la versión?)

La segunda parte es simplemente dejar que la unidad asigne declaraciones en un solo cable.

assign (pull1,pull0)  bus = pullup_en ? 1'b1 : 1'bz;
assign                bus = output_en ? value : 1'bz;

Con Icarus Verilog V10 funciona como se esperaba.

    
pregunta Klaus

2 respuestas

4

Las fortalezas de Verilog pueden ser un poco de proceso complicado de entender. Para obtener la respiración completa de comprensión, lea: IEEE Std 1800-2012 § 10.3, 21.2.1.5 , y de 28.10 a 28.16.

Para imprimir la intensidad de un bit en un mensaje de pantalla, use %v en lugar de %b . (§ 21.2.1.5)

Verilog funciona principalmente en el espacio de la lógica digital. La fuerza de Verilog solo entra en juego cuando dos o más asignaciones conducen continuamente la misma red desde la resolución de conflictos. El valor de la resistencia no se propaga a través de las instrucciones de asignación. El valor de resistencia se puede pasar a través de las primitivas de conmutación verilog: nmos , pmos , tranif1 , tranif0 , cmos , tran , más primitivas de interruptor resistivo (lo que debilita las fortalezas en el paso) . Para los conmutadores de primitivas Verilog, consulte IEEE Std 1800-2012 § 28.7 a 28.9.

assign (pull1,pull0)  bus = pullup_en ? 1'b1 : 1'bz;
assign                bus = output_en ? value : 1'bz;

assign                out = bus;
assign (weak1,weak0) outw = bus;
cmos inst_name (outs, bus, 1'b1, 1'b0);

// pullup_en output_en  |  out(%v)         outw(%v)        outs(%v)
// ---------------------+----------------------------------------------
//       0         0    |  1'bx(StX)       1'bx(WeX)       1'bz(HiZ)
//       0         1    |  value(St1,St0)  value(We1/We0)  value(St1/St0)
//       1         0    |  1'b1(St1)       1'b1(We1)       1'b1(Pu1)
//       1         1    |  value(St1,St0)  value(We1/We0)  value(St1/St0)

La lógica Pullup / pulldown de una celda estándar proporcionada por su proveedor puede usarse para la síntesis. Algunos sintetizadores tienen pragmas para indicar un pullup / pulldown en un bus. Fuera de eso, la fuerza del verilog típicamente no es sintetizable. Los FPGA tienen soporte de bus bidireccional limitado; Si alguna. Los ASIC generalmente intentan minimizar el tamaño y el uso de los buses bidireccionales.

    
respondido por el Greg
2

Cuando veo las formas de onda, veo que outp siempre es desconocido ( x ). outp nunca cambia porque pullup_helper siempre es z . pullup_helper siempre es z porque pullup_enable siempre es 0. Usted especificó highz0 para cuando pullup_enable es 0 en su declaración assign . Consulte IEEE Std 1800-2012, sección 10.3.4 "Fortalezas de asignación continua".

    
respondido por el toolic

Lea otras preguntas en las etiquetas