¿Cómo asignar valor al puerto bidireccional en verilog?

Estoy tratando de usar un puerto bidireccional en Verilog para poder enviar y recibir datos a través de él. Mi problema es que cuando trato de asignar un valor al puerto dentro de una tarea, sigo recibiendo un error.

¿Cuál es la forma correcta de asignar un valor a este tipo de variables?

Mi código es el siguiente:

    module test(value,var);

    inout value;
    output var;
    reg var,value;

    task sendValue;
      begin
        var = 1;
        value = 1;
      end
    endtask

   endmodule

y el error que me sale es:

Error: C:/[...]: (vlog-2110) Referencia ilegal a un "valor" neto.

Gracias.

Respuestas (3)

Si debe usar cualquier puerto como entrada, aquí hay algunas cosas para recordar:

  1. No puede leer y escribir en el puerto de entrada y salida simultáneamente, por lo tanto, mantenga highZ para leer.
  2. El puerto inout NUNCA puede ser del tipo reg.
  3. Debe haber una condición en la que debe ser escrito. (los datos en mem deben escribirse cuando Write = 1 y deben poder leerse cuando Write = 0).

Por ejemplo, escribiré su código de la siguiente manera.

module test (value, var);
  inout value;
  output reg var;

  assign value = (condition) ? <some value / expression> : 'bz;

  always @(<event>)
    var = value;

endmodule

Por cierto, cuando var es de tipo cable, puede leerlo de la siguiente manera:

assign var = (different condition than writing) ? value : [something else];

Por lo tanto, como puede ver, no hay restricciones sobre cómo leerlo, pero el puerto de entrada y salida DEBE escribirse de la manera que se muestra arriba.

Espero que eso te lo explique.

Verifique si la biblioteca que está usando incluye controladores tristate: son los que siempre usé en esta situación.

Si se ve obligado a intentar diseñar su propio controlador de tres estados, recuerde que su salida debe ser Z siempre que deba permitir la entrada.

Aquí mis 2 centavos,

wire [32-1:0] DATA;//bidireccional port in VERILOG/VHDL
logic put_input_in_bidi;

assign m_sram_if.SRAM_DATA_READ = DATA;//read from inout port
assign DATA = (put_input_in_bidi==1'b1)? m_sram_if.SRAM_DATA_WRITE : 32'hZZZZ_ZZZZ;//write in bidi iout port
assign put_input_in_bidi =     (blabla == 0)  &&  (bobbob == 1);//control write in bidi using master information