Ejecutar el módulo uno tras otro usando el estado de marca

1

Quiero ejecutar 2 módulos, uno tras otro con una señal de señalización

¿Qué cambios debo hacer en el código a continuación para los módulos? He usado delay_4 y multiplicar.

module iir_model(yout,temp1,win,clk);
  input  [3:0] win;
  output [3:0] yout;
  wire   [3:0] yout;
  input        clk;
  output [3:0] temp1;
  wire   [3:0] temp1;

  delay_4      a1(temp1,win,clk);
  multiply_4  (yout,win,temp1);
endmodule

delay_4:

module delay_4(data_out,data_in,clk);
  input [3:0] data_in;
  input clk;
  output [3:0] data_out;

  reg [3:0] data_out;
  reg [2:0] counter=4'b000;
  reg [3:0] temp;
  reg carry;

  integer i=0;

  always @(posedge clk)
  begin 
    i=i+1;
    if(i==1)
      temp=data_in;
    if(i>1)
    begin
      if(counter!=4'b100)
      begin
        carry=temp[0];
        temp=temp>>1'b1;
        temp[3]=carry;
        $monitor ($time," clk=%b,  counter=%b ,temp=%b ,carry=%b,data_out=%b",clk, counter,temp,carry,data_out);
        counter=counter+1;
      end
      data_out=(temp==data_in)?temp:4'b0000;
    end
  end
endmodule

multiplicar_4:

module multiply_4(z,x,y);
  input  [3:0] x,y;
  output [7:0] z;
  reg    [7:0] t;
  reg    [7:0] z;

  integer i,j;
  always @ (x or y)
  begin
    z = 8'b0;
    for(i = 0; i < 4 ; i = i + 1)
    begin
      t = 8'b0;
      if(y[i])
      begin
        t[i]   = x[0];
        t[i+1] = x[1]; 
        t[i+2] = x[2];
        t[i+3] = x[3];
      end
      z = z + t;
    end
  end 
endmodule
    
pregunta Shreyas Patel

2 respuestas

2

En Verilog, las cosas no se ejecutan una tras otra, se ejecutan en paralelo. Si desea incluir los resultados de un módulo en las entradas de otro (es decir, una tubería), simplemente cree los cables y conéctelos a las entradas y salidas apropiadas.

Ni siquiera soy un Verilogger razonable, por lo que no puedo ver de inmediato cuál es su problema, pero puede ser útil usar asociación asociada nombrada en lugar de posicional para hacer el cableado, ya que es más fácil ver errores en el orden de puertos que manera.

    
respondido por el Martin Thompson
2

Algunos punteros para ayudarlo a refactorizar el código para detectar los problemas más rápidamente.

Cuando se publican ejemplos de código, a menudo es bueno mantenerlos al mínimo y, en la práctica, escribir menos para usted.

Me gustaría refactorizar lo siguiente:

module delay_4(data_out,data_in,clk);
  input [3:0] data_in;
  input clk;
  output [3:0] data_out;

  reg [3:0] data_out;

a:

module delay_4(
  input      [3:0] data_in,
  input            clk,
  output reg [3:0] data_out,
);

Si no lo hace, al menos mantenga las definiciones de puerto en el mismo orden que en la lista de puertos original; de lo contrario, se vuelve bastante confuso leerlo, ayúdenos a ayudarlo.

También siempre tendría un reinicio que iba junto con el reloj. Yo instanciamos flip-flops como:

always @(posedge clk or negedge reset_n) begin
  if(~reset_n) begin
    //reset 
  end
  else begin
    //<= next_value
  end
end

En el bloque always @(posedge clk) , por lo general, deberías usar la asignación no bloqueante <= ; de lo contrario, puedes terminar con el simulador para las discrepancias de hardware, que son bastante difíciles de depurar.

Como @Martin Thompson ha dicho que las conexiones con nombre ayudan a la depuración, agregue comentarios que muestren la dirección de los puntos adicionales.

delay_4      a1(temp1,win,clk);
multiply_4  (yout,win,temp1); 

se convertiría en:
NB: a multiply_4 le falta un nombre de instanciación

delay_4      a1(
  .data_out(temp1), //output  [3:0]
  .data_in (win  ), //input   [3:0]
  .clk     (clk  )  //input
);
multiply_4  multiply_4_0 (
  .z       (yout ), //output [7:0]
  .x       (win  ), //input  [3:0]
  .y       (temp1)  //input  [3:0]
);
    
respondido por el pre_randomize

Lea otras preguntas en las etiquetas