¿Cómo eliminar el error en la siguiente declaración verilog mientras se ejecuta para el simulador ise?

2

Escribí algunas líneas de código y está dando error. El código está abajo:

module tb();  
wire [7:0] m1,m2,m3;   
reg [7:0] a,b,c;   
reg en;     
reg clka=0;   
s_three call(m1,m2,m3,a,b,c,en,clka);   
always begin   
 #10 clka<=~clka;        
end      

initial begin    
en<=1'b1;    
a<=8'h00;   
b<=8'haf;   
c<=8'ha2;   
end     
endmodule           
module s_three(m1,m2,m3,a,b,c,en,clka);                                              
input [7:0] a,b,c;                       
input en,clka;                            
output [7:0] m1,m2,m3;               
wire [7:0] m11,m12;                          
s1 s0(m11,m12,a,b,en,clka);                      
endmodule         

El error que se muestra a continuación:

  

ERROR: HDLCompiler: 329 - "tb.v" Línea 29. Asignación concurrente a un   no-net a no está permitido

     

ERROR: Simulador: 778 - Elaboración estática del diseño Verilog de nivel superior   La (s) unidad (es) en el trabajo de biblioteca falló

¿Cómo puedo resolverlo?
Gracias

    
pregunta Shine_flower

1 respuesta

4

Bien, entonces, lo que está sucediendo es que ha declarado su módulo como este:

module s_three(m1,m2,m3,a,b,c,en,clka);                                              
input [7:0] a,b,c;                       
input en,clka;                            
output [7:0] m1,m2,m3;               
wire [7:0] m11,m12;

Ahora puede esperar que los puertos estén conectados en el orden en que aparecen entre corchetes, pero en realidad no es así, deben conectarse en el orden en que están declarados por las líneas input ... , output ... , es decir, el orden de conexión implícito para su módulo será:

s_three call(a,b,c,en,clk,m1,m2,m3)

Como resultado, estás conectando tus puertos de una manera que no esperas, lo que puede provocar errores graciosos. En este caso, las salidas están conectadas a las entradas, el registro c está conectado a una salida (¡mal!), Etc.

La conexión implícita de puertos es un dolor de cabeza de depuración y, aunque ahorra un poco de escritura, debería evitarlo por su propia cordura cuando se trata de probar cosas. Además, si desea agregar un nuevo puerto, o cambiarlos más adelante, cualquier cosa que esté conectada implícitamente se romperá.

Para resolver el problema, debes usar conexiones explícitas. Por ejemplo, lo siguiente conecta explícitamente los pines:

s_three call(.m1(m1),.m2(m2),.m3(m3),.a(a),.b(b),.c(c),.en(en),.clka(clk));   

Las conexiones se describen como: .portInModule(signalToConnect) . Al hacerlo de esta manera no importa en qué orden aparezcan. Esto funcionaría igual de bien:

s_three call(.clka(clk),.en(en),.a(a),.b(b),.c(c),.m1(m1),.m2(m2),.m3(m3));   
    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas