Para la síntesis, cada bloque always @(posedge clk)
debe seguir el patrón de un flip-flop D, de lo contrario, la herramienta de síntesis no lo reconocerá. Entonces, el problema es que tiene dos condiciones en las que necesita cambiar el valor del registro (temp), pero temp solo puede tener un controlador. Este problema empeora aún más cuando tiene dos dominios de reloj diferentes (como en su ejemplo, clk1 y clk2).
Fundamentalmente, no puede tener un flip-flop en dos dominios de reloj diferentes, por lo que la herramienta de síntesis no sabe si el flip-flop temp
debe ser cronometrado por clk1 o clk2. Por eso este código no se puede sintetizar: no hay manera de implementar este diseño en hardware.
Cruzar dos dominios de reloj diferentes es complicado, en tu ejemplo tendrías que dividir temp en clk1_temp y clk2_temp,
// clock domain clk1
reg clk1_temp;
wire clk1_tempClear;
wire clk1_tempSet;
// clock domain clk2
reg clk2_temp;
wire clk2_tempClear;
wire clk2_tempSet;
// clock domain clk1
always @(posedge clk1) begin
if (clk1_tempClear) begin
clk1_temp <= 0;
end;
if (clk1_tempSet) begin
clk1_temp <= 1;
end;
end
// clock domain clk2
always @(posedge clk2) begin
if (clk2_tempClear) begin
clk2_temp <= 0;
end;
if (clk2_tempSet) begin
clk2_temp <= 1;
end;
end
Ahora tienes dos flip flops separados, uno está cronometrado por clk1 y las unidades clk1_temp, el otro flip-flop está cronometrado por clk2 y las unidades clk2_temp.
En el uso práctico, generalmente hay muchas señales que tienen que pasar de un dominio de reloj a otro. Ver mi respuesta sobre el cruce de dominios de reloj: fpga verilog dual access