Pasando el puerto de entrada a través de la jerarquía en Vivado

0

Estoy intentando crear un módulo de controlador para la interfaz SMI en mi ethernet PHY. Mi módulo de nivel superior contiene los siguientes puertos con eth_mdio marcado como inout.

    module top
    (
        input        clk_100,
        input        cpu_rst_n,

        output       eth_mdc,
        inout        eth_mdio,
        output       eth_rstn,
        inout        eth_crsdv,
        inout        eth_rxerr,
        inout  [1:0] eth_rxd,
        output       eth_txen,
        output [1:0] eth_txd,
        output       eth_clkin,
        inout        eth_intn,
        input  [15:0] sw,
        output [15:0] led,
        input         btnc
    );

    ...

    smi smi_inst
    (
        .clk_50(clk_50),
        .rst_n(rst_n),

        .valid(read_reg),
        .write(0),
        .phyaddr(0),
        .register(sw[4:0]),
        .read_value(led),

        .eth_mdc(eth_mdc),
        .eth_mdio(eth_mdio)
    );

    endmodule

Dentro del módulo superior, creo una instancia de un submódulo llamado smi que tiene los siguientes puertos.

module smi
(
    input         clk_50,
    input         rst_n,

    output        ready,
    input         valid,
    input         write,
    input  [4:0]  phyaddr,
    input  [4:0]  register,
    input  [15:0] write_value,
    output [15:0] read_value,

    output reg    eth_mdc,
    inout         eth_mdio
);

Dentro de smi asigno eth_mdio como sigue ...

assign eth_mdio   = state == STATE_IDLE ? 1'b0 : (state == STATE_READ ? 1'bz : send_buffer[64]);

Cuando voy a sintetizar el diseño, aparece la siguiente advertencia crítica ...

  

[Synth 8-5744] El búfer de entrada no se crea en la parte superior del módulo superior para el pin eth_mdio, otras conexiones pueden no tener una conexión de búfer ["/home/chase/workspace/EthernetTest/src/top.v":3]

¿Qué está causando esto y cómo puedo solucionarlo? ¿Cómo puedo pasar un inout a través de la jerarquía?

    
pregunta chasep255

2 respuestas

2

Pensé que había usado un puerto bidireccional dentro de una jerarquía, pero para estar 100% seguro de que probé un ejemplo simple.

Ese ejemplo pasó síntesis en Vivado sin ningún problema. Sin embargo, es posible que pase porque el código es tan trivial. Quién sabe qué idiosincrasias tiene la herramienta de síntesis de Vivado. Esto fue lo que funcionó para mí:

module bidir_top  (
   input         clk,
   output         I,
   input          set_in,
   inout          pad 
);

bidir bidir_0 (
   .clk     (clk),
   .I       (I),     //<
   .set_in  (set_in),//<
   .pad     (pad)    //X
); // bidir

endmodule // bidir_top  

module bidir (
  input  clk,
  output I,
  input  set_in,
  inout  pad
  );
reg [1:0] cnt;
  always @(posedge clk)
     cnt <= cnt + 2'b01;  

  assign pad = set_in ? 1'bz : cnt[1];
  assign  I  = pad;

endmodule  // bidir 

Puedes intentar que la expresión de tres estados sea lo más básica posible, como se muestra arriba. Tal vez eso funcione.

La alternativa es hacer una señal de triple estado o de lectura / escritura y pasar las tres señales (In, Out, Tri) a la parte superior y ahí tienes que hacer tus pads de E / S.

    
respondido por el Oldfart
0

Como @Oldfart dijo,

  

Alternativa es hacer una señal de triple estado o de lectura / escritura y pasar las tres señales (In, Out, Tri) a la parte superior y ahí tienes que hacer tus pads de E / S.

Esta es mi recomendación. Maneje todos los estados tri en el nivel superior si es posible (siempre uso los anillos IO). Sin embargo, es posible que no pueda hacer esto (fácilmente, es decir, sin editar) si reutiliza un componente / módulo que tiene bidirects en los puertos, y en ese caso, solía haber (probablemente todavía hay) una configuración en síntesis para "push all tristates" (los empuja al nivel superior).

Entonces, si no puedes codificarlo de tal manera que las tristates estén "en la parte superior", puedes al menos, con esa configuración evitar cualquier problema de mapeo / PAR ... por último, sabía que no había estados internos. en un FPGA, y probablemente la razón por la que recibió su error.

    
respondido por el CapnJJ

Lea otras preguntas en las etiquetas