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.