Greg ofrece la forma habitual de realizar la función que solicitas:
always @(posedge clk)
begin
out1 <= in1 + in2;
out2 <= in3 * in4;
end
La pregunta ahora es, ¿por qué la gente lo hace de esta manera y no de la forma en que se te ocurrió?
Primero, recuerda que Verilog está destinado a describir hardware. No da una secuencia de pasos para ejecutarse uno tras otro como lo hace un lenguaje de programación de computadora común. Lo que el código anterior describe es algo como esto:
Apesardenoincluirin1
yin2
enlalistadesensibilidad,dehecho,loquesucedeesquecadavezqueunadeesasseñalescambia,lapartesumadoradelcircuitocambiarásuvalor.Sinembargo,laseñaldesalidanombradaout1
solocambiasuvalorcuandoocurreeleventoposedgeclk
.
DebidoalaformaenqueloselementosfuncionanenlalógicaCMOS,seconsumemuypocaenergíaenestecircuitoamenosquecambieunadelasentradas.Porlotanto,nodebepreocuparseporminimizarlasoperacionesinnecesariasenesacuenta.
Ahoraveamossuversiónsugerida:
always@(posedgeclkand(in1orin2))beginout1=in1+in2;end
Lógicamente,estoespedirquenosecambienlassalidasamenosqueocurrauneventoposedgeclk
exactamentealmismotiempoqueuneventoin1
oin2
.Loqueconstituye"exactamente el mismo tiempo" tendría que ser definido por una peculiaridad de su simulador (significaría que los eventos suceden exactamente en el mismo paso de tiempo de simulación), o su hardware (la capacidad de algún circuito para distinguir un pequeño incremento de hora). Como tal, sería muy difícil para el simulador predecir la salida de la lógica sintetizada, por lo que no sería un estilo de codificación que recomendaría.
Lo que probablemente querrás hacer es esperar un evento in1
o in2
, luego esperar el borde del reloj. Esto puede, de hecho, ser codificado:
always @(in1 or in2)
begin
@(posedge clk);
out1 <= in1 + in2;
end
Sin embargo, no es probable que se sintetice, ya que no es obvio qué tipo de circuito podría ignorar más cambios en in1
y in2
mientras espera el límite del reloj (¿algún tipo de bloqueo, tal vez?) Si asume in1
y in2
no cambian más de una vez por ciclo de reloj, entonces la salida será idéntica a la forma habitual (código de Greg).