Verilog: ¿el puerto de entrada de creación de instancias no está conectado en el diseño de nivel superior pero el diseño está funcionando?

0

Quiero convertir un diseño de verilog en vhdl pero encontré un módulo de verilog que no veo forma de convertirlo, porque el diseño en sí no tiene sentido para mí. La entidad del módulo es el siguiente fragmento de código:

module fifo_mst_dpath (

  // inputs
 input                fifoRstn,
 input                fifoClk,
 input                latch_clk,
 input [31:0]         tc_data,
 input [3:0]          tc_be,
 input                tc_rxf_n,
 input                tc_txe_n,
 input                snd_cmd,
 input [3:0]          bus_cmd,
 input [31:0]         tx_data,
 input [3:0]          tx_be,
 input [2:0]          ep_num,


 // outputs
 output reg [31:0]   tp_data,
 output reg [3:0]    tp_be,
 output reg          rx_rxf_n,
 output reg          rx_txe_n,
 output reg [31:0]   rx_data,
 output reg [3:0]    rx_be
);

La entrada latch_clk controla la siguiente lógica:

 always @(latch_clk or tc_data)
    if (~latch_clk)
       rx_data <= tc_data; 

 always @(latch_clk or tc_be)
    if (~latch_clk)
        rx_be <= tc_be; 

 always @(latch_clk or tc_rxf_n)
    if (~latch_clk)
        rx_rxf_n <= tc_rxf_n; 

 always @(latch_clk or tc_txe_n)
    if (~latch_clk)
        rx_txe_n <= tc_txe_n; 


 endmodule

El problema ahora es que el diseño de nivel superior crea una instancia de fifo_mst_dpath sin conectar el puerto de entrada latch_clk:

  fifo_mst_dpath i_fifo_mst_dpath (
    // inputs
   .fifoRstn(tm_rstn),
   .fifoClk(fifoClk),
   .tc_data(tc_data),
   .tc_be(tc_be),
   .tc_txe_n(tc_txe_n),
   .tc_rxf_n(tc_rxf_n),
   .snd_cmd(snd_cmd),
   .bus_cmd(bus_cmd),
   .tx_data(tx_data),
   .tx_be(all_m_wr_be),
   .ep_num(t_ep_num),
   // outputs 
   .tp_data(tp_data),
   .tp_be(tp_be),
   .rx_txe_n(rx_txe_n),
   .rx_rxf_n(rx_rxf_n),
   .rx_data(rx_data),
   .rx_be(rx_be)
  );

La simulación del diseño con esta configuración (falta latch_clk) siempre dará como resultado rx_be="XXXX", rx_data="XXXXXXX" y así sucesivamente. Pero estas señales se usan en el diseño para otra lógica y el diseño en sí mismo cuando se sintetice funcionará. ¿Me pueden ayudar a entender este problema? ¿Me estoy perdiendo de algo? ¿Cómo se puede convertir esto a vhdl? Gracias.

    
pregunta hendrik2k1

1 respuesta

2

Dos cosas:

  1. ¿Está seguro de que este diseño original del módulo Verilog está terminado y se espera que funcione correctamente?
  2. Si la entrada del módulo no está conectada, el compilador puede vincularlo a un nivel lógico específico y todos los circuitos relacionados con él se eliminarán durante la optimización.

La simulación espera que definas todas las señales de entrada; por lo tanto, si hay alguna 'X' en la ecuación, la señal resultante será 'X'. Intente forzar este latch_clk como 0 y observe el resultado.

Actualizar:

  

He mirado todos los mensajes. Pero, por favor, dime, ¿qué hará el código (latch_clk o tc_data) en la lista de sensibilidad? No puedo escribir (latch_clk, tc_data). ¿Es el OR en este caso realmente necesario?

Si cambian su estado, el circuito se "activa". Por qué OR está allí y por qué latch_clk tiene lugar, pregunte al desarrollador del código. Como dije, si el compilador ve que alguna señal tiene un valor predeterminado, el compilador simplemente elimina esta señal sustituyendo una constante, por lo tanto, obtiene 0 or tc_data (con 0 nunca disparándose), por lo tanto, solo se optimiza para tc_data y if(~latch_clk) siendo if(~0) o if(1) , por lo tanto, siempre será verdadero.

    
respondido por el Anonymous

Lea otras preguntas en las etiquetas